From 2b6f4c28260fc4cdb4489fe2d5deb4838aacc805 Mon Sep 17 00:00:00 2001 From: aitbc Date: Wed, 13 May 2026 09:32:53 +0200 Subject: [PATCH] refactor: add rate limiting to agent coordinator routers - Added Request parameter to all endpoint functions in agents.py, ai.py, alerts.py, auth.py, and consensus.py - Added @rate_limit decorator to all endpoints with appropriate limits: - Write operations (POST/PUT/DELETE): 50 requests per 60 seconds - Read operations (GET): 200 requests per 60 seconds - High-frequency operations (heartbeat, token refresh): 100 requests per 60 seconds - Renamed conflicting request parameters (request -> request_http, request_status) --- .../src/app/routers/agents.py | 28 +- apps/agent-coordinator/src/app/routers/ai.py | 58 ++- .../src/app/routers/alerts.py | 26 +- .../agent-coordinator/src/app/routers/auth.py | 29 +- .../src/app/routers/consensus.py | 43 ++- .../src/app/routers/health.py | 9 +- .../src/app/routers/messages.py | 65 +++- .../src/app/routers/monitor.py | 19 +- .../src/app/routers/monitoring.py | 12 +- .../src/app/routers/swarm.py | 51 ++- .../src/app/routers/tasks.py | 28 +- .../src/app/routers/users.py | 35 +- .../src/app/routers/agent_creativity.py | 27 +- .../app/routers/agent_integration_router.py | 33 +- .../src/app/routers/agent_performance.py | 37 +- .../src/app/routers/agent_router.py | 32 +- .../src/app/routers/agent_security_router.py | 40 +- .../src/app/routers/services.py | 31 +- .../src/aitbc_chain/rpc/router.py | 145 +++++-- .../DOMAIN_REFACTORING_PLAN.md | 358 ++++++++++++++++++ .../src/app/contexts/advanced_ai/__init__.py | 1 + .../contexts/advanced_ai/domain/__init__.py | 1 + .../contexts/advanced_ai/routers/__init__.py | 1 + .../routers/adaptive_learning_health.py | 4 +- .../contexts/advanced_ai/services/__init__.py | 1 + .../contexts/advanced_ai/storage/__init__.py | 1 + .../src/app/contexts/advanced_rl/__init__.py | 1 + .../contexts/advanced_rl/domain/__init__.py | 1 + .../contexts/advanced_rl/routers/__init__.py | 1 + .../contexts/advanced_rl/services/__init__.py | 1 + .../services/advanced_rl/__init__.py | 0 .../services/advanced_rl/agents.py | 0 .../services/advanced_rl/agents/__init__.py | 0 .../services/advanced_rl/agents/ppo_agent.py | 0 .../advanced_rl/agents/rainbow_dqn_agent.py | 0 .../services/advanced_rl/agents/sac_agent.py | 0 .../advanced_rl/algorithms/__init__.py | 0 .../services/advanced_rl/engine.py | 0 .../advanced_rl/marketplace_optimizer.py | 0 .../contexts/advanced_rl/storage/__init__.py | 1 + .../contexts/agent_coordination/__init__.py | 1 + .../agent_coordination/domain/__init__.py | 1 + .../agent_coordination/routers/__init__.py | 1 + .../routers/agent_creativity.py | 6 +- .../routers/agent_integration_router.py | 10 +- .../routers/agent_performance.py | 6 +- .../routers/agent_router.py | 8 +- .../agent_coordination}/routers/swarm.py | 0 .../agent_coordination/services/__init__.py | 1 + .../agent_coordination/storage/__init__.py | 1 + .../src/app/contexts/ai_analytics/__init__.py | 1 + .../contexts/ai_analytics/domain/__init__.py | 1 + .../contexts/ai_analytics/routers/__init__.py | 1 + .../ai_analytics/services/__init__.py | 1 + .../services/ai_analytics/__init__.py | 0 .../ai_analytics/adaptive_learning.py | 0 .../ai_analytics/advanced_learning.py | 0 .../services/ai_analytics/analytics.py | 0 .../services/ai_analytics/surveillance.py | 0 .../services/ai_analytics/trading_engine.py | 0 .../contexts/ai_analytics/storage/__init__.py | 1 + .../src/app/contexts/analytics/__init__.py | 1 + .../app/contexts/analytics/domain/__init__.py | 1 + .../contexts/analytics/routers/__init__.py | 1 + .../analytics}/routers/analytics.py | 6 +- .../contexts/analytics/services/__init__.py | 1 + .../analytics}/services/advanced_analytics.py | 0 .../services/performance_monitoring.py | 0 .../contexts/analytics/storage/__init__.py | 1 + .../src/app/contexts/bounty/__init__.py | 1 + .../app/contexts/bounty/domain/__init__.py | 1 + .../app/contexts/bounty/routers/__init__.py | 1 + .../{ => contexts/bounty}/routers/bounty.py | 16 +- .../app/contexts/bounty/services/__init__.py | 1 + .../app/contexts/bounty/storage/__init__.py | 1 + .../app/contexts/certification/__init__.py | 1 + .../contexts/certification/domain/__init__.py | 1 + .../certification/routers/__init__.py | 1 + .../certification}/routers/certification.py | 6 +- .../certification/services/__init__.py | 1 + .../services/certification/__init__.py | 0 .../services/certification/badge_system.py | 0 .../certification/certification_system.py | 0 .../certification/partnership_manager.py | 0 .../services/certification/service.py | 0 .../certification/storage/__init__.py | 1 + .../src/app/contexts/community/__init__.py | 1 + .../app/contexts/community/domain/__init__.py | 1 + .../contexts/community/routers/__init__.py | 1 + .../community}/routers/community.py | 16 +- .../contexts/community/services/__init__.py | 1 + .../contexts/community/storage/__init__.py | 1 + .../src/app/contexts/confidential/__init__.py | 1 + .../contexts/confidential/domain/__init__.py | 1 + .../contexts/confidential/routers/__init__.py | 1 + .../confidential}/routers/confidential.py | 10 +- .../confidential/services/__init__.py | 1 + .../contexts/confidential/storage/__init__.py | 1 + .../src/app/contexts/cross_chain/__init__.py | 1 + .../contexts/cross_chain/domain/__init__.py | 1 + .../contexts/cross_chain/routers/__init__.py | 1 + .../routers/cross_chain_integration.py | 0 .../contexts/cross_chain/services/__init__.py | 1 + .../services/cross_chain/__init__.py | 0 .../services/cross_chain/bridge.py | 0 .../services/cross_chain/bridge_enhanced.py | 0 .../services/cross_chain/reputation.py | 0 .../contexts/cross_chain/storage/__init__.py | 1 + .../contexts/developer_platform/__init__.py | 1 + .../developer_platform/domain/__init__.py | 1 + .../developer_platform/routers/__init__.py | 1 + .../routers/developer_platform.py | 18 +- .../developer_platform/services/__init__.py | 1 + .../developer_platform/storage/__init__.py | 1 + .../src/app/contexts/ecosystem/__init__.py | 1 + .../app/contexts/ecosystem/domain/__init__.py | 1 + .../contexts/ecosystem/routers/__init__.py | 1 + .../ecosystem}/routers/ecosystem_dashboard.py | 8 +- .../contexts/ecosystem/services/__init__.py | 1 + .../contexts/ecosystem/storage/__init__.py | 1 + .../enterprise_integration/__init__.py | 1 + .../enterprise_integration/domain/__init__.py | 1 + .../routers/__init__.py | 1 + .../routers/partners.py | 2 +- .../services/__init__.py | 1 + .../storage/__init__.py | 1 + .../src/app/contexts/governance/__init__.py | 1 + .../contexts/governance/domain/__init__.py | 1 + .../contexts/governance/routers/__init__.py | 1 + .../governance}/routers/governance.py | 14 +- .../routers/governance_enhanced.py | 6 +- .../contexts/governance/services/__init__.py | 1 + .../services/dao_governance_service.py | 6 +- .../services/governance_service.py | 2 +- .../contexts/governance/storage/__init__.py | 1 + .../app/contexts/gpu_multimodal/__init__.py | 1 + .../gpu_multimodal/domain/__init__.py | 1 + .../gpu_multimodal/routers/__init__.py | 1 + .../routers/gpu_multimodal_health.py | 2 +- .../gpu_multimodal/services/__init__.py | 1 + .../gpu_multimodal/storage/__init__.py | 1 + .../src/app/contexts/hermes/__init__.py | 1 + .../app/contexts/hermes/domain/__init__.py | 1 + .../app/contexts/hermes/routers/__init__.py | 1 + .../hermes}/routers/hermes_enhanced.py | 8 +- .../hermes}/routers/hermes_enhanced_app.py | 0 .../hermes}/routers/hermes_enhanced_health.py | 4 +- .../hermes}/routers/hermes_enhanced_simple.py | 6 +- .../app/contexts/hermes/services/__init__.py | 1 + .../hermes}/services/hermes_enhanced.py | 4 +- .../services/hermes_enhanced_simple.py | 0 .../app/contexts/hermes/storage/__init__.py | 1 + .../app/contexts/infrastructure/__init__.py | 1 + .../infrastructure/domain/__init__.py | 1 + .../infrastructure/routers/__init__.py | 1 + .../infrastructure}/routers/monitor.py | 0 .../routers/monitoring_dashboard.py | 0 .../infrastructure/services/__init__.py | 1 + .../infrastructure/storage/__init__.py | 1 + .../src/app/contexts/multimodal/__init__.py | 1 + .../contexts/multimodal/domain/__init__.py | 1 + .../contexts/multimodal/routers/__init__.py | 1 + .../routers/modality_optimization_health.py | 2 +- .../multimodal}/routers/multi_modal_rl.py | 0 .../multimodal}/routers/multimodal_health.py | 4 +- .../contexts/multimodal/services/__init__.py | 1 + .../services/modality_optimization.py | 0 .../services/multi_modal_fusion/__init__.py | 0 .../multi_modal_fusion/fusion_engine.py | 0 .../multi_modal_fusion/neural_modules.py | 0 .../multimodal}/services/multimodal_agent.py | 0 .../contexts/multimodal/storage/__init__.py | 1 + .../src/app/contexts/reputation/__init__.py | 1 + .../contexts/reputation/domain/__init__.py | 1 + .../contexts/reputation/routers/__init__.py | 1 + .../reputation}/routers/reputation.py | 6 +- .../contexts/reputation/services/__init__.py | 1 + .../services/reputation_service.py | 2 +- .../contexts/reputation/storage/__init__.py | 1 + .../src/app/contexts/rewards/__init__.py | 1 + .../app/contexts/rewards/domain/__init__.py | 1 + .../app/contexts/rewards/routers/__init__.py | 1 + .../{ => contexts/rewards}/routers/rewards.py | 6 +- .../app/contexts/rewards/services/__init__.py | 1 + .../rewards}/services/reward_service.py | 4 +- .../app/contexts/rewards/storage/__init__.py | 1 + .../src/app/contexts/security/__init__.py | 1 + .../app/contexts/security/domain/__init__.py | 1 + .../app/contexts/security/routers/__init__.py | 1 + .../routers/agent_security_router.py | 8 +- .../contexts/security/services/__init__.py | 1 + .../security}/services/access_control.py | 0 .../security}/services/encryption.py | 0 .../security}/services/hsm_key_manager.py | 0 .../security}/services/key_management.py | 0 .../security}/services/kyc_aml_providers.py | 0 .../security}/services/quota_enforcement.py | 0 .../services/trading_surveillance.py | 0 .../app/contexts/security/storage/__init__.py | 1 + .../src/app/contexts/settlement/__init__.py | 1 + .../contexts/settlement/domain/__init__.py | 1 + .../contexts/settlement/routers/__init__.py | 1 + .../settlement}/routers/settlement.py | 2 +- .../contexts/settlement/services/__init__.py | 1 + .../contexts/settlement/storage/__init__.py | 1 + .../src/app/contexts/staking/__init__.py | 1 + .../app/contexts/staking/domain/__init__.py | 1 + .../app/contexts/staking/routers/__init__.py | 1 + .../{ => contexts/staking}/routers/staking.py | 16 +- .../app/contexts/staking/services/__init__.py | 1 + .../staking}/services/staking_service.py | 2 +- .../app/contexts/staking/storage/__init__.py | 1 + .../src/app/contexts/trading/__init__.py | 1 + .../app/contexts/trading/domain/__init__.py | 1 + .../app/contexts/trading/routers/__init__.py | 1 + .../{ => contexts/trading}/routers/trading.py | 6 +- .../app/contexts/trading/services/__init__.py | 1 + .../services/trading_marketplace/__init__.py | 0 .../services/trading_marketplace/amm.py | 0 .../trading_marketplace/bid_strategy.py | 0 .../trading_marketplace/dynamic_pricing.py | 0 .../trading_marketplace/gpu_optimizer.py | 0 .../services/trading_marketplace/trading.py | 0 .../app/contexts/trading/storage/__init__.py | 1 + .../app/contexts/zk_applications/__init__.py | 1 + .../zk_applications/domain/__init__.py | 1 + .../zk_applications/routers/__init__.py | 1 + .../zk_applications}/routers/ml_zk_proofs.py | 4 +- .../routers/zk_applications.py | 4 +- .../zk_applications/services/__init__.py | 1 + .../zk_applications/storage/__init__.py | 1 + .../src/app/routers/__init__.py | 113 +++++- .../src/app/routers/exchange.py | 53 ++- apps/coordinator-api/src/app/routers/miner.py | 27 +- .../exchange/complete_cross_chain_exchange.py | 8 + apps/exchange/multichain_exchange_api.py | 8 + apps/pool-hub/src/app/routers/health.py | 13 +- apps/pool-hub/src/app/routers/jobs.py | 13 +- apps/pool-hub/src/app/routers/miners.py | 17 +- apps/pool-hub/src/app/routers/pools.py | 17 +- apps/wallet/src/app/api_rest.py | 150 ++++---- docs/ROADMAP.md | 25 +- 242 files changed, 1540 insertions(+), 369 deletions(-) create mode 100644 apps/coordinator-api/DOMAIN_REFACTORING_PLAN.md create mode 100644 apps/coordinator-api/src/app/contexts/advanced_ai/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/advanced_ai/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/advanced_ai/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/advanced_ai}/routers/adaptive_learning_health.py (98%) create mode 100644 apps/coordinator-api/src/app/contexts/advanced_ai/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/advanced_ai/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/advanced_rl/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/advanced_rl/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/advanced_rl/routers/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/advanced_rl/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/advanced_rl}/services/advanced_rl/__init__.py (100%) rename apps/coordinator-api/src/app/{ => contexts/advanced_rl}/services/advanced_rl/agents.py (100%) rename apps/coordinator-api/src/app/{ => contexts/advanced_rl}/services/advanced_rl/agents/__init__.py (100%) rename apps/coordinator-api/src/app/{ => contexts/advanced_rl}/services/advanced_rl/agents/ppo_agent.py (100%) rename apps/coordinator-api/src/app/{ => contexts/advanced_rl}/services/advanced_rl/agents/rainbow_dqn_agent.py (100%) rename apps/coordinator-api/src/app/{ => contexts/advanced_rl}/services/advanced_rl/agents/sac_agent.py (100%) rename apps/coordinator-api/src/app/{ => contexts/advanced_rl}/services/advanced_rl/algorithms/__init__.py (100%) rename apps/coordinator-api/src/app/{ => contexts/advanced_rl}/services/advanced_rl/engine.py (100%) rename apps/coordinator-api/src/app/{ => contexts/advanced_rl}/services/advanced_rl/marketplace_optimizer.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/advanced_rl/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/agent_coordination/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/agent_coordination/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/agent_coordination/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/agent_coordination}/routers/agent_creativity.py (97%) rename apps/coordinator-api/src/app/{ => contexts/agent_coordination}/routers/agent_integration_router.py (98%) rename apps/coordinator-api/src/app/{ => contexts/agent_coordination}/routers/agent_performance.py (99%) rename apps/coordinator-api/src/app/{ => contexts/agent_coordination}/routers/agent_router.py (98%) rename apps/coordinator-api/src/app/{ => contexts/agent_coordination}/routers/swarm.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/agent_coordination/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/agent_coordination/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/ai_analytics/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/ai_analytics/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/ai_analytics/routers/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/ai_analytics/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/ai_analytics}/services/ai_analytics/__init__.py (100%) rename apps/coordinator-api/src/app/{ => contexts/ai_analytics}/services/ai_analytics/adaptive_learning.py (100%) rename apps/coordinator-api/src/app/{ => contexts/ai_analytics}/services/ai_analytics/advanced_learning.py (100%) rename apps/coordinator-api/src/app/{ => contexts/ai_analytics}/services/ai_analytics/analytics.py (100%) rename apps/coordinator-api/src/app/{ => contexts/ai_analytics}/services/ai_analytics/surveillance.py (100%) rename apps/coordinator-api/src/app/{ => contexts/ai_analytics}/services/ai_analytics/trading_engine.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/ai_analytics/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/analytics/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/analytics/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/analytics/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/analytics}/routers/analytics.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/analytics/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/analytics}/services/advanced_analytics.py (100%) rename apps/coordinator-api/src/app/{ => contexts/analytics}/services/performance_monitoring.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/analytics/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/bounty/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/bounty/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/bounty/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/bounty}/routers/bounty.py (98%) create mode 100644 apps/coordinator-api/src/app/contexts/bounty/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/bounty/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/certification/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/certification/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/certification/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/certification}/routers/certification.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/certification/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/certification}/services/certification/__init__.py (100%) rename apps/coordinator-api/src/app/{ => contexts/certification}/services/certification/badge_system.py (100%) rename apps/coordinator-api/src/app/{ => contexts/certification}/services/certification/certification_system.py (100%) rename apps/coordinator-api/src/app/{ => contexts/certification}/services/certification/partnership_manager.py (100%) rename apps/coordinator-api/src/app/{ => contexts/certification}/services/certification/service.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/certification/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/community/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/community/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/community/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/community}/routers/community.py (98%) create mode 100644 apps/coordinator-api/src/app/contexts/community/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/community/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/confidential/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/confidential/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/confidential/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/confidential}/routers/confidential.py (98%) create mode 100644 apps/coordinator-api/src/app/contexts/confidential/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/confidential/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/cross_chain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/cross_chain/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/cross_chain/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/cross_chain}/routers/cross_chain_integration.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/cross_chain/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/cross_chain}/services/cross_chain/__init__.py (100%) rename apps/coordinator-api/src/app/{ => contexts/cross_chain}/services/cross_chain/bridge.py (100%) rename apps/coordinator-api/src/app/{ => contexts/cross_chain}/services/cross_chain/bridge_enhanced.py (100%) rename apps/coordinator-api/src/app/{ => contexts/cross_chain}/services/cross_chain/reputation.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/cross_chain/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/developer_platform/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/developer_platform/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/developer_platform/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/developer_platform}/routers/developer_platform.py (98%) create mode 100644 apps/coordinator-api/src/app/contexts/developer_platform/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/developer_platform/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/ecosystem/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/ecosystem/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/ecosystem/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/ecosystem}/routers/ecosystem_dashboard.py (98%) create mode 100644 apps/coordinator-api/src/app/contexts/ecosystem/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/ecosystem/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/enterprise_integration/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/enterprise_integration/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/enterprise_integration/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/enterprise_integration}/routers/partners.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/enterprise_integration/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/enterprise_integration/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/governance/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/governance/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/governance/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/governance}/routers/governance.py (93%) rename apps/coordinator-api/src/app/{ => contexts/governance}/routers/governance_enhanced.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/governance/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/governance}/services/dao_governance_service.py (96%) rename apps/coordinator-api/src/app/{ => contexts/governance}/services/governance_service.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/governance/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/gpu_multimodal/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/gpu_multimodal/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/gpu_multimodal/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/gpu_multimodal}/routers/gpu_multimodal_health.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/gpu_multimodal/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/gpu_multimodal/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/hermes/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/hermes/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/hermes/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/hermes}/routers/hermes_enhanced.py (98%) rename apps/coordinator-api/src/app/{ => contexts/hermes}/routers/hermes_enhanced_app.py (100%) rename apps/coordinator-api/src/app/{ => contexts/hermes}/routers/hermes_enhanced_health.py (98%) rename apps/coordinator-api/src/app/{ => contexts/hermes}/routers/hermes_enhanced_simple.py (98%) create mode 100644 apps/coordinator-api/src/app/contexts/hermes/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/hermes}/services/hermes_enhanced.py (98%) rename apps/coordinator-api/src/app/{ => contexts/hermes}/services/hermes_enhanced_simple.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/hermes/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/infrastructure/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/infrastructure/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/infrastructure/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/infrastructure}/routers/monitor.py (100%) rename apps/coordinator-api/src/app/{ => contexts/infrastructure}/routers/monitoring_dashboard.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/infrastructure/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/infrastructure/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/multimodal/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/multimodal/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/multimodal/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/multimodal}/routers/modality_optimization_health.py (99%) rename apps/coordinator-api/src/app/{ => contexts/multimodal}/routers/multi_modal_rl.py (100%) rename apps/coordinator-api/src/app/{ => contexts/multimodal}/routers/multimodal_health.py (98%) create mode 100644 apps/coordinator-api/src/app/contexts/multimodal/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/multimodal}/services/modality_optimization.py (100%) rename apps/coordinator-api/src/app/{ => contexts/multimodal}/services/multi_modal_fusion/__init__.py (100%) rename apps/coordinator-api/src/app/{ => contexts/multimodal}/services/multi_modal_fusion/fusion_engine.py (100%) rename apps/coordinator-api/src/app/{ => contexts/multimodal}/services/multi_modal_fusion/neural_modules.py (100%) rename apps/coordinator-api/src/app/{ => contexts/multimodal}/services/multimodal_agent.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/multimodal/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/reputation/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/reputation/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/reputation/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/reputation}/routers/reputation.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/reputation/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/reputation}/services/reputation_service.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/reputation/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/rewards/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/rewards/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/rewards/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/rewards}/routers/rewards.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/rewards/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/rewards}/services/reward_service.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/rewards/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/security/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/security/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/security/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/security}/routers/agent_security_router.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/security/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/security}/services/access_control.py (100%) rename apps/coordinator-api/src/app/{ => contexts/security}/services/encryption.py (100%) rename apps/coordinator-api/src/app/{ => contexts/security}/services/hsm_key_manager.py (100%) rename apps/coordinator-api/src/app/{ => contexts/security}/services/key_management.py (100%) rename apps/coordinator-api/src/app/{ => contexts/security}/services/kyc_aml_providers.py (100%) rename apps/coordinator-api/src/app/{ => contexts/security}/services/quota_enforcement.py (100%) rename apps/coordinator-api/src/app/{ => contexts/security}/services/trading_surveillance.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/security/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/settlement/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/settlement/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/settlement/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/settlement}/routers/settlement.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/settlement/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/settlement/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/staking/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/staking/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/staking/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/staking}/routers/staking.py (98%) create mode 100644 apps/coordinator-api/src/app/contexts/staking/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/staking}/services/staking_service.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/staking/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/trading/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/trading/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/trading/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/trading}/routers/trading.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/trading/services/__init__.py rename apps/coordinator-api/src/app/{ => contexts/trading}/services/trading_marketplace/__init__.py (100%) rename apps/coordinator-api/src/app/{ => contexts/trading}/services/trading_marketplace/amm.py (100%) rename apps/coordinator-api/src/app/{ => contexts/trading}/services/trading_marketplace/bid_strategy.py (100%) rename apps/coordinator-api/src/app/{ => contexts/trading}/services/trading_marketplace/dynamic_pricing.py (100%) rename apps/coordinator-api/src/app/{ => contexts/trading}/services/trading_marketplace/gpu_optimizer.py (100%) rename apps/coordinator-api/src/app/{ => contexts/trading}/services/trading_marketplace/trading.py (100%) create mode 100644 apps/coordinator-api/src/app/contexts/trading/storage/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/zk_applications/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/zk_applications/domain/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/zk_applications/routers/__init__.py rename apps/coordinator-api/src/app/{ => contexts/zk_applications}/routers/ml_zk_proofs.py (98%) rename apps/coordinator-api/src/app/{ => contexts/zk_applications}/routers/zk_applications.py (99%) create mode 100644 apps/coordinator-api/src/app/contexts/zk_applications/services/__init__.py create mode 100644 apps/coordinator-api/src/app/contexts/zk_applications/storage/__init__.py diff --git a/apps/agent-coordinator/src/app/routers/agents.py b/apps/agent-coordinator/src/app/routers/agents.py index f69467a8..cb2dfa0b 100644 --- a/apps/agent-coordinator/src/app/routers/agents.py +++ b/apps/agent-coordinator/src/app/routers/agents.py @@ -2,7 +2,8 @@ from datetime import datetime, timezone from typing import Any, Dict, List, Optional from aitbc import get_logger -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response +from aitbc.rate_limiting import rate_limit +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Request, Response from fastapi.responses import JSONResponse from .. import state @@ -25,7 +26,10 @@ router = APIRouter() # Agent registration @router.post("/agents/register") -async def register_agent(request: AgentRegistrationRequest): +@rate_limit(rate=50, per=60) +async def register_agent( + request_http: Request, request: AgentRegistrationRequest +): """Register a new agent""" try: if not state.agent_registry: @@ -65,7 +69,10 @@ async def register_agent(request: AgentRegistrationRequest): # Agent discovery @router.post("/agents/discover") -async def discover_agents(query: Dict[str, Any]): +@rate_limit(rate=200, per=60) +async def discover_agents( + request: Request, query: Dict[str, Any] +): """Discover agents based on criteria""" try: if not state.agent_registry: @@ -87,7 +94,10 @@ async def discover_agents(query: Dict[str, Any]): # Get agent by ID @router.get("/agents/{agent_id}") -async def get_agent(agent_id: str): +@rate_limit(rate=200, per=60) +async def get_agent( + request: Request, agent_id: str +): """Get agent information by ID""" try: if not state.agent_registry: @@ -112,7 +122,10 @@ async def get_agent(agent_id: str): # Update agent status @router.put("/agents/{agent_id}/status") -async def update_agent_status(agent_id: str, request: AgentStatusUpdate): +@rate_limit(rate=50, per=60) +async def update_agent_status( + request: Request, agent_id: str, request_status: AgentStatusUpdate +): """Update agent status""" try: if not state.agent_registry: @@ -143,7 +156,10 @@ async def update_agent_status(agent_id: str, request: AgentStatusUpdate): # Agent heartbeat @router.post("/agents/{agent_id}/heartbeat") -async def agent_heartbeat(agent_id: str): +@rate_limit(rate=100, per=60) +async def agent_heartbeat( + request: Request, agent_id: str +): """Receive heartbeat from agent""" try: if not state.agent_registry: diff --git a/apps/agent-coordinator/src/app/routers/ai.py b/apps/agent-coordinator/src/app/routers/ai.py index b3f96484..003f20ed 100644 --- a/apps/agent-coordinator/src/app/routers/ai.py +++ b/apps/agent-coordinator/src/app/routers/ai.py @@ -2,7 +2,8 @@ from datetime import datetime, timezone from typing import Any, Dict, List, Optional from aitbc import get_logger -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response +from aitbc.rate_limiting import rate_limit +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Request, Response from fastapi.responses import JSONResponse from .. import state @@ -25,7 +26,10 @@ router = APIRouter() # Advanced AI/ML endpoints @router.post("/ai/learning/experience") -async def record_learning_experience(experience_data: Dict[str, Any]): +@rate_limit(rate=50, per=60) +async def record_learning_experience( + request: Request, experience_data: Dict[str, Any] +): """Record a learning experience for the AI system""" try: result = await learning_system.record_experience(experience_data) @@ -35,7 +39,10 @@ async def record_learning_experience(experience_data: Dict[str, Any]): raise HTTPException(status_code=500, detail=str(e)) @router.get("/ai/learning/statistics") -async def get_learning_statistics(): +@rate_limit(rate=200, per=60) +async def get_learning_statistics( + request: Request +): """Get learning system statistics""" try: result = await learning_system.get_learning_statistics() @@ -45,7 +52,10 @@ async def get_learning_statistics(): raise HTTPException(status_code=500, detail=str(e)) @router.post("/ai/learning/predict") -async def predict_performance(context: Dict[str, Any], action: str = Query(...)): +@rate_limit(rate=100, per=60) +async def predict_performance( + request: Request, context: Dict[str, Any], action: str = Query(...) +): """Predict performance for a given action""" try: result = await learning_system.predict_performance(context, action) @@ -55,7 +65,10 @@ async def predict_performance(context: Dict[str, Any], action: str = Query(...)) raise HTTPException(status_code=500, detail=str(e)) @router.post("/ai/learning/recommend") -async def recommend_action(context: Dict[str, Any], available_actions: List[str]): +@rate_limit(rate=100, per=60) +async def recommend_action( + request: Request, context: Dict[str, Any], available_actions: List[str] +): """Get AI-recommended action""" try: result = await learning_system.recommend_action(context, available_actions) @@ -65,7 +78,10 @@ async def recommend_action(context: Dict[str, Any], available_actions: List[str] raise HTTPException(status_code=500, detail=str(e)) @router.post("/ai/neural-network/create") -async def create_neural_network(config: Dict[str, Any]): +@rate_limit(rate=50, per=60) +async def create_neural_network( + request: Request, config: Dict[str, Any] +): """Create a new neural network""" try: result = await ai_integration.create_neural_network(config) @@ -75,7 +91,10 @@ async def create_neural_network(config: Dict[str, Any]): raise HTTPException(status_code=500, detail=str(e)) @router.post("/ai/neural-network/{network_id}/train") -async def train_neural_network(network_id: str, training_data: List[Dict[str, Any]], epochs: int = 100): +@rate_limit(rate=50, per=60) +async def train_neural_network( + request: Request, network_id: str, training_data: List[Dict[str, Any]], epochs: int = 100 +): """Train a neural network""" try: result = await ai_integration.train_neural_network(network_id, training_data, epochs) @@ -85,7 +104,10 @@ async def train_neural_network(network_id: str, training_data: List[Dict[str, An raise HTTPException(status_code=500, detail=str(e)) @router.post("/ai/neural-network/{network_id}/predict") -async def predict_with_neural_network(network_id: str, features: List[float]): +@rate_limit(rate=100, per=60) +async def predict_with_neural_network( + request: Request, network_id: str, features: List[float] +): """Make prediction with neural network""" try: result = await ai_integration.predict_with_neural_network(network_id, features) @@ -95,7 +117,10 @@ async def predict_with_neural_network(network_id: str, features: List[float]): raise HTTPException(status_code=500, detail=str(e)) @router.post("/ai/ml-model/create") -async def create_ml_model(config: Dict[str, Any]): +@rate_limit(rate=50, per=60) +async def create_ml_model( + request: Request, config: Dict[str, Any] +): """Create a new ML model""" try: result = await ai_integration.create_ml_model(config) @@ -105,7 +130,10 @@ async def create_ml_model(config: Dict[str, Any]): raise HTTPException(status_code=500, detail=str(e)) @router.post("/ai/ml-model/{model_id}/train") -async def train_ml_model(model_id: str, training_data: List[Dict[str, Any]]): +@rate_limit(rate=50, per=60) +async def train_ml_model( + request: Request, model_id: str, training_data: List[Dict[str, Any]] +): """Train an ML model""" try: result = await ai_integration.train_ml_model(model_id, training_data) @@ -115,7 +143,10 @@ async def train_ml_model(model_id: str, training_data: List[Dict[str, Any]]): raise HTTPException(status_code=500, detail=str(e)) @router.post("/ai/ml-model/{model_id}/predict") -async def predict_with_ml_model(model_id: str, features: List[float]): +@rate_limit(rate=100, per=60) +async def predict_with_ml_model( + request: Request, model_id: str, features: List[float] +): """Make prediction with ML model""" try: result = await ai_integration.predict_with_ml_model(model_id, features) @@ -125,7 +156,10 @@ async def predict_with_ml_model(model_id: str, features: List[float]): raise HTTPException(status_code=500, detail=str(e)) @router.get("/ai/statistics") -async def get_ai_statistics(): +@rate_limit(rate=200, per=60) +async def get_ai_statistics( + request: Request +): """Get comprehensive AI/ML statistics""" try: result = await ai_integration.get_ai_statistics() diff --git a/apps/agent-coordinator/src/app/routers/alerts.py b/apps/agent-coordinator/src/app/routers/alerts.py index 9d97ed9d..5199e298 100644 --- a/apps/agent-coordinator/src/app/routers/alerts.py +++ b/apps/agent-coordinator/src/app/routers/alerts.py @@ -2,7 +2,8 @@ from datetime import datetime, timezone from typing import Any, Dict, List, Optional from aitbc import get_logger -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response +from aitbc.rate_limiting import rate_limit +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Request, Response from fastapi.responses import JSONResponse from .. import state @@ -25,7 +26,9 @@ router = APIRouter() # Alerting endpoints @router.get("/alerts") +@rate_limit(rate=200, per=60) async def get_alerts( + request: Request, status: Optional[str] = None, current_user: Dict[str, Any] = Depends(get_current_user) ): @@ -52,7 +55,9 @@ async def get_alerts( raise HTTPException(status_code=500, detail=str(e)) @router.post("/alerts/{alert_id}/resolve") +@rate_limit(rate=50, per=60) async def resolve_alert( + request: Request, alert_id: str, current_user: Dict[str, Any] = Depends(get_current_user) ): @@ -72,7 +77,10 @@ async def resolve_alert( raise HTTPException(status_code=500, detail=str(e)) @router.get("/alerts/stats") -async def get_alert_stats(current_user: Dict[str, Any] = Depends(get_current_user)): +@rate_limit(rate=200, per=60) +async def get_alert_stats( + request: Request, current_user: Dict[str, Any] = Depends(get_current_user) +): """Get alert statistics""" try: if not permission_manager.has_permission(current_user["user_id"], Permission.SECURITY_VIEW): @@ -92,7 +100,10 @@ async def get_alert_stats(current_user: Dict[str, Any] = Depends(get_current_use raise HTTPException(status_code=500, detail=str(e)) @router.get("/alerts/rules") -async def get_alert_rules(current_user: Dict[str, Any] = Depends(get_current_user)): +@rate_limit(rate=200, per=60) +async def get_alert_rules( + request: Request, current_user: Dict[str, Any] = Depends(get_current_user) +): """Get alert rules""" try: if not permission_manager.has_permission(current_user["user_id"], Permission.SECURITY_VIEW): @@ -114,7 +125,9 @@ async def get_alert_rules(current_user: Dict[str, Any] = Depends(get_current_use # SLA monitoring endpoints @router.get("/sla") +@rate_limit(rate=200, per=60) async def get_sla_status( + request: Request, sla_id: Optional[str] = None, current_user: Dict[str, Any] = Depends(get_current_user) ): @@ -140,7 +153,9 @@ async def get_sla_status( raise HTTPException(status_code=500, detail=str(e)) @router.post("/sla/{sla_id}/record") +@rate_limit(rate=50, per=60) async def record_sla_metric( + request: Request, sla_id: str, value: float, current_user: Dict[str, Any] = Depends(get_current_user) @@ -167,7 +182,10 @@ async def record_sla_metric( # System status endpoint with monitoring @router.get("/system/status") -async def get_system_status(current_user: Dict[str, Any] = Depends(get_current_user)): +@rate_limit(rate=200, per=60) +async def get_system_status( + request: Request, current_user: Dict[str, Any] = Depends(get_current_user) +): """Get comprehensive system status""" try: if not permission_manager.has_permission(current_user["user_id"], Permission.SYSTEM_HEALTH): diff --git a/apps/agent-coordinator/src/app/routers/auth.py b/apps/agent-coordinator/src/app/routers/auth.py index e82d5f9d..fcb12ba5 100644 --- a/apps/agent-coordinator/src/app/routers/auth.py +++ b/apps/agent-coordinator/src/app/routers/auth.py @@ -2,7 +2,8 @@ from datetime import datetime, timezone from typing import Any, Dict, List, Optional from aitbc import get_logger -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response +from aitbc.rate_limiting import rate_limit +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Request, Response from fastapi.responses import JSONResponse from .. import state @@ -25,7 +26,10 @@ router = APIRouter() # Authentication endpoints @router.post("/auth/login") -async def login(login_data: Dict[str, str]): +@rate_limit(rate=50, per=60) +async def login( + request: Request, login_data: Dict[str, str] +): """User login with username and password""" try: username = login_data.get("username") @@ -96,7 +100,10 @@ async def login(login_data: Dict[str, str]): raise HTTPException(status_code=500, detail=str(e)) @router.post("/auth/refresh") -async def refresh_token(refresh_data: Dict[str, str]): +@rate_limit(rate=100, per=60) +async def refresh_token( + request: Request, refresh_data: Dict[str, str] +): """Refresh access token using refresh token""" try: refresh_token = refresh_data.get("refresh_token") @@ -118,7 +125,10 @@ async def refresh_token(refresh_data: Dict[str, str]): raise HTTPException(status_code=500, detail=str(e)) @router.post("/auth/validate") -async def validate_token(validate_data: Dict[str, str]): +@rate_limit(rate=200, per=60) +async def validate_token( + request: Request, validate_data: Dict[str, str] +): """Validate JWT token""" try: token = validate_data.get("token") @@ -140,8 +150,10 @@ async def validate_token(validate_data: Dict[str, str]): raise HTTPException(status_code=500, detail=str(e)) @router.post("/auth/api-key/generate") +@rate_limit(rate=50, per=60) async def generate_api_key( - user_id: str, + request: Request, + user_id: str, permissions: List[str] = None, current_user: Dict[str, Any] = Depends(get_current_user) ): @@ -162,7 +174,10 @@ async def generate_api_key( raise HTTPException(status_code=500, detail=str(e)) @router.post("/auth/api-key/validate") -async def validate_api_key(api_key: str): +@rate_limit(rate=200, per=60) +async def validate_api_key( + request: Request, api_key: str +): """Validate API key""" try: result = api_key_manager.validate_api_key(api_key) @@ -179,7 +194,9 @@ async def validate_api_key(api_key: str): raise HTTPException(status_code=500, detail=str(e)) @router.delete("/auth/api-key/{api_key}") +@rate_limit(rate=50, per=60) async def revoke_api_key( + request: Request, api_key: str, current_user: Dict[str, Any] = Depends(get_current_user) ): diff --git a/apps/agent-coordinator/src/app/routers/consensus.py b/apps/agent-coordinator/src/app/routers/consensus.py index f7e1db5e..dbd5b8ec 100644 --- a/apps/agent-coordinator/src/app/routers/consensus.py +++ b/apps/agent-coordinator/src/app/routers/consensus.py @@ -2,7 +2,8 @@ from datetime import datetime, timezone from typing import Any, Dict, List, Optional from aitbc import get_logger -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response +from aitbc.rate_limiting import rate_limit +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Request, Response from fastapi.responses import JSONResponse from .. import state @@ -25,7 +26,10 @@ router = APIRouter() # Distributed consensus endpoints @router.post("/consensus/node/register") -async def register_consensus_node(node_data: Dict[str, Any]): +@rate_limit(rate=50, per=60) +async def register_consensus_node( + request: Request, node_data: Dict[str, Any] +): """Register a node in the consensus network""" try: result = await distributed_consensus.register_node(node_data) @@ -35,7 +39,10 @@ async def register_consensus_node(node_data: Dict[str, Any]): raise HTTPException(status_code=500, detail="Failed to register consensus node") @router.post("/consensus/proposal/create") -async def create_consensus_proposal(proposal_data: Dict[str, Any]): +@rate_limit(rate=50, per=60) +async def create_consensus_proposal( + request: Request, proposal_data: Dict[str, Any] +): """Create a new consensus proposal""" try: result = await distributed_consensus.create_proposal(proposal_data) @@ -45,7 +52,10 @@ async def create_consensus_proposal(proposal_data: Dict[str, Any]): raise HTTPException(status_code=500, detail="Failed to create consensus proposal") @router.post("/consensus/proposal/{proposal_id}/vote") -async def cast_consensus_vote(proposal_id: str, node_id: str, vote: bool): +@rate_limit(rate=50, per=60) +async def cast_consensus_vote( + request: Request, proposal_id: str, node_id: str, vote: bool +): """Cast a vote for a proposal""" try: result = await distributed_consensus.cast_vote(proposal_id, node_id, vote) @@ -55,7 +65,10 @@ async def cast_consensus_vote(proposal_id: str, node_id: str, vote: bool): raise HTTPException(status_code=500, detail="Failed to cast consensus vote") @router.get("/consensus/proposal/{proposal_id}") -async def get_proposal_status(proposal_id: str): +@rate_limit(rate=200, per=60) +async def get_proposal_status( + request: Request, proposal_id: str +): """Get proposal status""" try: result = await distributed_consensus.get_proposal_status(proposal_id) @@ -65,7 +78,10 @@ async def get_proposal_status(proposal_id: str): raise HTTPException(status_code=500, detail="Failed to get proposal status") @router.put("/consensus/algorithm") -async def set_consensus_algorithm(algorithm: str = Query(..., description="Consensus algorithm")): +@rate_limit(rate=50, per=60) +async def set_consensus_algorithm( + request: Request, algorithm: str = Query(..., description="Consensus algorithm") +): """Set the consensus algorithm""" try: result = await distributed_consensus.set_consensus_algorithm(algorithm) @@ -75,7 +91,10 @@ async def set_consensus_algorithm(algorithm: str = Query(..., description="Conse raise HTTPException(status_code=500, detail="Failed to set consensus algorithm") @router.get("/consensus/statistics") -async def get_consensus_statistics(): +@rate_limit(rate=200, per=60) +async def get_consensus_statistics( + request: Request +): """Get consensus statistics""" try: result = await distributed_consensus.get_consensus_statistics() @@ -85,7 +104,10 @@ async def get_consensus_statistics(): raise HTTPException(status_code=500, detail="Failed to get consensus statistics") @router.put("/consensus/node/{node_id}/status") -async def update_node_status(node_id: str, is_active: bool): +@rate_limit(rate=50, per=60) +async def update_node_status( + request: Request, node_id: str, is_active: bool +): """Update node status""" try: result = await distributed_consensus.update_node_status(node_id, is_active) @@ -96,7 +118,10 @@ async def update_node_status(node_id: str, is_active: bool): # Advanced features status endpoint @router.get("/advanced-features/status") -async def get_advanced_features_status(): +@rate_limit(rate=200, per=60) +async def get_advanced_features_status( + request: Request +): """Get status of all advanced features""" try: learning_stats = await learning_system.get_learning_statistics() diff --git a/apps/agent-coordinator/src/app/routers/health.py b/apps/agent-coordinator/src/app/routers/health.py index cdb7ea82..dbc1847d 100644 --- a/apps/agent-coordinator/src/app/routers/health.py +++ b/apps/agent-coordinator/src/app/routers/health.py @@ -2,7 +2,8 @@ from datetime import datetime, timezone from typing import Any, Dict, List, Optional from aitbc import get_logger -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response +from aitbc.rate_limiting import rate_limit +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Request, Response from fastapi.responses import JSONResponse from .. import state @@ -25,7 +26,8 @@ router = APIRouter() # Health check endpoint @router.get("/health") -async def health_check(): +@rate_limit(rate=1000, per=60) +async def health_check(request: Request): """Health check endpoint""" return { "status": "healthy", @@ -36,7 +38,8 @@ async def health_check(): # Root endpoint @router.get("/") -async def root(): +@rate_limit(rate=1000, per=60) +async def root(request: Request): """Root endpoint with service information""" return { "service": "AITBC Agent Coordinator", diff --git a/apps/agent-coordinator/src/app/routers/messages.py b/apps/agent-coordinator/src/app/routers/messages.py index 7799f7f3..4d5447ea 100644 --- a/apps/agent-coordinator/src/app/routers/messages.py +++ b/apps/agent-coordinator/src/app/routers/messages.py @@ -3,7 +3,8 @@ from typing import Any, Dict, List, Optional import json from aitbc import get_logger -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response +from aitbc.rate_limiting import rate_limit +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Request, Response from fastapi.responses import JSONResponse from .. import state @@ -26,7 +27,10 @@ router = APIRouter() # Send message @router.post("/messages/send") -async def send_message(request: MessageRequest): +@rate_limit(rate=50, per=60) +async def send_message( + request_http: Request, request: MessageRequest +): """Send message to agent""" try: if not state.communication_manager: @@ -100,7 +104,10 @@ async def send_message(request: MessageRequest): # Broadcast message @router.post("/messages/broadcast") -async def broadcast_message(request: BroadcastRequest): +@rate_limit(rate=50, per=60) +async def broadcast_message( + request_http: Request, request: BroadcastRequest +): """Broadcast message to multiple agents""" try: if not state.communication_manager: @@ -191,7 +198,9 @@ async def broadcast_message(request: BroadcastRequest): # Get message history @router.get("/messages/history") +@rate_limit(rate=200, per=60) async def get_message_history( + request: Request, sender_id: Optional[str] = Query(None, description="Filter by sender ID"), receiver_id: Optional[str] = Query(None, description="Filter by receiver ID"), limit: int = Query(100, description="Maximum number of messages"), @@ -232,7 +241,10 @@ async def get_message_history( # Get specific message @router.get("/messages/{message_id}") -async def get_message(message_id: str): +@rate_limit(rate=200, per=60) +async def get_message( + request: Request, message_id: str +): """Get a specific message by ID""" try: if not state.message_storage: @@ -257,7 +269,10 @@ async def get_message(message_id: str): # Load balancer statistics @router.get("/load-balancer/stats") -async def get_load_balancer_stats(): +@rate_limit(rate=200, per=60) +async def get_load_balancer_stats( + request: Request +): """Get load balancer statistics""" try: if not state.load_balancer: @@ -277,7 +292,10 @@ async def get_load_balancer_stats(): # Registry statistics @router.get("/registry/stats") -async def get_registry_stats(): +@rate_limit(rate=200, per=60) +async def get_registry_stats( + request: Request +): """Get agent registry statistics""" try: if not state.agent_registry: @@ -297,7 +315,10 @@ async def get_registry_stats(): # Get agents by service @router.get("/agents/service/{service}") -async def get_agents_by_service(service: str): +@rate_limit(rate=200, per=60) +async def get_agents_by_service( + request: Request, service: str +): """Get agents that provide a specific service""" try: if not state.agent_registry: @@ -319,7 +340,10 @@ async def get_agents_by_service(service: str): # Get agents by capability @router.get("/agents/capability/{capability}") -async def get_agents_by_capability(capability: str): +@rate_limit(rate=200, per=60) +async def get_agents_by_capability( + request: Request, capability: str +): """Get agents that have a specific capability""" try: if not state.agent_registry: @@ -341,7 +365,10 @@ async def get_agents_by_capability(capability: str): # Set load balancing strategy @router.put("/load-balancer/strategy") -async def set_load_balancing_strategy(strategy: str = Query(..., description="Load balancing strategy")): +@rate_limit(rate=50, per=60) +async def set_load_balancing_strategy( + request: Request, strategy: str = Query(..., description="Load balancing strategy") +): """Set load balancing strategy""" try: if not state.load_balancer: @@ -369,7 +396,10 @@ async def set_load_balancing_strategy(strategy: str = Query(..., description="Lo # Peer management endpoints @router.post("/peers/add") -async def add_peer(agent_id: str = Query(..., description="Agent ID"), peer_id: str = Query(..., description="Peer agent ID")): +@rate_limit(rate=50, per=60) +async def add_peer( + request: Request, agent_id: str = Query(..., description="Agent ID"), peer_id: str = Query(..., description="Peer agent ID") +): """Add a peer connection for an agent""" try: from ..storage.message_storage import PeerStorage @@ -397,7 +427,10 @@ async def add_peer(agent_id: str = Query(..., description="Agent ID"), peer_id: raise HTTPException(status_code=500, detail=str(e)) @router.post("/peers/remove") -async def remove_peer(agent_id: str = Query(..., description="Agent ID"), peer_id: str = Query(..., description="Peer agent ID")): +@rate_limit(rate=50, per=60) +async def remove_peer( + request: Request, agent_id: str = Query(..., description="Agent ID"), peer_id: str = Query(..., description="Peer agent ID") +): """Remove a peer connection for an agent""" try: from ..storage.message_storage import PeerStorage @@ -425,7 +458,10 @@ async def remove_peer(agent_id: str = Query(..., description="Agent ID"), peer_i raise HTTPException(status_code=500, detail=str(e)) @router.get("/peers/{agent_id}") -async def get_agent_peers(agent_id: str): +@rate_limit(rate=200, per=60) +async def get_agent_peers( + request: Request, agent_id: str +): """Get all peers for a specific agent""" try: from ..storage.message_storage import PeerStorage @@ -450,7 +486,10 @@ async def get_agent_peers(agent_id: str): raise HTTPException(status_code=500, detail=str(e)) @router.get("/peers") -async def get_all_peers(): +@rate_limit(rate=200, per=60) +async def get_all_peers( + request: Request +): """Get all peer connections in the system""" try: from ..storage.message_storage import PeerStorage diff --git a/apps/agent-coordinator/src/app/routers/monitor.py b/apps/agent-coordinator/src/app/routers/monitor.py index 365232cf..b3a45ab2 100644 --- a/apps/agent-coordinator/src/app/routers/monitor.py +++ b/apps/agent-coordinator/src/app/routers/monitor.py @@ -1,13 +1,16 @@ """Monitor router for AITBC Agent Coordinator.""" -from fastapi import APIRouter +from fastapi import APIRouter, Request from typing import List, Dict +from aitbc.rate_limiting import rate_limit + router = APIRouter(tags=["Monitor"]) @router.get("/api/v1/dashboard", response_model=dict) -async def get_dashboard(): +@rate_limit(rate=1000, per=60) +async def get_dashboard(request: Request): """Get monitoring dashboard data.""" return { "overall_status": "operational", @@ -26,7 +29,8 @@ async def get_dashboard(): @router.get("/status", response_model=dict) -async def get_status(): +@rate_limit(rate=1000, per=60) +async def get_status(request: Request): """Get coordinator status.""" return { "status": "online", @@ -37,18 +41,21 @@ async def get_status(): @router.get("/miners", response_model=List[Dict]) -async def get_miners(): +@rate_limit(rate=500, per=60) +async def get_miners(request: Request): """Get miners list.""" return [] @router.get("/dashboard", response_model=List[Dict]) -async def get_history_dashboard(): +@rate_limit(rate=500, per=60) +async def get_history_dashboard(request: Request): """Get historical dashboard data.""" return [] @router.get("/jobs", response_model=List[Dict]) -async def get_jobs(): +@rate_limit(rate=500, per=60) +async def get_jobs(request: Request): """Get jobs list for history and metrics commands.""" return [] diff --git a/apps/agent-coordinator/src/app/routers/monitoring.py b/apps/agent-coordinator/src/app/routers/monitoring.py index 5cf4d391..f906eb51 100644 --- a/apps/agent-coordinator/src/app/routers/monitoring.py +++ b/apps/agent-coordinator/src/app/routers/monitoring.py @@ -2,7 +2,8 @@ from datetime import datetime, timezone from typing import Any, Dict, List, Optional from aitbc import get_logger -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response +from aitbc.rate_limiting import rate_limit +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Request, Response from fastapi.responses import JSONResponse from .. import state @@ -25,7 +26,8 @@ router = APIRouter() # Monitoring and metrics endpoints @router.get("/metrics") -async def get_prometheus_metrics(): +@rate_limit(rate=1000, per=60) +async def get_prometheus_metrics(request: Request): """Get metrics in Prometheus format""" try: metrics = metrics_registry.get_all_metrics() @@ -67,7 +69,8 @@ async def get_prometheus_metrics(): raise HTTPException(status_code=500, detail=str(e)) @router.get("/metrics/summary") -async def get_metrics_summary(): +@rate_limit(rate=500, per=60) +async def get_metrics_summary(request: Request): """Get metrics summary for dashboard""" try: summary = performance_monitor.get_performance_summary() @@ -92,7 +95,8 @@ async def get_metrics_summary(): raise HTTPException(status_code=500, detail=str(e)) @router.get("/metrics/health") -async def get_health_metrics(): +@rate_limit(rate=500, per=60) +async def get_health_metrics(request: Request): """Get health metrics for monitoring""" try: # Get system health metrics diff --git a/apps/agent-coordinator/src/app/routers/swarm.py b/apps/agent-coordinator/src/app/routers/swarm.py index 1ed8243f..ffae4bf3 100644 --- a/apps/agent-coordinator/src/app/routers/swarm.py +++ b/apps/agent-coordinator/src/app/routers/swarm.py @@ -1,9 +1,11 @@ """Swarm coordination router for AITBC Agent Coordinator.""" from typing import List, Optional -from fastapi import APIRouter, Query +from fastapi import APIRouter, Query, Request from pydantic import BaseModel +from aitbc.rate_limiting import rate_limit + router = APIRouter(prefix="/swarm", tags=["Swarm"]) @@ -47,7 +49,9 @@ class ConsensusRequest(BaseModel): @router.get("/list", response_model=List[SwarmInfo]) +@rate_limit(rate=200, per=60) async def list_swarms( + request: Request, swarm_id: Optional[str] = Query(None, description="Filter by swarm ID"), status: Optional[str] = Query(None, description="Filter by status"), limit: int = Query(20, description="Number of swarms to list") @@ -58,7 +62,10 @@ async def list_swarms( @router.post("/join", response_model=dict, status_code=201) -async def join_swarm(request: JoinRequest): +@rate_limit(rate=50, per=60) +async def join_swarm( + request_http: Request, request: JoinRequest +): """Join agent swarm for collective optimization.""" import uuid return { @@ -72,7 +79,10 @@ async def join_swarm(request: JoinRequest): @router.post("/coordinate", response_model=dict, status_code=202) -async def coordinate_swarm(request: CoordinateRequest): +@rate_limit(rate=50, per=60) +async def coordinate_swarm( + request_http: Request, request: CoordinateRequest +): """Coordinate swarm task execution.""" import uuid return { @@ -86,7 +96,10 @@ async def coordinate_swarm(request: CoordinateRequest): @router.get("/tasks/{task_id}/status", response_model=TaskStatus) -async def get_task_status(task_id: str): +@rate_limit(rate=200, per=60) +async def get_task_status( + request: Request, task_id: str +): """Get swarm task status.""" return { "task_id": task_id, @@ -98,7 +111,10 @@ async def get_task_status(task_id: str): @router.post("/{swarm_id}/leave", response_model=dict) -async def leave_swarm(swarm_id: str): +@rate_limit(rate=50, per=60) +async def leave_swarm( + request: Request, swarm_id: str +): """Leave swarm.""" return { "swarm_id": swarm_id, @@ -108,7 +124,10 @@ async def leave_swarm(swarm_id: str): @router.post("/tasks/{task_id}/consensus", response_model=dict) -async def achieve_consensus(task_id: str, request: ConsensusRequest): +@rate_limit(rate=50, per=60) +async def achieve_consensus( + request: Request, task_id: str, request_consensus: ConsensusRequest +): """Achieve swarm consensus on task result.""" return { "task_id": task_id, @@ -119,7 +138,10 @@ async def achieve_consensus(task_id: str, request: ConsensusRequest): @router.get("/api/v1/dashboard", response_model=dict) -async def get_dashboard(): +@rate_limit(rate=1000, per=60) +async def get_dashboard( + request: Request +): """Get monitoring dashboard data.""" return { "overall_status": "operational", @@ -138,7 +160,10 @@ async def get_dashboard(): @router.get("/status", response_model=dict) -async def get_status(): +@rate_limit(rate=1000, per=60) +async def get_status( + request: Request +): """Get coordinator status.""" return { "status": "online", @@ -149,12 +174,18 @@ async def get_status(): @router.get("/miners", response_model=list) -async def get_miners(): +@rate_limit(rate=500, per=60) +async def get_miners( + request: Request +): """Get miners list.""" return [] @router.get("/dashboard", response_model=list) -async def get_history_dashboard(): +@rate_limit(rate=500, per=60) +async def get_history_dashboard( + request: Request +): """Get historical dashboard data.""" return [] diff --git a/apps/agent-coordinator/src/app/routers/tasks.py b/apps/agent-coordinator/src/app/routers/tasks.py index 44b64da8..ebb23226 100644 --- a/apps/agent-coordinator/src/app/routers/tasks.py +++ b/apps/agent-coordinator/src/app/routers/tasks.py @@ -3,7 +3,8 @@ import uuid from typing import Any, Dict, List, Optional from aitbc import get_logger -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response +from aitbc.rate_limiting import rate_limit +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Request, Response from fastapi.responses import JSONResponse from .. import state @@ -26,7 +27,10 @@ router = APIRouter() # Submit task @router.post("/tasks/submit") -async def submit_task(request: TaskSubmission, background_tasks: BackgroundTasks): +@rate_limit(rate=50, per=60) +async def submit_task( + request_http: Request, request: TaskSubmission, background_tasks: BackgroundTasks +): """Submit a task for distribution""" try: if not state.task_distributor: @@ -61,7 +65,10 @@ async def submit_task(request: TaskSubmission, background_tasks: BackgroundTasks # Get task status @router.get("/tasks/status") -async def get_task_status(): +@rate_limit(rate=200, per=60) +async def get_task_status( + request: Request +): """Get task distribution statistics""" try: if not state.task_distributor: @@ -81,7 +88,10 @@ async def get_task_status(): # Task queue management @router.get("/tasks/queues") -async def get_queue_sizes(): +@rate_limit(rate=200, per=60) +async def get_queue_sizes( + request: Request +): """Get task queue sizes""" try: if not state.task_distributor: @@ -102,7 +112,10 @@ async def get_queue_sizes(): raise HTTPException(status_code=500, detail=str(e)) @router.post("/tasks/queues/{priority}/clear") -async def clear_queue(priority: str): +@rate_limit(rate=50, per=60) +async def clear_queue( + request: Request, priority: str +): """Clear a priority queue""" try: if not state.task_distributor: @@ -132,7 +145,10 @@ async def clear_queue(priority: str): raise HTTPException(status_code=500, detail=str(e)) @router.get("/tasks/queues/stats") -async def get_queue_stats(): +@rate_limit(rate=200, per=60) +async def get_queue_stats( + request: Request +): """Get detailed queue statistics""" try: if not state.task_distributor: diff --git a/apps/agent-coordinator/src/app/routers/users.py b/apps/agent-coordinator/src/app/routers/users.py index b828b228..565bfa25 100644 --- a/apps/agent-coordinator/src/app/routers/users.py +++ b/apps/agent-coordinator/src/app/routers/users.py @@ -2,7 +2,8 @@ from datetime import datetime, timezone from typing import Any, Dict, List, Optional from aitbc import get_logger -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response +from aitbc.rate_limiting import rate_limit +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Request, Response from fastapi.responses import JSONResponse from .. import state @@ -25,7 +26,9 @@ router = APIRouter() # User management endpoints @router.post("/users/{user_id}/role") +@rate_limit(rate=50, per=60) async def assign_user_role( + request: Request, user_id: str, role: str, current_user: Dict[str, Any] = Depends(get_current_user) @@ -52,7 +55,9 @@ async def assign_user_role( raise HTTPException(status_code=500, detail=str(e)) @router.get("/users/{user_id}/role") +@rate_limit(rate=200, per=60) async def get_user_role( + request: Request, user_id: str, current_user: Dict[str, Any] = Depends(get_current_user) ): @@ -73,7 +78,9 @@ async def get_user_role( raise HTTPException(status_code=500, detail=str(e)) @router.get("/users/{user_id}/permissions") +@rate_limit(rate=200, per=60) async def get_user_permissions( + request: Request, user_id: str, current_user: Dict[str, Any] = Depends(get_current_user) ): @@ -94,7 +101,9 @@ async def get_user_permissions( raise HTTPException(status_code=500, detail=str(e)) @router.post("/users/{user_id}/permissions/grant") +@rate_limit(rate=50, per=60) async def grant_user_permission( + request: Request, user_id: str, permission: str, current_user: Dict[str, Any] = Depends(get_current_user) @@ -121,7 +130,9 @@ async def grant_user_permission( raise HTTPException(status_code=500, detail=str(e)) @router.delete("/users/{user_id}/permissions/{permission}") +@rate_limit(rate=50, per=60) async def revoke_user_permission( + request: Request, user_id: str, permission: str, current_user: Dict[str, Any] = Depends(get_current_user) @@ -149,7 +160,10 @@ async def revoke_user_permission( # Role and permission management endpoints @router.get("/roles") -async def list_all_roles(current_user: Dict[str, Any] = Depends(get_current_user)): +@rate_limit(rate=200, per=60) +async def list_all_roles( + request: Request, current_user: Dict[str, Any] = Depends(get_current_user) +): """List all available roles and their permissions""" try: # Check if user has permission to view roles @@ -167,7 +181,9 @@ async def list_all_roles(current_user: Dict[str, Any] = Depends(get_current_user raise HTTPException(status_code=500, detail=str(e)) @router.get("/roles/{role}") +@rate_limit(rate=200, per=60) async def get_role_permissions( + request: Request, role: str, current_user: Dict[str, Any] = Depends(get_current_user) ): @@ -193,7 +209,10 @@ async def get_role_permissions( raise HTTPException(status_code=500, detail="Failed to get role permissions") @router.get("/auth/stats") -async def get_permission_stats(current_user: Dict[str, Any] = Depends(get_current_user)): +@rate_limit(rate=200, per=60) +async def get_permission_stats( + request: Request, current_user: Dict[str, Any] = Depends(get_current_user) +): """Get statistics about permissions and users""" try: # Check if user has permission to view security stats @@ -212,8 +231,11 @@ async def get_permission_stats(current_user: Dict[str, Any] = Depends(get_curren # Protected endpoint example @router.get("/protected/admin") +@rate_limit(rate=100, per=60) @require_role([Role.ADMIN]) -async def admin_only_endpoint(current_user: Dict[str, Any] = Depends(get_current_user)): +async def admin_only_endpoint( + request: Request, current_user: Dict[str, Any] = Depends(get_current_user) +): """Admin-only endpoint example""" return { "status": "success", @@ -228,8 +250,11 @@ async def admin_only_endpoint(current_user: Dict[str, Any] = Depends(get_current } @router.get("/protected/operator") +@rate_limit(rate=100, per=60) @require_role([Role.ADMIN, Role.OPERATOR]) -async def operator_endpoint(current_user: Dict[str, Any] = Depends(get_current_user)): +async def operator_endpoint( + request: Request, current_user: Dict[str, Any] = Depends(get_current_user) +): """Operator and admin endpoint example""" return { "status": "success", diff --git a/apps/agent-management/src/app/routers/agent_creativity.py b/apps/agent-management/src/app/routers/agent_creativity.py index e26a6811..251aca03 100755 --- a/apps/agent-management/src/app/routers/agent_creativity.py +++ b/apps/agent-management/src/app/routers/agent_creativity.py @@ -9,10 +9,11 @@ REST API for agent creativity enhancement, ideation, and cross-domain synthesis from typing import Any -from fastapi import APIRouter, Depends, HTTPException +from fastapi import APIRouter, Depends, HTTPException, Request from pydantic import BaseModel, Field from aitbc import get_logger +from aitbc.rate_limiting import rate_limit logger = get_logger(__name__) @@ -83,7 +84,10 @@ class SynthesisRequest(BaseModel): @router.post("/capabilities", response_model=CreativeCapabilityResponse) -async def create_creative_capability(request: CreativeCapabilityCreate, session: Annotated[Session, Depends(get_session)]) -> CreativeCapabilityResponse: +@rate_limit(rate=50, per=60) +async def create_creative_capability( + request_http: Request, request: CreativeCapabilityCreate, session: Annotated[Session, Depends(get_session)] +) -> CreativeCapabilityResponse: """Initialize a new creative capability for an agent""" engine = CreativityEnhancementEngine() @@ -104,7 +108,9 @@ async def create_creative_capability(request: CreativeCapabilityCreate, session: @router.post("/capabilities/{capability_id}/enhance") +@rate_limit(rate=50, per=60) async def enhance_creativity( + request_http: Request, capability_id: str, request: EnhanceCreativityRequest, session: Annotated[Session, Depends(get_session)] ) -> dict[str, Any]: """Enhance a specific creative capability using specified algorithm""" @@ -123,7 +129,9 @@ async def enhance_creativity( @router.post("/capabilities/{capability_id}/evaluate") +@rate_limit(rate=50, per=60) async def evaluate_creation( + request_http: Request, capability_id: str, request: EvaluateCreationRequest, session: Annotated[Session, Depends(get_session)] ) -> dict[str, Any]: """Evaluate a creative output and update agent capability metrics""" @@ -145,7 +153,10 @@ async def evaluate_creation( @router.post("/ideation/generate") -async def generate_ideas(request: IdeationRequest) -> dict[str, Any]: +@rate_limit(rate=50, per=60) +async def generate_ideas( + request_http: Request, request: IdeationRequest +) -> dict[str, Any]: """Generate innovative ideas using specialized ideation algorithms""" ideation_engine = IdeationAlgorithm() @@ -164,7 +175,10 @@ async def generate_ideas(request: IdeationRequest) -> dict[str, Any]: @router.post("/synthesis/cross-domain") -async def synthesize_cross_domain(request: SynthesisRequest, session: Annotated[Session, Depends(get_session)]) -> dict[str, Any]: +@rate_limit(rate=50, per=60) +async def synthesize_cross_domain( + request_http: Request, request: SynthesisRequest, session: Annotated[Session, Depends(get_session)] +) -> dict[str, Any]: """Synthesize concepts from multiple domains to create novel outputs""" integrator = CrossDomainCreativeIntegrator() @@ -185,7 +199,10 @@ async def synthesize_cross_domain(request: SynthesisRequest, session: Annotated[ @router.get("/capabilities/{agent_id}") -async def list_agent_creative_capabilities(agent_id: str, session: Annotated[Session, Depends(get_session)]) -> list[CreativeCapability]: +@rate_limit(rate=200, per=60) +async def list_agent_creative_capabilities( + request: Request, agent_id: str, session: Annotated[Session, Depends(get_session)] +) -> list[CreativeCapability]: """List all creative capabilities for a specific agent""" try: capabilities = session.execute(select(CreativeCapability).where(CreativeCapability.agent_id == agent_id)).all() diff --git a/apps/agent-management/src/app/routers/agent_integration_router.py b/apps/agent-management/src/app/routers/agent_integration_router.py index e1f6c329..4c0df876 100755 --- a/apps/agent-management/src/app/routers/agent_integration_router.py +++ b/apps/agent-management/src/app/routers/agent_integration_router.py @@ -5,9 +5,10 @@ Agent Integration and Deployment API Router for Verifiable AI Agent Orchestratio Provides REST API endpoints for production deployment and integration management """ -from fastapi import APIRouter, Depends, HTTPException +from fastapi import APIRouter, Depends, HTTPException, Request from aitbc import get_logger +from aitbc.rate_limiting import rate_limit logger = get_logger(__name__) @@ -31,7 +32,9 @@ router = APIRouter(prefix="/agents/integration", tags=["Agent Integration"]) @router.post("/deployments/config", response_model=AgentDeploymentConfig) +@rate_limit(rate=50, per=60) async def create_deployment_config( + request: Request, workflow_id: str, deployment_name: str, deployment_config: dict, @@ -65,7 +68,9 @@ async def create_deployment_config( @router.get("/deployments/configs", response_model=list[AgentDeploymentConfig]) +@rate_limit(rate=200, per=60) async def list_deployment_configs( + request: Request, workflow_id: str | None = None, status: DeploymentStatus | None = None, session: Session = Depends(Annotated[Session, Depends(get_session)]), @@ -99,7 +104,9 @@ async def list_deployment_configs( @router.get("/deployments/configs/{config_id}", response_model=AgentDeploymentConfig) +@rate_limit(rate=200, per=60) async def get_deployment_config( + request: Request, config_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -126,7 +133,9 @@ async def get_deployment_config( @router.post("/deployments/{config_id}/deploy") +@rate_limit(rate=50, per=60) async def deploy_workflow( + request: Request, config_id: str, target_environment: str = "production", session: Session = Depends(Annotated[Session, Depends(get_session)]), @@ -160,7 +169,9 @@ async def deploy_workflow( @router.get("/deployments/{config_id}/health") +@rate_limit(rate=200, per=60) async def get_deployment_health( + request: Request, config_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -190,7 +201,9 @@ async def get_deployment_health( @router.post("/deployments/{config_id}/scale") +@rate_limit(rate=50, per=60) async def scale_deployment( + request: Request, config_id: str, target_instances: int, session: Session = Depends(Annotated[Session, Depends(get_session)]), @@ -224,7 +237,9 @@ async def scale_deployment( @router.post("/deployments/{config_id}/rollback") +@rate_limit(rate=50, per=60) async def rollback_deployment( + request: Request, config_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -255,7 +270,9 @@ async def rollback_deployment( @router.get("/deployments/instances", response_model=list[AgentDeploymentInstance]) +@rate_limit(rate=200, per=60) async def list_deployment_instances( + request: Request, deployment_id: str | None = None, environment: str | None = None, status: DeploymentStatus | None = None, @@ -295,7 +312,9 @@ async def list_deployment_instances( @router.get("/deployments/instances/{instance_id}", response_model=AgentDeploymentInstance) +@rate_limit(rate=200, per=60) async def get_deployment_instance( + request: Request, instance_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -326,7 +345,9 @@ async def get_deployment_instance( @router.post("/integrations/zk/{execution_id}") +@rate_limit(rate=50, per=60) async def integrate_with_zk_system( + request: Request, execution_id: str, verification_level: VerificationLevel = VerificationLevel.BASIC, session: Session = Depends(Annotated[Session, Depends(get_session)]), @@ -360,7 +381,9 @@ async def integrate_with_zk_system( @router.get("/metrics/deployments/{deployment_id}") +@rate_limit(rate=200, per=60) async def get_deployment_metrics( + request: Request, deployment_id: str, time_range: str = "1h", session: Session = Depends(Annotated[Session, Depends(get_session)]), @@ -391,7 +414,9 @@ async def get_deployment_metrics( @router.post("/production/deploy") +@rate_limit(rate=50, per=60) async def deploy_to_production( + request: Request, workflow_id: str, deployment_config: dict, integration_config: dict | None = None, @@ -425,7 +450,9 @@ async def deploy_to_production( @router.get("/production/dashboard") +@rate_limit(rate=200, per=60) async def get_production_dashboard( + request: Request, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()) ) -> dict[str, Any]: """Get comprehensive production dashboard data""" @@ -479,7 +506,9 @@ async def get_production_dashboard( @router.get("/production/health") +@rate_limit(rate=200, per=60) async def get_production_health( + request: Request, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()) ) -> dict[str, Any]: """Get overall production health status""" @@ -549,7 +578,9 @@ async def get_production_health( @router.get("/production/alerts") +@rate_limit(rate=200, per=60) async def get_production_alerts( + request: Request, severity: str | None = None, limit: int = 50, current_user: str = Depends(require_admin_key()), diff --git a/apps/agent-management/src/app/routers/agent_performance.py b/apps/agent-management/src/app/routers/agent_performance.py index 9075dd75..37ecb806 100755 --- a/apps/agent-management/src/app/routers/agent_performance.py +++ b/apps/agent-management/src/app/routers/agent_performance.py @@ -10,10 +10,11 @@ REST API for meta-learning, resource optimization, and performance enhancement from datetime import datetime, timezone, timedelta from typing import Any, Dict, List, Optional -from fastapi import APIRouter, Depends, HTTPException, Query +from fastapi import APIRouter, Depends, HTTPException, Query, Request from pydantic import BaseModel, Field from aitbc import get_logger +from aitbc.rate_limiting import rate_limit logger = get_logger(__name__) @@ -176,7 +177,9 @@ class CapabilityResponse(BaseModel): @router.post("/profiles", response_model=PerformanceProfileResponse) +@rate_limit(rate=50, per=60) async def create_performance_profile( + request: Request, profile_request: PerformanceProfileRequest, session: Annotated[Session, Depends(get_session)] ) -> PerformanceProfileResponse: """Create agent performance profile""" @@ -214,7 +217,10 @@ async def create_performance_profile( @router.get("/profiles/{agent_id}", response_model=Dict[str, Any]) -async def get_performance_profile(agent_id: str, session: Annotated[Session, Depends(get_session)]) -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_performance_profile( + request: Request, agent_id: str, session: Annotated[Session, Depends(get_session)] +) -> Dict[str, Any]: """Get agent performance profile""" performance_service = AgentPerformanceService(session) @@ -235,7 +241,9 @@ async def get_performance_profile(agent_id: str, session: Annotated[Session, Dep @router.post("/profiles/{agent_id}/metrics") +@rate_limit(rate=50, per=60) async def update_performance_metrics( + request: Request, agent_id: str, metrics: Dict[str, float], session: Annotated[Session, Depends(get_session)], @@ -264,7 +272,9 @@ async def update_performance_metrics( @router.post("/meta-learning/models", response_model=MetaLearningResponse) +@rate_limit(rate=50, per=60) async def create_meta_learning_model( + request: Request, model_request: MetaLearningRequest, session: Annotated[Session, Depends(get_session)] ) -> MetaLearningResponse: """Create meta-learning model""" @@ -300,7 +310,9 @@ async def create_meta_learning_model( @router.post("/meta-learning/models/{model_id}/adapt") +@rate_limit(rate=50, per=60) async def adapt_model_to_task( + request: Request, model_id: str, task_data: Dict[str, Any], session: Annotated[Session, Depends(get_session)], @@ -330,7 +342,9 @@ async def adapt_model_to_task( @router.get("/meta-learning/models") +@rate_limit(rate=200, per=60) async def list_meta_learning_models( + request: Request, session: Annotated[Session, Depends(get_session)], status: Optional[str] = Query(default=None, description="Filter by status"), meta_strategy: Optional[str] = Query(default=None, description="Filter by meta strategy"), @@ -373,7 +387,9 @@ async def list_meta_learning_models( @router.post("/resources/allocate", response_model=ResourceAllocationResponse) +@rate_limit(rate=50, per=60) async def allocate_resources( + request: Request, allocation_request: ResourceAllocationRequest, session: Annotated[Session, Depends(get_session)] ) -> ResourceAllocationResponse: """Allocate resources for agent task""" @@ -408,7 +424,9 @@ async def allocate_resources( @router.get("/resources/{agent_id}") +@rate_limit(rate=200, per=60) async def get_resource_allocations( + request: Request, agent_id: str, session: Annotated[Session, Depends(get_session)], status: Optional[str] = Query(default=None, description="Filter by status"), @@ -453,7 +471,9 @@ async def get_resource_allocations( @router.post("/optimization/optimize", response_model=PerformanceOptimizationResponse) +@rate_limit(rate=50, per=60) async def optimize_performance( + request: Request, optimization_request: PerformanceOptimizationRequest, session: Annotated[Session, Depends(get_session)] ) -> PerformanceOptimizationResponse: """Optimize agent performance""" @@ -488,7 +508,9 @@ async def optimize_performance( @router.get("/optimization/{agent_id}") +@rate_limit(rate=200, per=60) async def get_optimization_history( + request: Request, agent_id: str, session: Annotated[Session, Depends(get_session)], status: Optional[str] = Query(default=None, description="Filter by status"), @@ -537,7 +559,9 @@ async def get_optimization_history( @router.post("/capabilities", response_model=CapabilityResponse) +@rate_limit(rate=50, per=60) async def create_capability( + request: Request, capability_request: CapabilityRequest, session: Annotated[Session, Depends(get_session)] ) -> CapabilityResponse: """Create agent capability""" @@ -580,7 +604,9 @@ async def create_capability( @router.get("/capabilities/{agent_id}") +@rate_limit(rate=200, per=60) async def get_agent_capabilities( + request: Request, agent_id: str, session: Annotated[Session, Depends(get_session)], capability_type: Optional[str] = Query(default=None, description="Filter by capability type"), @@ -631,7 +657,9 @@ async def get_agent_capabilities( @router.get("/analytics/performance-summary") +@rate_limit(rate=200, per=60) async def get_performance_summary( + request: Request, session: Annotated[Session, Depends(get_session)], agent_ids: List[str] = Query(default=[], description="List of agent IDs"), metric: Optional[str] = Query(default="overall_score", description="Metric to summarize"), @@ -713,7 +741,10 @@ def calculate_specialization_distribution(summaries: List[Dict[str, Any]]) -> Di @router.get("/health") -async def health_check() -> Dict[str, Any]: +@rate_limit(rate=1000, per=60) +async def health_check( + request: Request +) -> Dict[str, Any]: """Health check for agent performance service""" return { diff --git a/apps/agent-management/src/app/routers/agent_router.py b/apps/agent-management/src/app/routers/agent_router.py index 12e5371b..4dbfff3e 100755 --- a/apps/agent-management/src/app/routers/agent_router.py +++ b/apps/agent-management/src/app/routers/agent_router.py @@ -10,9 +10,10 @@ Provides REST API endpoints for agent workflow management and execution from datetime import datetime, timezone from typing import Any -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException +from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Request from aitbc import get_logger +from aitbc.rate_limiting import rate_limit logger = get_logger(__name__) @@ -35,7 +36,9 @@ router = APIRouter(tags=["AI Agents"]) @router.post("/workflows", response_model=AIAgentWorkflow) +@rate_limit(rate=50, per=60) async def create_workflow( + request: Request, workflow_data: AgentWorkflowCreate, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -58,7 +61,9 @@ async def create_workflow( @router.get("/workflows", response_model=list[AIAgentWorkflow]) +@rate_limit(rate=200, per=60) async def list_workflows( + request: Request, owner_id: str | None = None, is_public: bool | None = None, tags: list[str] | None = None, @@ -94,7 +99,9 @@ async def list_workflows( @router.get("/workflows/{workflow_id}", response_model=AIAgentWorkflow) +@rate_limit(rate=200, per=60) async def get_workflow( + request: Request, workflow_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -120,7 +127,9 @@ async def get_workflow( @router.put("/workflows/{workflow_id}", response_model=AIAgentWorkflow) +@rate_limit(rate=50, per=60) async def update_workflow( + request: Request, workflow_id: str, workflow_data: AgentWorkflowUpdate, session: Session = Depends(Annotated[Session, Depends(get_session)]), @@ -157,7 +166,9 @@ async def update_workflow( @router.delete("/workflows/{workflow_id}") +@rate_limit(rate=50, per=60) async def delete_workflow( + request: Request, workflow_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -187,7 +198,9 @@ async def delete_workflow( @router.post("/workflows/{workflow_id}/execute", response_model=AgentExecutionResponse) +@rate_limit(rate=50, per=60) async def execute_workflow( + request: Request, workflow_id: str, execution_request: AgentExecutionRequest, background_tasks: BackgroundTasks, @@ -233,7 +246,9 @@ async def execute_workflow( @router.get("/executions/{execution_id}/status", response_model=AgentExecutionStatus) +@rate_limit(rate=200, per=60) async def get_execution_status( + request: Request, execution_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -264,7 +279,9 @@ async def get_execution_status( @router.get("/executions", response_model=list[AgentExecutionStatus]) +@rate_limit(rate=200, per=60) async def list_executions( + request: Request, workflow_id: str | None = None, status: AgentStatus | None = None, limit: int = 50, @@ -325,7 +342,9 @@ async def list_executions( @router.post("/executions/{execution_id}/cancel") +@rate_limit(rate=50, per=60) async def cancel_execution( + request: Request, execution_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -365,7 +384,9 @@ async def cancel_execution( @router.get("/executions/{execution_id}/logs") +@rate_limit(rate=200, per=60) async def get_execution_logs( + request: Request, execution_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -423,13 +444,18 @@ async def get_execution_logs( @router.get("/test") -async def test_endpoint() -> dict[str, str]: +@rate_limit(rate=1000, per=60) +async def test_endpoint( + request: Request +) -> dict[str, str]: """Test endpoint to verify router is working""" return {"message": "Agent router is working", "timestamp": datetime.now(timezone.utc).isoformat()} @router.post("/networks", response_model=dict, status_code=201) +@rate_limit(rate=50, per=60) async def create_agent_network( + request: Request, network_data: dict, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -469,7 +495,9 @@ async def create_agent_network( @router.get("/executions/{execution_id}/receipt") +@rate_limit(rate=200, per=60) async def get_execution_receipt( + request: Request, execution_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), diff --git a/apps/agent-management/src/app/routers/agent_security_router.py b/apps/agent-management/src/app/routers/agent_security_router.py index d961bef9..9e65b56c 100755 --- a/apps/agent-management/src/app/routers/agent_security_router.py +++ b/apps/agent-management/src/app/routers/agent_security_router.py @@ -7,9 +7,13 @@ Agent Security API Router for Verifiable AI Agent Orchestration Provides REST API endpoints for security management and auditing """ -from fastapi import APIRouter, Depends, HTTPException +from datetime import datetime, timezone +from typing import Any + +from fastapi import APIRouter, Depends, HTTPException, Request from aitbc import get_logger +from aitbc.rate_limiting import rate_limit logger = get_logger(__name__) @@ -34,7 +38,9 @@ router = APIRouter(prefix="/agents/security", tags=["Agent Security"]) @router.post("/policies", response_model=AgentSecurityPolicy) +@rate_limit(rate=50, per=60) async def create_security_policy( + request: Request, name: str, description: str, security_level: SecurityLevel, @@ -59,7 +65,9 @@ async def create_security_policy( @router.get("/policies", response_model=list[AgentSecurityPolicy]) +@rate_limit(rate=200, per=60) async def list_security_policies( + request: Request, security_level: SecurityLevel | None = None, is_active: bool | None = None, session: Session = Depends(Annotated[Session, Depends(get_session)]), @@ -85,7 +93,9 @@ async def list_security_policies( @router.get("/policies/{policy_id}", response_model=AgentSecurityPolicy) +@rate_limit(rate=200, per=60) async def get_security_policy( + request: Request, policy_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -107,7 +117,9 @@ async def get_security_policy( @router.put("/policies/{policy_id}", response_model=AgentSecurityPolicy) +@rate_limit(rate=50, per=60) async def update_security_policy( + request: Request, policy_id: str, policy_updates: dict, session: Session = Depends(Annotated[Session, Depends(get_session)]), @@ -150,7 +162,9 @@ async def update_security_policy( @router.delete("/policies/{policy_id}") +@rate_limit(rate=50, per=60) async def delete_security_policy( + request: Request, policy_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -186,7 +200,9 @@ async def delete_security_policy( @router.post("/validate-workflow/{workflow_id}") +@rate_limit(rate=50, per=60) async def validate_workflow_security( + request: Request, workflow_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -215,7 +231,9 @@ async def validate_workflow_security( @router.get("/audit-logs", response_model=list[AgentAuditLog]) +@rate_limit(rate=200, per=60) async def list_audit_logs( + request: Request, event_type: AuditEventType | None = None, workflow_id: str | None = None, execution_id: str | None = None, @@ -267,7 +285,9 @@ async def list_audit_logs( @router.get("/audit-logs/{audit_id}", response_model=AgentAuditLog) +@rate_limit(rate=200, per=60) async def get_audit_log( + request: Request, audit_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -290,7 +310,9 @@ async def get_audit_log( @router.get("/trust-scores") +@rate_limit(rate=200, per=60) async def list_trust_scores( + request: Request, entity_type: str | None = None, entity_id: str | None = None, min_score: float | None = None, @@ -330,7 +352,9 @@ async def list_trust_scores( @router.get("/trust-scores/{entity_type}/{entity_id}", response_model=AgentTrustScore) +@rate_limit(rate=200, per=60) async def get_trust_score( + request: Request, entity_type: str, entity_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), @@ -360,7 +384,9 @@ async def get_trust_score( @router.post("/trust-scores/{entity_type}/{entity_id}/update") +@rate_limit(rate=50, per=60) async def update_trust_score( + request: Request, entity_type: str, entity_id: str, execution_success: bool, @@ -409,7 +435,9 @@ async def update_trust_score( @router.post("/sandbox/{execution_id}/create") +@rate_limit(rate=50, per=60) async def create_sandbox( + request: Request, execution_id: str, security_level: SecurityLevel = SecurityLevel.PUBLIC, workflow_requirements: dict | None = None, @@ -447,7 +475,9 @@ async def create_sandbox( @router.get("/sandbox/{execution_id}/monitor") +@rate_limit(rate=200, per=60) async def monitor_sandbox( + request: Request, execution_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -466,7 +496,9 @@ async def monitor_sandbox( @router.post("/sandbox/{execution_id}/cleanup") +@rate_limit(rate=50, per=60) async def cleanup_sandbox( + request: Request, execution_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()), @@ -495,7 +527,9 @@ async def cleanup_sandbox( @router.post("/executions/{execution_id}/security-monitor") +@rate_limit(rate=50, per=60) async def monitor_execution_security( + request: Request, execution_id: str, workflow_id: str, session: Session = Depends(Annotated[Session, Depends(get_session)]), @@ -515,7 +549,9 @@ async def monitor_execution_security( @router.get("/security-dashboard") +@rate_limit(rate=200, per=60) async def get_security_dashboard( + request: Request, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()) ) -> dict[str, Any]: """Get comprehensive security dashboard data""" @@ -570,7 +606,9 @@ async def get_security_dashboard( @router.get("/security-stats") +@rate_limit(rate=200, per=60) async def get_security_statistics( + request: Request, session: Session = Depends(Annotated[Session, Depends(get_session)]), current_user: str = Depends(require_admin_key()) ) -> dict[str, Any]: """Get security statistics and metrics""" diff --git a/apps/agent-management/src/app/routers/services.py b/apps/agent-management/src/app/routers/services.py index fb9df47b..02c6efec 100755 --- a/apps/agent-management/src/app/routers/services.py +++ b/apps/agent-management/src/app/routers/services.py @@ -8,8 +8,9 @@ Services router for specific GPU workloads from typing import Any -from fastapi import APIRouter, Depends, Header, HTTPException, status +from fastapi import APIRouter, Depends, Header, HTTPException, Request, status +from aitbc.rate_limiting import rate_limit from ..deps import require_client_key from ..models.services import ( BlenderRequest, @@ -37,7 +38,9 @@ router = APIRouter(tags=["services"]) summary="Submit a service-specific job", deprecated=True, ) +@rate_limit(rate=50, per=60) async def submit_service_job( + request_http: Request, service_type: ServiceType, request_data: dict[str, Any], session: Annotated[Session, Depends(get_session)], @@ -105,7 +108,9 @@ async def submit_service_job( status_code=status.HTTP_201_CREATED, summary="Transcribe audio using Whisper", ) +@rate_limit(rate=50, per=60) async def whisper_transcribe( + request_http: Request, request: WhisperRequest, session: Annotated[Session, Depends(get_session)], client_id: str = Depends(require_client_key()), @@ -136,7 +141,9 @@ async def whisper_transcribe( status_code=status.HTTP_201_CREATED, summary="Translate audio using Whisper", ) +@rate_limit(rate=50, per=60) async def whisper_translate( + request_http: Request, request: WhisperRequest, session: Annotated[Session, Depends(get_session)], client_id: str = Depends(require_client_key()), @@ -170,7 +177,9 @@ async def whisper_translate( status_code=status.HTTP_201_CREATED, summary="Generate images using Stable Diffusion", ) +@rate_limit(rate=50, per=60) async def stable_diffusion_generate( + request_http: Request, request: StableDiffusionRequest, session: Annotated[Session, Depends(get_session)], client_id: str = Depends(require_client_key()), @@ -203,7 +212,9 @@ async def stable_diffusion_generate( status_code=status.HTTP_201_CREATED, summary="Image-to-image generation", ) +@rate_limit(rate=50, per=60) async def stable_diffusion_img2img( + request_http: Request, request: StableDiffusionRequest, session: Annotated[Session, Depends(get_session)], client_id: str = Depends(require_client_key()), @@ -235,7 +246,9 @@ async def stable_diffusion_img2img( @router.post( "/services/llm/inference", response_model=ServiceResponse, status_code=status.HTTP_201_CREATED, summary="Run LLM inference" ) +@rate_limit(rate=50, per=60) async def llm_inference( + request_http: Request, request: LLMRequest, session: Annotated[Session, Depends(get_session)], client_id: str = Depends(require_client_key()), @@ -263,7 +276,9 @@ async def llm_inference( @router.post("/services/llm/stream", summary="Stream LLM inference") +@rate_limit(rate=50, per=60) async def llm_stream( + request_http: Request, request: LLMRequest, session: Annotated[Session, Depends(get_session)], client_id: str = Depends(require_client_key()), @@ -299,7 +314,9 @@ async def llm_stream( status_code=status.HTTP_201_CREATED, summary="Transcode video using FFmpeg", ) +@rate_limit(rate=50, per=60) async def ffmpeg_transcode( + request_http: Request, request: FFmpegRequest, session: Annotated[Session, Depends(get_session)], client_id: str = Depends(require_client_key()), @@ -334,7 +351,9 @@ async def ffmpeg_transcode( status_code=status.HTTP_201_CREATED, summary="Render using Blender", ) +@rate_limit(rate=50, per=60) async def blender_render( + request_http: Request, request: BlenderRequest, session: Annotated[Session, Depends(get_session)], client_id: str = Depends(require_client_key()), @@ -366,7 +385,10 @@ async def blender_render( # Utility endpoints @router.get("/services", summary="List available services") -async def list_services() -> dict[str, Any]: +@rate_limit(rate=200, per=60) +async def list_services( + request: Request +) -> dict[str, Any]: """List all available service types and their capabilities""" return { "services": [ @@ -425,7 +447,10 @@ async def list_services() -> dict[str, Any]: @router.get("/services/{service_type}/schema", summary="Get service request schema", deprecated=True) -async def get_service_schema(service_type: ServiceType) -> dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_service_schema( + request: Request, service_type: ServiceType +) -> dict[str, Any]: """Get the JSON schema for a specific service type DEPRECATED: Use /v1/registry/services/{service_id}/schema instead. diff --git a/apps/blockchain-node/src/aitbc_chain/rpc/router.py b/apps/blockchain-node/src/aitbc_chain/rpc/router.py index 135f7114..3e28b93e 100755 --- a/apps/blockchain-node/src/aitbc_chain/rpc/router.py +++ b/apps/blockchain-node/src/aitbc_chain/rpc/router.py @@ -6,7 +6,7 @@ import time from typing import Any, Dict, Optional, List from datetime import datetime, timezone, timedelta -from fastapi import APIRouter, HTTPException, status +from fastapi import APIRouter, HTTPException, status, Request from pydantic import BaseModel, Field, model_validator from sqlmodel import select, delete @@ -20,6 +20,8 @@ from ..sync import ChainSync from ..contracts.agent_messaging_contract import messaging_contract from .contract_service import contract_service +from aitbc.rate_limiting import rate_limit + _logger = get_logger(__name__) router = APIRouter() @@ -254,7 +256,10 @@ class EstimateFeeRequest(BaseModel): @router.get("/genesis_allocations", summary="Get genesis allocations from blockchain") -async def get_genesis_allocations(chain_id: str = None) -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_genesis_allocations( + request: Request, chain_id: str = None +) -> Dict[str, Any]: """Get genesis allocations from genesis block metadata for RPC bootstrap""" chain_id = get_chain_id(chain_id) @@ -286,7 +291,10 @@ async def get_genesis_allocations(chain_id: str = None) -> Dict[str, Any]: @router.get("/head", summary="Get current chain head") -async def get_head(chain_id: str = None) -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_head( + request: Request, chain_id: str = None +) -> Dict[str, Any]: """Get current chain head""" chain_id = get_chain_id(chain_id) @@ -308,7 +316,10 @@ async def get_head(chain_id: str = None) -> Dict[str, Any]: @router.get("/blocks/{height}", summary="Get block by height") -async def get_block(height: int, chain_id: str = None) -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_block( + request: Request, height: int, chain_id: str = None +) -> Dict[str, Any]: """Get block by height""" chain_id = get_chain_id(chain_id) @@ -349,7 +360,10 @@ async def get_block(height: int, chain_id: str = None) -> Dict[str, Any]: @router.post("/transaction", summary="Submit transaction") -async def submit_transaction(tx_data: TransactionRequest) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def submit_transaction( + request: Request, tx_data: TransactionRequest +) -> Dict[str, Any]: """Submit a new transaction to the mempool""" from ..mempool import get_mempool @@ -386,7 +400,10 @@ async def submit_transaction(tx_data: TransactionRequest) -> Dict[str, Any]: @router.get("/mempool", summary="Get pending transactions") -async def get_mempool(chain_id: str = None, limit: int = 100) -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_mempool( + request: Request, chain_id: str = None, limit: int = 100 +) -> Dict[str, Any]: """Get pending transactions from mempool""" from ..mempool import get_mempool @@ -405,7 +422,10 @@ async def get_mempool(chain_id: str = None, limit: int = 100) -> Dict[str, Any]: @router.get("/account/{address}", summary="Get account information") -async def get_account(address: str, chain_id: str = None) -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_account( + request: Request, address: str, chain_id: str = None +) -> Dict[str, Any]: """Get account information""" chain_id = get_chain_id(chain_id) @@ -423,13 +443,19 @@ async def get_account(address: str, chain_id: str = None) -> Dict[str, Any]: @router.get("/accounts/{address}", summary="Get account information (alias)") -async def get_account_alias(address: str, chain_id: str = None) -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_account_alias( + request: Request, address: str, chain_id: str = None +) -> Dict[str, Any]: """Get account information (alias endpoint)""" return await get_account(address, chain_id) @router.post("/transactions/marketplace", summary="Submit marketplace transaction") -async def submit_marketplace_transaction(tx_data: Dict[str, Any]) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def submit_marketplace_transaction( + request: Request, tx_data: Dict[str, Any] +) -> Dict[str, Any]: """Submit a marketplace purchase transaction to the blockchain""" from ..config import settings as cfg chain_id = get_chain_id(tx_data.get("chain_id")) @@ -520,7 +546,9 @@ async def submit_marketplace_transaction(tx_data: Dict[str, Any]) -> Dict[str, A @router.get("/transactions", summary="Query transactions") +@rate_limit(rate=200, per=60) async def query_transactions( + request: Request, transaction_type: Optional[str] = None, island_id: Optional[str] = None, pair: Optional[str] = None, @@ -582,7 +610,10 @@ async def query_transactions( @router.get("/blocks-range", summary="Get blocks in height range") -async def get_blocks_range(start: int = 0, end: int = 10, include_tx: bool = True, chain_id: str = None) -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_blocks_range( + request: Request, start: int = 0, end: int = 10, include_tx: bool = True, chain_id: str = None +) -> Dict[str, Any]: """Get blocks in a height range Args: @@ -632,18 +663,27 @@ async def get_blocks_range(start: int = 0, end: int = 10, include_tx: bool = Tru } @router.post("/contracts/deploy/messaging", summary="Deploy messaging contract") -async def deploy_messaging_contract(deploy_data: dict) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def deploy_messaging_contract( + request: Request, deploy_data: dict +) -> Dict[str, Any]: """Deploy the agent messaging contract to the blockchain""" contract_address = "0xagent_messaging_001" return {"success": True, "contract_address": contract_address, "status": "deployed"} @router.get("/contracts", summary="List deployed contracts") -async def list_contracts() -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def list_contracts( + request: Request +) -> Dict[str, Any]: """List all deployed contracts""" return contract_service.list_contracts() @router.post("/contracts/deploy", summary="Deploy a smart contract") -async def deploy_contract(deploy_data: dict) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def deploy_contract( + request: Request, deploy_data: dict +) -> Dict[str, Any]: """Deploy a new smart contract to the blockchain""" contract_name = deploy_data.get("name") contract_type = deploy_data.get("type", "zk-verifier") @@ -664,7 +704,10 @@ async def deploy_contract(deploy_data: dict) -> Dict[str, Any]: } @router.post("/contracts/call", summary="Call a contract method") -async def call_contract(call_data: dict) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def call_contract( + request: Request, call_data: dict +) -> Dict[str, Any]: """Call a method on a deployed contract""" contract_address = call_data.get("address") method = call_data.get("method") @@ -684,7 +727,10 @@ async def call_contract(call_data: dict) -> Dict[str, Any]: } @router.post("/contracts/verify", summary="Verify a ZK proof") -async def verify_contract(verify_data: dict) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def verify_contract( + request: Request, verify_data: dict +) -> Dict[str, Any]: """Verify a ZK proof against a contract""" contract_address = verify_data.get("address") proof = verify_data.get("proof") @@ -703,7 +749,10 @@ async def verify_contract(verify_data: dict) -> Dict[str, Any]: } @router.get("/contracts/messaging/state", summary="Get messaging contract state") -async def get_messaging_contract_state() -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_messaging_contract_state( + request: Request +) -> Dict[str, Any]: """Get the current state of the messaging contract""" state = { "total_topics": len(messaging_contract.topics), @@ -713,12 +762,18 @@ async def get_messaging_contract_state() -> Dict[str, Any]: return {"success": True, "contract_state": state} @router.get("/messaging/topics", summary="Get forum topics") -async def get_forum_topics(limit: int = 50, offset: int = 0, sort_by: str = "last_activity") -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_forum_topics( + request: Request, limit: int = 50, offset: int = 0, sort_by: str = "last_activity" +) -> Dict[str, Any]: """Get list of forum topics""" return messaging_contract.get_topics(limit, offset, sort_by) @router.post("/messaging/topics/create", summary="Create forum topic") -async def create_forum_topic(topic_data: dict) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def create_forum_topic( + request: Request, topic_data: dict +) -> Dict[str, Any]: """Create a new forum topic""" return messaging_contract.create_topic( topic_data.get("agent_id"), @@ -729,12 +784,18 @@ async def create_forum_topic(topic_data: dict) -> Dict[str, Any]: ) @router.get("/messaging/topics/{topic_id}/messages", summary="Get topic messages") -async def get_topic_messages(topic_id: str, limit: int = 50, offset: int = 0, sort_by: str = "timestamp") -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_topic_messages( + request: Request, topic_id: str, limit: int = 50, offset: int = 0, sort_by: str = "timestamp" +) -> Dict[str, Any]: """Get messages from a forum topic""" return messaging_contract.get_messages(topic_id, limit, offset, sort_by) @router.post("/messaging/messages/post", summary="Post message") -async def post_message(message_data: dict) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def post_message( + request: Request, message_data: dict +) -> Dict[str, Any]: """Post a message to a forum topic""" return messaging_contract.post_message( message_data.get("agent_id"), @@ -746,7 +807,10 @@ async def post_message(message_data: dict) -> Dict[str, Any]: ) @router.post("/messaging/messages/{message_id}/vote", summary="Vote on message") -async def vote_message(message_id: str, vote_data: dict) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def vote_message( + request: Request, message_id: str, vote_data: dict +) -> Dict[str, Any]: """Vote on a message (upvote/downvote)""" return messaging_contract.vote_message( vote_data.get("agent_id"), @@ -756,17 +820,26 @@ async def vote_message(message_id: str, vote_data: dict) -> Dict[str, Any]: ) @router.get("/messaging/messages/search", summary="Search messages") -async def search_messages(query: str, limit: int = 50) -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def search_messages( + request: Request, query: str, limit: int = 50 +) -> Dict[str, Any]: """Search messages by content""" return messaging_contract.search_messages(query, limit) @router.get("/messaging/agents/{agent_id}/reputation", summary="Get agent reputation") -async def get_agent_reputation(agent_id: str) -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_agent_reputation( + request: Request, agent_id: str +) -> Dict[str, Any]: """Get agent reputation information""" return messaging_contract.get_agent_reputation(agent_id) @router.post("/messaging/messages/{message_id}/moderate", summary="Moderate message") -async def moderate_message(message_id: str, moderation_data: dict) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def moderate_message( + request: Request, message_id: str, moderation_data: dict +) -> Dict[str, Any]: """Moderate a message (moderator only)""" return messaging_contract.moderate_message( moderation_data.get("moderator_agent_id"), @@ -777,7 +850,10 @@ async def moderate_message(message_id: str, moderation_data: dict) -> Dict[str, ) @router.post("/importBlock", summary="Import a block") -async def import_block(block_data: dict) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def import_block( + request: Request, block_data: dict +) -> Dict[str, Any]: """Import a block into the blockchain""" global _last_import_time @@ -931,7 +1007,10 @@ def _dedupe_import_blocks(blocks: List[Dict[str, Any]], chain_id: str) -> List[D return [latest_by_height[height] for height in sorted(latest_by_height)] @router.get("/export-chain", summary="Export full chain state") -async def export_chain(chain_id: str = None) -> Dict[str, Any]: +@rate_limit(rate=200, per=60) +async def export_chain( + request: Request, chain_id: str = None +) -> Dict[str, Any]: """Export full chain state as JSON for manual synchronization""" chain_id = get_chain_id(chain_id) try: @@ -1016,7 +1095,10 @@ async def export_chain(chain_id: str = None) -> Dict[str, Any]: raise HTTPException(status_code=500, detail=f"Failed to export chain: {str(e)}") @router.post("/import-chain", summary="Import chain state") -async def import_chain(import_data: dict) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def import_chain( + request: Request, import_data: dict +) -> Dict[str, Any]: """Import chain state from JSON for manual synchronization""" async with _import_lock: try: @@ -1145,7 +1227,10 @@ async def import_chain(import_data: dict) -> Dict[str, Any]: raise HTTPException(status_code=500, detail=f"Failed to import chain: {str(e)}") @router.post("/force-sync", summary="Force reorg to specified peer") -async def force_sync(peer_data: dict) -> Dict[str, Any]: +@rate_limit(rate=50, per=60) +async def force_sync( + request: Request, peer_data: dict +) -> Dict[str, Any]: """Force blockchain reorganization to sync with specified peer""" try: peer_url = peer_data.get("peer_url") @@ -1224,8 +1309,10 @@ class GetLogsResponse(BaseModel): @router.post("/eth_getLogs", summary="Query smart contract event logs") +@rate_limit(rate=200, per=60) async def get_logs( - request: GetLogsRequest, + request: Request, + logs_request: GetLogsRequest, chain_id: Optional[str] = None ) -> GetLogsResponse: """ diff --git a/apps/coordinator-api/DOMAIN_REFACTORING_PLAN.md b/apps/coordinator-api/DOMAIN_REFACTORING_PLAN.md new file mode 100644 index 00000000..4ed018cc --- /dev/null +++ b/apps/coordinator-api/DOMAIN_REFACTORING_PLAN.md @@ -0,0 +1,358 @@ +# Domain Refactoring Plan for Coordinator-API Decomposition + +## Current State + +**Phase 1 (Modular Monolith Restructuring):** COMPLETED +- 4 contexts created: marketplace, payments, blockchain, agent_identity +- 8 routers moved, 8 services moved, 5 domain models moved +- Database schema separation with table prefixes completed +- All imports updated and compilation verified + +**Remaining Work:** 45 routers and 115 services still in monolithic structure + +## Identified Bounded Contexts + +### Existing Contexts (Phase 1) +1. **marketplace** - GPU marketplace functionality +2. **payments** - Payment processing and escrow +3. **blockchain** - Blockchain interactions and contracts +4. **agent_identity** - Agent identity management and verification + +### Additional Bounded Contexts to Create + +#### 1. Governance Context +**Routers:** governance.py, governance_enhanced.py +**Services:** dao_governance_service.py, governance_service.py +**Responsibilities:** +- DAO governance mechanisms +- Voting and proposal management +- Governance rules enforcement + +#### 2. Staking Context +**Routers:** staking.py +**Services:** staking_service.py +**Responsibilities:** +- Staking operations +- Reward distribution +- Stake management + +#### 3. Reputation Context +**Routers:** reputation.py +**Services:** reputation_service.py +**Responsibilities:** +- Agent reputation scoring +- Trust management +- Reputation-based access control + +#### 4. Rewards Context +**Routers:** rewards.py +**Services:** reward_service.py +**Responsibilities:** +- Reward distribution +- Incentive management +- Reward tracking + +#### 5. Trading Context +**Routers:** trading.py +**Services:** trading_marketplace/ +**Responsibilities:** +- Trading operations +- Order management +- Trade execution + +#### 6. Analytics Context +**Routers:** analytics.py +**Services:** advanced_analytics.py, performance_monitoring.py +**Responsibilities:** +- Data analytics +- Performance monitoring +- Metrics collection + +#### 7. Certification Context +**Routers:** certification.py +**Services:** certification/ +**Responsibilities:** +- Agent certification +- Badge management +- Partnership management + +#### 8. Hermes Context +**Routers:** hermes_enhanced.py, hermes_enhanced_simple.py, hermes_enhanced_app.py, hermes_enhanced_health.py +**Services:** hermes_enhanced.py, hermes_enhanced_simple.py +**Responsibilities:** +- Hermes agent orchestration +- Agent coordination +- Edge computing integration + +#### 9. Multi-modal Context +**Routers:** multi_modal_rl.py, multimodal_health.py, modality_optimization_health.py +**Services:** multimodal_agent.py, modality_optimization.py, multi_modal_fusion/ +**Responsibilities:** +- Multi-modal AI operations +- Modality optimization +- Fusion engine management + +#### 10. Advanced RL Context +**Routers:** (none at router level) +**Services:** advanced_rl/ +**Responsibilities:** +- Advanced reinforcement learning +- RL agent training +- RL model management + +#### 11. AI Analytics Context +**Routers:** (none at router level) +**Services:** ai_analytics/ +**Responsibilities:** +- AI-powered analytics +- ML model analytics +- AI-driven insights + +#### 12. Cross-chain Context +**Routers:** cross_chain_integration.py +**Services:** cross_chain/, multi_chain_transaction_manager.py +**Responsibilities:** +- Cross-chain operations +- Multi-chain transaction management +- Cross-chain bridge management + +#### 13. Developer Platform Context +**Routers:** developer_platform.py +**Services:** developer_platform_service.py +**Responsibilities:** +- Developer tools +- API platform +- Developer resources + +#### 14. Community Context +**Routers:** community.py +**Services:** community_service.py +**Responsibilities:** +- Community management +- Social features +- Community governance + +#### 15. Bounty Context +**Routers:** bounty.py +**Services:** bounty_service.py +**Responsibilities:** +- Bounty management +- Task bounties +- Reward bounties + +#### 16. Confidential Context +**Routers:** confidential.py +**Services:** confidential_service.py, fhe_service.py +**Responsibilities:** +- Confidential transactions +- FHE operations +- Privacy-preserving computations + +#### 17. ZK Applications Context +**Routers:** zk_applications.py, ml_zk_proofs.py +**Services:** zk_proofs.py, zk_memory_verification.py +**Responsibilities:** +- Zero-knowledge proof operations +- ZK application management +- ZK verification + +#### 18. Agent Coordination Context +**Routers:** (none at router level) +**Services:** agent_coordination/ +**Responsibilities:** +- Agent coordination logic +- Agent communication +- Agent orchestration + +#### 19. Enterprise Integration Context +**Routers:** (none at router level) +**Services:** enterprise_integration/ +**Responsibilities:** +- Enterprise API gateway +- Multi-tenant support +- Enterprise features + +#### 20. Advanced AI Context +**Routers:** (none at router level) +**Services:** advanced_ai_service.py, distributed_framework.py, task_decomposition.py +**Responsibilities:** +- Advanced AI operations +- Distributed AI +- Task decomposition + +#### 21. Ecosystem Context +**Routers:** ecosystem_dashboard.py +**Services:** ecosystem_service.py +**Responsibilities:** +- Ecosystem management +- Ecosystem monitoring +- Ecosystem analytics + +#### 22. GPU Multimodal Context +**Routers:** gpu_multimodal_health.py +**Services:** gpu_multimodal.py, gpu_multimodal_app.py +**Responsibilities:** +- GPU multimodal operations +- GPU optimization +- Multimodal health monitoring + +#### 23. Edge GPU Context +**Routers:** edge_gpu.py +**Services:** edge_gpu_service.py +**Responsibilities:** +- Edge GPU management +- Edge computing +- GPU resource allocation + +#### 24. Infrastructure Context +**Routers:** cache_management.py, web_vitals.py, monitor.py, monitoring_dashboard.py +**Services:** global_cdn.py, memory_manager.py, performance_monitoring.py, websocket_stream_manager.py +**Responsibilities:** +- Caching infrastructure +- Performance monitoring +- CDN management +- Memory management +- WebSocket management + +#### 25. Security Context +**Routers:** agent_security_router.py, adaptive_learning_health.py, gpu_multimodal_health.py, modality_optimization_health.py +**Services:** access_control.py, compliance_security/, encryption.py, hsm_key_manager.py, key_management.py, kyc_aml_providers.py, quota_enforcement.py, trading_surveillance.py +**Responsibilities:** +- Access control +- Encryption +- Key management +- KYC/AML +- Compliance +- Security monitoring + +#### 26. Storage Context +**Routers:** (none at router level) +**Services:** ipfs_storage_adapter.py, ipfs_storage_service.py +**Responsibilities:** +- IPFS storage +- Decentralized storage +- Storage management + +#### 27. Wallet Context +**Routers:** (none at router level) +**Services:** bitcoin_wallet.py, wallet_crypto.py, wallet_service.py, secure_wallet_service.py +**Responsibilities:** +- Wallet management +- Cryptocurrency operations +- Secure wallet operations + +#### 28. Language Context +**Routers:** (none at router level) +**Services:** multi_language/ +**Responsibilities:** +- Multi-language support +- Translation services +- Language detection + +#### 29. Settlement Context +**Routers:** settlement.py +**Services:** receipts.py +**Responsibilities:** +- Settlement operations +- Receipt management +- Transaction settlement + +## Refactoring Strategy + +### Phase 2: Context Creation (Weeks 5-8) +Create the remaining 25 bounded contexts with proper directory structure: +- contexts/governance/ +- contexts/staking/ +- contexts/reputation/ +- contexts/rewards/ +- contexts/trading/ +- contexts/analytics/ +- contexts/certification/ +- contexts/hermes/ +- contexts/multimodal/ +- contexts/advanced_rl/ +- contexts/ai_analytics/ +- contexts/cross_chain/ +- contexts/developer_platform/ +- contexts/community/ +- contexts/bounty/ +- contexts/confidential/ +- contexts/zk_applications/ +- contexts/agent_coordination/ +- contexts/enterprise_integration/ +- contexts/advanced_ai/ +- contexts/ecosystem/ +- contexts/gpu_multimodal/ +- contexts/edge_gpu/ +- contexts/infrastructure/ +- contexts/security/ +- contexts/storage/ +- contexts/wallet/ +- contexts/language/ +- contexts/settlement/ + +### Phase 3: Component Migration (Weeks 9-12) +Move routers, services, and domain models to appropriate contexts: +- Update import paths +- Create context-specific schemas +- Update database table prefixes +- Verify compilation + +### Phase 4: Dependency Resolution (Weeks 13-16) +- Identify and document cross-context dependencies +- Create shared libraries for common functionality +- Define communication patterns between contexts +- Implement event-driven communication where appropriate + +### Phase 5: Microservice Extraction (Weeks 17-20) +- Extract high-value contexts as independent microservices +- Implement service discovery +- Add inter-service communication +- Update deployment configurations + +## Priority Order + +**High Priority (Core Business Logic):** +1. Governance +2. Staking +3. Reputation +4. Rewards +5. Trading +6. Hermes +7. Security + +**Medium Priority (Supporting Services):** +8. Analytics +9. Certification +10. Cross-chain +11. Developer Platform +12. Community +13. Confidential +14. ZK Applications +15. Enterprise Integration + +**Low Priority (Infrastructure/Utilities):** +16. Infrastructure +17. Storage +18. Wallet +19. Language +20. Settlement +21. Multi-modal +22. Advanced RL +23. AI Analytics +24. Advanced AI +25. Ecosystem +26. GPU Multimodal +27. Edge GPU +28. Agent Coordination +29. Bounty + +## Success Metrics + +- All routers and services organized into bounded contexts +- Clear domain boundaries defined +- Cross-context dependencies documented +- Shared libraries created for common functionality +- Communication patterns established +- Compilation verified after each phase +- Test coverage maintained throughout refactoring diff --git a/apps/coordinator-api/src/app/contexts/advanced_ai/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_ai/__init__.py new file mode 100644 index 00000000..4364ece7 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/advanced_ai/__init__.py @@ -0,0 +1 @@ +"""Advanced AI context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/advanced_ai/domain/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_ai/domain/__init__.py new file mode 100644 index 00000000..006263e5 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/advanced_ai/domain/__init__.py @@ -0,0 +1 @@ +"""Advanced AI domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/advanced_ai/routers/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_ai/routers/__init__.py new file mode 100644 index 00000000..a8c639ac --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/advanced_ai/routers/__init__.py @@ -0,0 +1 @@ +"""Advanced AI routers.""" diff --git a/apps/coordinator-api/src/app/routers/adaptive_learning_health.py b/apps/coordinator-api/src/app/contexts/advanced_ai/routers/adaptive_learning_health.py similarity index 98% rename from apps/coordinator-api/src/app/routers/adaptive_learning_health.py rename to apps/coordinator-api/src/app/contexts/advanced_ai/routers/adaptive_learning_health.py index 24b483ce..197777f9 100755 --- a/apps/coordinator-api/src/app/routers/adaptive_learning_health.py +++ b/apps/coordinator-api/src/app/contexts/advanced_ai/routers/adaptive_learning_health.py @@ -16,8 +16,8 @@ from sqlalchemy.orm import Session from aitbc.rate_limiting import rate_limit from aitbc import get_logger -from ..services.ai_analytics.adaptive_learning import AdaptiveLearningService -from ..storage import get_session +from ....services.ai_analytics.adaptive_learning import AdaptiveLearningService +from ....storage import get_session logger = get_logger(__name__) diff --git a/apps/coordinator-api/src/app/contexts/advanced_ai/services/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_ai/services/__init__.py new file mode 100644 index 00000000..68f747d8 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/advanced_ai/services/__init__.py @@ -0,0 +1 @@ +"""Advanced AI services.""" diff --git a/apps/coordinator-api/src/app/contexts/advanced_ai/storage/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_ai/storage/__init__.py new file mode 100644 index 00000000..61d78ff2 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/advanced_ai/storage/__init__.py @@ -0,0 +1 @@ +"""Advanced AI storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/advanced_rl/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_rl/__init__.py new file mode 100644 index 00000000..18f85836 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/advanced_rl/__init__.py @@ -0,0 +1 @@ +"""Advanced RL context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/advanced_rl/domain/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_rl/domain/__init__.py new file mode 100644 index 00000000..45729936 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/advanced_rl/domain/__init__.py @@ -0,0 +1 @@ +"""Advanced RL domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/advanced_rl/routers/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_rl/routers/__init__.py new file mode 100644 index 00000000..af0e68f2 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/advanced_rl/routers/__init__.py @@ -0,0 +1 @@ +"""Advanced RL routers.""" diff --git a/apps/coordinator-api/src/app/contexts/advanced_rl/services/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_rl/services/__init__.py new file mode 100644 index 00000000..09cf21cb --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/advanced_rl/services/__init__.py @@ -0,0 +1 @@ +"""Advanced RL services.""" diff --git a/apps/coordinator-api/src/app/services/advanced_rl/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/__init__.py similarity index 100% rename from apps/coordinator-api/src/app/services/advanced_rl/__init__.py rename to apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/__init__.py diff --git a/apps/coordinator-api/src/app/services/advanced_rl/agents.py b/apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/agents.py similarity index 100% rename from apps/coordinator-api/src/app/services/advanced_rl/agents.py rename to apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/agents.py diff --git a/apps/coordinator-api/src/app/services/advanced_rl/agents/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/agents/__init__.py similarity index 100% rename from apps/coordinator-api/src/app/services/advanced_rl/agents/__init__.py rename to apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/agents/__init__.py diff --git a/apps/coordinator-api/src/app/services/advanced_rl/agents/ppo_agent.py b/apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/agents/ppo_agent.py similarity index 100% rename from apps/coordinator-api/src/app/services/advanced_rl/agents/ppo_agent.py rename to apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/agents/ppo_agent.py diff --git a/apps/coordinator-api/src/app/services/advanced_rl/agents/rainbow_dqn_agent.py b/apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/agents/rainbow_dqn_agent.py similarity index 100% rename from apps/coordinator-api/src/app/services/advanced_rl/agents/rainbow_dqn_agent.py rename to apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/agents/rainbow_dqn_agent.py diff --git a/apps/coordinator-api/src/app/services/advanced_rl/agents/sac_agent.py b/apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/agents/sac_agent.py similarity index 100% rename from apps/coordinator-api/src/app/services/advanced_rl/agents/sac_agent.py rename to apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/agents/sac_agent.py diff --git a/apps/coordinator-api/src/app/services/advanced_rl/algorithms/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/algorithms/__init__.py similarity index 100% rename from apps/coordinator-api/src/app/services/advanced_rl/algorithms/__init__.py rename to apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/algorithms/__init__.py diff --git a/apps/coordinator-api/src/app/services/advanced_rl/engine.py b/apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/engine.py similarity index 100% rename from apps/coordinator-api/src/app/services/advanced_rl/engine.py rename to apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/engine.py diff --git a/apps/coordinator-api/src/app/services/advanced_rl/marketplace_optimizer.py b/apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/marketplace_optimizer.py similarity index 100% rename from apps/coordinator-api/src/app/services/advanced_rl/marketplace_optimizer.py rename to apps/coordinator-api/src/app/contexts/advanced_rl/services/advanced_rl/marketplace_optimizer.py diff --git a/apps/coordinator-api/src/app/contexts/advanced_rl/storage/__init__.py b/apps/coordinator-api/src/app/contexts/advanced_rl/storage/__init__.py new file mode 100644 index 00000000..0784d17e --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/advanced_rl/storage/__init__.py @@ -0,0 +1 @@ +"""Advanced RL storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/agent_coordination/__init__.py b/apps/coordinator-api/src/app/contexts/agent_coordination/__init__.py new file mode 100644 index 00000000..ea52c3d6 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/agent_coordination/__init__.py @@ -0,0 +1 @@ +"""Agent coordination context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/agent_coordination/domain/__init__.py b/apps/coordinator-api/src/app/contexts/agent_coordination/domain/__init__.py new file mode 100644 index 00000000..f3f5046f --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/agent_coordination/domain/__init__.py @@ -0,0 +1 @@ +"""Agent coordination domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/agent_coordination/routers/__init__.py b/apps/coordinator-api/src/app/contexts/agent_coordination/routers/__init__.py new file mode 100644 index 00000000..351e713c --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/agent_coordination/routers/__init__.py @@ -0,0 +1 @@ +"""Agent coordination routers.""" diff --git a/apps/coordinator-api/src/app/routers/agent_creativity.py b/apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_creativity.py similarity index 97% rename from apps/coordinator-api/src/app/routers/agent_creativity.py rename to apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_creativity.py index 79bbe57c..724ec812 100755 --- a/apps/coordinator-api/src/app/routers/agent_creativity.py +++ b/apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_creativity.py @@ -16,14 +16,14 @@ from aitbc import get_logger logger = get_logger(__name__) -from ..domain.agent_performance import CreativeCapability +from ....domain.agent_performance import CreativeCapability from sqlmodel import select -from ..services.creative_capabilities_service import ( +from ....services.creative_capabilities_service import ( CreativityEnhancementEngine, CrossDomainCreativeIntegrator, IdeationAlgorithm, ) -from ..storage import get_session +from ....storage import get_session router = APIRouter(prefix="/v1/agent-creativity", tags=["agent-creativity"]) diff --git a/apps/coordinator-api/src/app/routers/agent_integration_router.py b/apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_integration_router.py similarity index 98% rename from apps/coordinator-api/src/app/routers/agent_integration_router.py rename to apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_integration_router.py index a8394e78..d058cdbc 100755 --- a/apps/coordinator-api/src/app/routers/agent_integration_router.py +++ b/apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_integration_router.py @@ -14,9 +14,9 @@ logger = get_logger(__name__) from sqlmodel import Session, select -from ..deps import require_admin_key -from ..domain.agent import AgentExecution, AIAgentWorkflow, VerificationLevel -from ..services.agent_coordination.integration import ( +from ....deps import require_admin_key +from ....domain.agent import AgentExecution, AIAgentWorkflow, VerificationLevel +from ....services.agent_coordination.integration import ( AgentDeploymentConfig, AgentDeploymentInstance, AgentDeploymentManager, @@ -25,8 +25,8 @@ from ..services.agent_coordination.integration import ( AgentProductionManager, DeploymentStatus, ) -from ..storage import get_session -from ..utils.alerting import alert_dispatcher +from ....storage import get_session +from ....utils.alerting import alert_dispatcher router = APIRouter(prefix="/agents/integration", tags=["Agent Integration"]) diff --git a/apps/coordinator-api/src/app/routers/agent_performance.py b/apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_performance.py similarity index 99% rename from apps/coordinator-api/src/app/routers/agent_performance.py rename to apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_performance.py index cee2770f..2ebe77ae 100755 --- a/apps/coordinator-api/src/app/routers/agent_performance.py +++ b/apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_performance.py @@ -18,7 +18,7 @@ from aitbc.rate_limiting import rate_limit logger = get_logger(__name__) -from ..domain.agent_performance import ( +from ....domain.agent_performance import ( AgentCapability, AgentPerformanceProfile, CreativeCapability, @@ -32,13 +32,13 @@ from ..domain.agent_performance import ( ResourceAllocation, ResourceType, ) -from ..services.agent_coordination.performance import ( +from ....services.agent_coordination.performance import ( AgentPerformanceService, MetaLearningEngine, PerformanceOptimizer, ResourceManager, ) -from ..storage import get_session +from ....storage import get_session router = APIRouter(prefix="/v1/agent-performance", tags=["agent-performance"]) diff --git a/apps/coordinator-api/src/app/routers/agent_router.py b/apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_router.py similarity index 98% rename from apps/coordinator-api/src/app/routers/agent_router.py rename to apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_router.py index ef0da222..9ccedb95 100755 --- a/apps/coordinator-api/src/app/routers/agent_router.py +++ b/apps/coordinator-api/src/app/contexts/agent_coordination/routers/agent_router.py @@ -18,8 +18,8 @@ logger = get_logger(__name__) from sqlmodel import Session, select -from ..deps import require_admin_key -from ..domain.agent import ( +from ....deps import require_admin_key +from ....domain.agent import ( AgentExecutionRequest, AgentExecutionResponse, AgentExecutionStatus, @@ -28,8 +28,8 @@ from ..domain.agent import ( AgentWorkflowUpdate, AIAgentWorkflow, ) -from ..services.agent_coordination.agent_service import AIAgentOrchestrator -from ..storage import get_session +from ....services.agent_coordination.agent_service import AIAgentOrchestrator +from ....storage import get_session router = APIRouter(tags=["AI Agents"]) diff --git a/apps/coordinator-api/src/app/routers/swarm.py b/apps/coordinator-api/src/app/contexts/agent_coordination/routers/swarm.py similarity index 100% rename from apps/coordinator-api/src/app/routers/swarm.py rename to apps/coordinator-api/src/app/contexts/agent_coordination/routers/swarm.py diff --git a/apps/coordinator-api/src/app/contexts/agent_coordination/services/__init__.py b/apps/coordinator-api/src/app/contexts/agent_coordination/services/__init__.py new file mode 100644 index 00000000..84aee4d5 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/agent_coordination/services/__init__.py @@ -0,0 +1 @@ +"""Agent coordination services.""" diff --git a/apps/coordinator-api/src/app/contexts/agent_coordination/storage/__init__.py b/apps/coordinator-api/src/app/contexts/agent_coordination/storage/__init__.py new file mode 100644 index 00000000..c6c3c148 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/agent_coordination/storage/__init__.py @@ -0,0 +1 @@ +"""Agent coordination storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/ai_analytics/__init__.py b/apps/coordinator-api/src/app/contexts/ai_analytics/__init__.py new file mode 100644 index 00000000..77bee6e5 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/ai_analytics/__init__.py @@ -0,0 +1 @@ +"""AI Analytics context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/ai_analytics/domain/__init__.py b/apps/coordinator-api/src/app/contexts/ai_analytics/domain/__init__.py new file mode 100644 index 00000000..366ef847 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/ai_analytics/domain/__init__.py @@ -0,0 +1 @@ +"""AI Analytics domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/ai_analytics/routers/__init__.py b/apps/coordinator-api/src/app/contexts/ai_analytics/routers/__init__.py new file mode 100644 index 00000000..1c0864eb --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/ai_analytics/routers/__init__.py @@ -0,0 +1 @@ +"""AI Analytics routers.""" diff --git a/apps/coordinator-api/src/app/contexts/ai_analytics/services/__init__.py b/apps/coordinator-api/src/app/contexts/ai_analytics/services/__init__.py new file mode 100644 index 00000000..a3cd760a --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/ai_analytics/services/__init__.py @@ -0,0 +1 @@ +"""AI Analytics services.""" diff --git a/apps/coordinator-api/src/app/services/ai_analytics/__init__.py b/apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/__init__.py similarity index 100% rename from apps/coordinator-api/src/app/services/ai_analytics/__init__.py rename to apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/__init__.py diff --git a/apps/coordinator-api/src/app/services/ai_analytics/adaptive_learning.py b/apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/adaptive_learning.py similarity index 100% rename from apps/coordinator-api/src/app/services/ai_analytics/adaptive_learning.py rename to apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/adaptive_learning.py diff --git a/apps/coordinator-api/src/app/services/ai_analytics/advanced_learning.py b/apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/advanced_learning.py similarity index 100% rename from apps/coordinator-api/src/app/services/ai_analytics/advanced_learning.py rename to apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/advanced_learning.py diff --git a/apps/coordinator-api/src/app/services/ai_analytics/analytics.py b/apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/analytics.py similarity index 100% rename from apps/coordinator-api/src/app/services/ai_analytics/analytics.py rename to apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/analytics.py diff --git a/apps/coordinator-api/src/app/services/ai_analytics/surveillance.py b/apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/surveillance.py similarity index 100% rename from apps/coordinator-api/src/app/services/ai_analytics/surveillance.py rename to apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/surveillance.py diff --git a/apps/coordinator-api/src/app/services/ai_analytics/trading_engine.py b/apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/trading_engine.py similarity index 100% rename from apps/coordinator-api/src/app/services/ai_analytics/trading_engine.py rename to apps/coordinator-api/src/app/contexts/ai_analytics/services/ai_analytics/trading_engine.py diff --git a/apps/coordinator-api/src/app/contexts/ai_analytics/storage/__init__.py b/apps/coordinator-api/src/app/contexts/ai_analytics/storage/__init__.py new file mode 100644 index 00000000..2e2a099f --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/ai_analytics/storage/__init__.py @@ -0,0 +1 @@ +"""AI Analytics storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/analytics/__init__.py b/apps/coordinator-api/src/app/contexts/analytics/__init__.py new file mode 100644 index 00000000..7dda8e63 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/analytics/__init__.py @@ -0,0 +1 @@ +"""Analytics context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/analytics/domain/__init__.py b/apps/coordinator-api/src/app/contexts/analytics/domain/__init__.py new file mode 100644 index 00000000..9f39264c --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/analytics/domain/__init__.py @@ -0,0 +1 @@ +"""Analytics domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/analytics/routers/__init__.py b/apps/coordinator-api/src/app/contexts/analytics/routers/__init__.py new file mode 100644 index 00000000..70569748 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/analytics/routers/__init__.py @@ -0,0 +1 @@ +"""Analytics routers.""" diff --git a/apps/coordinator-api/src/app/routers/analytics.py b/apps/coordinator-api/src/app/contexts/analytics/routers/analytics.py similarity index 99% rename from apps/coordinator-api/src/app/routers/analytics.py rename to apps/coordinator-api/src/app/contexts/analytics/routers/analytics.py index 9788185f..27fcd74d 100755 --- a/apps/coordinator-api/src/app/routers/analytics.py +++ b/apps/coordinator-api/src/app/contexts/analytics/routers/analytics.py @@ -18,7 +18,7 @@ from aitbc.rate_limiting import rate_limit logger = get_logger(__name__) -from ..domain.analytics import ( +from ....domain.analytics import ( AnalyticsPeriod, AnalyticsReport, DashboardConfig, @@ -28,8 +28,8 @@ from ..domain.analytics import ( MetricType, ReportType, ) -from ..services.ai_analytics.analytics import MarketplaceAnalytics -from ..storage import get_session +from ....services.ai_analytics.analytics import MarketplaceAnalytics +from ....storage import get_session router = APIRouter(prefix="/v1/analytics", tags=["analytics"]) diff --git a/apps/coordinator-api/src/app/contexts/analytics/services/__init__.py b/apps/coordinator-api/src/app/contexts/analytics/services/__init__.py new file mode 100644 index 00000000..251490f6 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/analytics/services/__init__.py @@ -0,0 +1 @@ +"""Analytics services.""" diff --git a/apps/coordinator-api/src/app/services/advanced_analytics.py b/apps/coordinator-api/src/app/contexts/analytics/services/advanced_analytics.py similarity index 100% rename from apps/coordinator-api/src/app/services/advanced_analytics.py rename to apps/coordinator-api/src/app/contexts/analytics/services/advanced_analytics.py diff --git a/apps/coordinator-api/src/app/services/performance_monitoring.py b/apps/coordinator-api/src/app/contexts/analytics/services/performance_monitoring.py similarity index 100% rename from apps/coordinator-api/src/app/services/performance_monitoring.py rename to apps/coordinator-api/src/app/contexts/analytics/services/performance_monitoring.py diff --git a/apps/coordinator-api/src/app/contexts/analytics/storage/__init__.py b/apps/coordinator-api/src/app/contexts/analytics/storage/__init__.py new file mode 100644 index 00000000..b7cb47ee --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/analytics/storage/__init__.py @@ -0,0 +1 @@ +"""Analytics storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/bounty/__init__.py b/apps/coordinator-api/src/app/contexts/bounty/__init__.py new file mode 100644 index 00000000..e35059ac --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/bounty/__init__.py @@ -0,0 +1 @@ +"""Bounty context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/bounty/domain/__init__.py b/apps/coordinator-api/src/app/contexts/bounty/domain/__init__.py new file mode 100644 index 00000000..77f28c3f --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/bounty/domain/__init__.py @@ -0,0 +1 @@ +"""Bounty domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/bounty/routers/__init__.py b/apps/coordinator-api/src/app/contexts/bounty/routers/__init__.py new file mode 100644 index 00000000..da68f739 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/bounty/routers/__init__.py @@ -0,0 +1 @@ +"""Bounty routers.""" diff --git a/apps/coordinator-api/src/app/routers/bounty.py b/apps/coordinator-api/src/app/contexts/bounty/routers/bounty.py similarity index 98% rename from apps/coordinator-api/src/app/routers/bounty.py rename to apps/coordinator-api/src/app/contexts/bounty/routers/bounty.py index 2a35e87a..79aa6fc7 100755 --- a/apps/coordinator-api/src/app/routers/bounty.py +++ b/apps/coordinator-api/src/app/contexts/bounty/routers/bounty.py @@ -14,8 +14,8 @@ from sqlalchemy.orm import Session from aitbc import get_logger from aitbc.rate_limiting import rate_limit -from ..auth import get_current_user -from ..domain.bounty import ( +from ....auth import get_current_user +from ....domain.bounty import ( Bounty, BountyIntegration, BountyStats, @@ -24,9 +24,9 @@ from ..domain.bounty import ( BountyTier, SubmissionStatus, ) -from ..services.blockchain_service import BlockchainService -from ..services.bounty_service import BountyService -from ..storage import get_session +from ....services.blockchain_service import BlockchainService +from ....services.bounty_service import BountyService +from ....storage import get_session router = APIRouter() @@ -271,7 +271,7 @@ async def get_bounty( async def submit_bounty_solution( request: Request, bounty_id: str, - request: BountySubmissionRequest, + submission_request: BountySubmissionRequest, background_tasks: BackgroundTasks, session: Session = Depends(get_session), bounty_service: BountyService = Depends(get_bounty_service), @@ -354,7 +354,7 @@ async def get_bounty_submissions( async def verify_bounty_submission( request: Request, bounty_id: str, - request: BountyVerificationRequest, + verification_request: BountyVerificationRequest, background_tasks: BackgroundTasks, session: Session = Depends(get_session), bounty_service: BountyService = Depends(get_bounty_service), @@ -396,7 +396,7 @@ async def verify_bounty_submission( async def dispute_bounty_submission( request: Request, bounty_id: str, - request: BountyDisputeRequest, + dispute_request: BountyDisputeRequest, background_tasks: BackgroundTasks, session: Session = Depends(get_session), bounty_service: BountyService = Depends(get_bounty_service), diff --git a/apps/coordinator-api/src/app/contexts/bounty/services/__init__.py b/apps/coordinator-api/src/app/contexts/bounty/services/__init__.py new file mode 100644 index 00000000..c4d3e2d2 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/bounty/services/__init__.py @@ -0,0 +1 @@ +"""Bounty services.""" diff --git a/apps/coordinator-api/src/app/contexts/bounty/storage/__init__.py b/apps/coordinator-api/src/app/contexts/bounty/storage/__init__.py new file mode 100644 index 00000000..7bc414a9 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/bounty/storage/__init__.py @@ -0,0 +1 @@ +"""Bounty storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/certification/__init__.py b/apps/coordinator-api/src/app/contexts/certification/__init__.py new file mode 100644 index 00000000..f637540f --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/certification/__init__.py @@ -0,0 +1 @@ +"""Certification context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/certification/domain/__init__.py b/apps/coordinator-api/src/app/contexts/certification/domain/__init__.py new file mode 100644 index 00000000..31633a1d --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/certification/domain/__init__.py @@ -0,0 +1 @@ +"""Certification domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/certification/routers/__init__.py b/apps/coordinator-api/src/app/contexts/certification/routers/__init__.py new file mode 100644 index 00000000..82569988 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/certification/routers/__init__.py @@ -0,0 +1 @@ +"""Certification routers.""" diff --git a/apps/coordinator-api/src/app/routers/certification.py b/apps/coordinator-api/src/app/contexts/certification/routers/certification.py similarity index 99% rename from apps/coordinator-api/src/app/routers/certification.py rename to apps/coordinator-api/src/app/contexts/certification/routers/certification.py index 0cfdee83..f8faa22c 100755 --- a/apps/coordinator-api/src/app/routers/certification.py +++ b/apps/coordinator-api/src/app/contexts/certification/routers/certification.py @@ -18,7 +18,7 @@ from aitbc.rate_limiting import rate_limit logger = get_logger(__name__) -from ..domain.certification import ( +from ....domain.certification import ( AchievementBadge, AgentBadge, AgentCertification, @@ -32,13 +32,13 @@ from ..domain.certification import ( VerificationRecord, VerificationType, ) -from ..services.certification import ( +from ....services.certification import ( BadgeSystem, CertificationAndPartnershipService, CertificationSystem, PartnershipManager, ) -from ..storage import get_session +from ....storage import get_session router = APIRouter(prefix="/v1/certification", tags=["certification"]) diff --git a/apps/coordinator-api/src/app/contexts/certification/services/__init__.py b/apps/coordinator-api/src/app/contexts/certification/services/__init__.py new file mode 100644 index 00000000..6700be86 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/certification/services/__init__.py @@ -0,0 +1 @@ +"""Certification services.""" diff --git a/apps/coordinator-api/src/app/services/certification/__init__.py b/apps/coordinator-api/src/app/contexts/certification/services/certification/__init__.py similarity index 100% rename from apps/coordinator-api/src/app/services/certification/__init__.py rename to apps/coordinator-api/src/app/contexts/certification/services/certification/__init__.py diff --git a/apps/coordinator-api/src/app/services/certification/badge_system.py b/apps/coordinator-api/src/app/contexts/certification/services/certification/badge_system.py similarity index 100% rename from apps/coordinator-api/src/app/services/certification/badge_system.py rename to apps/coordinator-api/src/app/contexts/certification/services/certification/badge_system.py diff --git a/apps/coordinator-api/src/app/services/certification/certification_system.py b/apps/coordinator-api/src/app/contexts/certification/services/certification/certification_system.py similarity index 100% rename from apps/coordinator-api/src/app/services/certification/certification_system.py rename to apps/coordinator-api/src/app/contexts/certification/services/certification/certification_system.py diff --git a/apps/coordinator-api/src/app/services/certification/partnership_manager.py b/apps/coordinator-api/src/app/contexts/certification/services/certification/partnership_manager.py similarity index 100% rename from apps/coordinator-api/src/app/services/certification/partnership_manager.py rename to apps/coordinator-api/src/app/contexts/certification/services/certification/partnership_manager.py diff --git a/apps/coordinator-api/src/app/services/certification/service.py b/apps/coordinator-api/src/app/contexts/certification/services/certification/service.py similarity index 100% rename from apps/coordinator-api/src/app/services/certification/service.py rename to apps/coordinator-api/src/app/contexts/certification/services/certification/service.py diff --git a/apps/coordinator-api/src/app/contexts/certification/storage/__init__.py b/apps/coordinator-api/src/app/contexts/certification/storage/__init__.py new file mode 100644 index 00000000..017f9288 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/certification/storage/__init__.py @@ -0,0 +1 @@ +"""Certification storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/community/__init__.py b/apps/coordinator-api/src/app/contexts/community/__init__.py new file mode 100644 index 00000000..e6799f7c --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/community/__init__.py @@ -0,0 +1 @@ +"""Community context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/community/domain/__init__.py b/apps/coordinator-api/src/app/contexts/community/domain/__init__.py new file mode 100644 index 00000000..3e41b1b6 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/community/domain/__init__.py @@ -0,0 +1 @@ +"""Community domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/community/routers/__init__.py b/apps/coordinator-api/src/app/contexts/community/routers/__init__.py new file mode 100644 index 00000000..b1defaec --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/community/routers/__init__.py @@ -0,0 +1 @@ +"""Community routers.""" diff --git a/apps/coordinator-api/src/app/routers/community.py b/apps/coordinator-api/src/app/contexts/community/routers/community.py similarity index 98% rename from apps/coordinator-api/src/app/routers/community.py rename to apps/coordinator-api/src/app/contexts/community/routers/community.py index cdc07fd3..6eb3598b 100755 --- a/apps/coordinator-api/src/app/routers/community.py +++ b/apps/coordinator-api/src/app/contexts/community/routers/community.py @@ -18,20 +18,20 @@ from aitbc import get_logger logger = get_logger(__name__) -from ..domain.community import ( +from ....domain.community import ( AgentSolution, CommunityPost, DeveloperProfile, Hackathon, InnovationLab, ) -from ..services.community_service import ( +from ....services.community_service import ( CommunityPlatformService, DeveloperEcosystemService, InnovationLabService, ThirdPartySolutionService, ) -from ..storage import get_session +from ....storage import get_session router = APIRouter(prefix="/community", tags=["community"]) @@ -136,9 +136,9 @@ async def publish_solution(request: SolutionPublishRequest, request_http: Reques @router.get("/solutions", response_model=list[AgentSolution]) @rate_limit(rate=100, per=60) async def list_solutions( + request: Request, category: str | None = None, limit: int = 50, - request: Request, session: Annotated[Session, Depends(get_session)] = Depends(get_session), ) -> list[AgentSolution]: """List available third-party agent solutions""" @@ -166,9 +166,9 @@ async def purchase_solution( @router.post("/labs/propose", response_model=InnovationLab) @rate_limit(rate=10, per=60) async def propose_innovation_lab( + request_http: Request, researcher_id: str = Query(...), request: LabProposalRequest = Body(...), - request_http: Request, session: Annotated[Session, Depends(get_session)] = Depends(get_session), ) -> InnovationLab: """Propose a new agent innovation lab or research program""" @@ -212,9 +212,9 @@ async def fund_innovation_lab( @router.post("/platform/posts", response_model=CommunityPost) @rate_limit(rate=20, per=60) async def create_community_post( + request_http: Request, author_id: str = Query(...), request: PostCreateRequest = Body(...), - request_http: Request, session: Annotated[Session, Depends(get_session)] = Depends(get_session), ) -> CommunityPost: """Create a new post in the community forum""" @@ -229,9 +229,9 @@ async def create_community_post( @router.get("/platform/feed", response_model=list[CommunityPost]) @rate_limit(rate=100, per=60) async def get_community_feed( + request: Request, category: str | None = None, limit: int = 20, - request: Request, session: Annotated[Session, Depends(get_session)] = Depends(get_session), ) -> list[CommunityPost]: """Get the latest community posts and discussions""" @@ -255,9 +255,9 @@ async def upvote_community_post(post_id: str, request: Request, session: Annotat @router.post("/hackathons/create", response_model=Hackathon) @rate_limit(rate=10, per=60) async def create_hackathon( + request_http: Request, organizer_id: str = Query(...), request: HackathonCreateRequest = Body(...), - request_http: Request, session: Annotated[Session, Depends(get_session)] = Depends(get_session), ) -> Hackathon: """Create a new agent innovation hackathon (requires high reputation)""" diff --git a/apps/coordinator-api/src/app/contexts/community/services/__init__.py b/apps/coordinator-api/src/app/contexts/community/services/__init__.py new file mode 100644 index 00000000..aab6edb3 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/community/services/__init__.py @@ -0,0 +1 @@ +"""Community services.""" diff --git a/apps/coordinator-api/src/app/contexts/community/storage/__init__.py b/apps/coordinator-api/src/app/contexts/community/storage/__init__.py new file mode 100644 index 00000000..abad5642 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/community/storage/__init__.py @@ -0,0 +1 @@ +"""Community storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/confidential/__init__.py b/apps/coordinator-api/src/app/contexts/confidential/__init__.py new file mode 100644 index 00000000..ee992bd7 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/confidential/__init__.py @@ -0,0 +1 @@ +"""Confidential context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/confidential/domain/__init__.py b/apps/coordinator-api/src/app/contexts/confidential/domain/__init__.py new file mode 100644 index 00000000..a982a31c --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/confidential/domain/__init__.py @@ -0,0 +1 @@ +"""Confidential domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/confidential/routers/__init__.py b/apps/coordinator-api/src/app/contexts/confidential/routers/__init__.py new file mode 100644 index 00000000..d91a0b52 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/confidential/routers/__init__.py @@ -0,0 +1 @@ +"""Confidential routers.""" diff --git a/apps/coordinator-api/src/app/routers/confidential.py b/apps/coordinator-api/src/app/contexts/confidential/routers/confidential.py similarity index 98% rename from apps/coordinator-api/src/app/routers/confidential.py rename to apps/coordinator-api/src/app/contexts/confidential/routers/confidential.py index b109e181..eef61192 100755 --- a/apps/coordinator-api/src/app/routers/confidential.py +++ b/apps/coordinator-api/src/app/contexts/confidential/routers/confidential.py @@ -13,8 +13,8 @@ from fastapi import APIRouter, Depends, HTTPException, Request from fastapi.security import HTTPBearer from aitbc.rate_limiting import rate_limit -from ..auth import get_api_key -from ..schemas import ( +from ....auth import get_api_key +from ....schemas import ( AccessLogQuery, AccessLogResponse, ConfidentialAccessRequest, @@ -25,9 +25,9 @@ from ..schemas import ( KeyRegistrationRequest, KeyRegistrationResponse, ) -from ..services.access_control import AccessController -from ..services.encryption import EncryptedData, EncryptionService -from ..services.key_management import KeyManagementError, KeyManager +from ....services.access_control import AccessController +from ....services.encryption import EncryptedData, EncryptionService +from ....services.key_management import KeyManagementError, KeyManager # Initialize router and security router = APIRouter(prefix="/confidential", tags=["confidential"]) diff --git a/apps/coordinator-api/src/app/contexts/confidential/services/__init__.py b/apps/coordinator-api/src/app/contexts/confidential/services/__init__.py new file mode 100644 index 00000000..5d8490a6 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/confidential/services/__init__.py @@ -0,0 +1 @@ +"""Confidential services.""" diff --git a/apps/coordinator-api/src/app/contexts/confidential/storage/__init__.py b/apps/coordinator-api/src/app/contexts/confidential/storage/__init__.py new file mode 100644 index 00000000..8455ca80 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/confidential/storage/__init__.py @@ -0,0 +1 @@ +"""Confidential storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/cross_chain/__init__.py b/apps/coordinator-api/src/app/contexts/cross_chain/__init__.py new file mode 100644 index 00000000..47c9d370 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/cross_chain/__init__.py @@ -0,0 +1 @@ +"""Cross-chain context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/cross_chain/domain/__init__.py b/apps/coordinator-api/src/app/contexts/cross_chain/domain/__init__.py new file mode 100644 index 00000000..fef5e725 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/cross_chain/domain/__init__.py @@ -0,0 +1 @@ +"""Cross-chain domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/cross_chain/routers/__init__.py b/apps/coordinator-api/src/app/contexts/cross_chain/routers/__init__.py new file mode 100644 index 00000000..507f6d49 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/cross_chain/routers/__init__.py @@ -0,0 +1 @@ +"""Cross-chain routers.""" diff --git a/apps/coordinator-api/src/app/routers/cross_chain_integration.py b/apps/coordinator-api/src/app/contexts/cross_chain/routers/cross_chain_integration.py similarity index 100% rename from apps/coordinator-api/src/app/routers/cross_chain_integration.py rename to apps/coordinator-api/src/app/contexts/cross_chain/routers/cross_chain_integration.py diff --git a/apps/coordinator-api/src/app/contexts/cross_chain/services/__init__.py b/apps/coordinator-api/src/app/contexts/cross_chain/services/__init__.py new file mode 100644 index 00000000..8481aea9 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/cross_chain/services/__init__.py @@ -0,0 +1 @@ +"""Cross-chain services.""" diff --git a/apps/coordinator-api/src/app/services/cross_chain/__init__.py b/apps/coordinator-api/src/app/contexts/cross_chain/services/cross_chain/__init__.py similarity index 100% rename from apps/coordinator-api/src/app/services/cross_chain/__init__.py rename to apps/coordinator-api/src/app/contexts/cross_chain/services/cross_chain/__init__.py diff --git a/apps/coordinator-api/src/app/services/cross_chain/bridge.py b/apps/coordinator-api/src/app/contexts/cross_chain/services/cross_chain/bridge.py similarity index 100% rename from apps/coordinator-api/src/app/services/cross_chain/bridge.py rename to apps/coordinator-api/src/app/contexts/cross_chain/services/cross_chain/bridge.py diff --git a/apps/coordinator-api/src/app/services/cross_chain/bridge_enhanced.py b/apps/coordinator-api/src/app/contexts/cross_chain/services/cross_chain/bridge_enhanced.py similarity index 100% rename from apps/coordinator-api/src/app/services/cross_chain/bridge_enhanced.py rename to apps/coordinator-api/src/app/contexts/cross_chain/services/cross_chain/bridge_enhanced.py diff --git a/apps/coordinator-api/src/app/services/cross_chain/reputation.py b/apps/coordinator-api/src/app/contexts/cross_chain/services/cross_chain/reputation.py similarity index 100% rename from apps/coordinator-api/src/app/services/cross_chain/reputation.py rename to apps/coordinator-api/src/app/contexts/cross_chain/services/cross_chain/reputation.py diff --git a/apps/coordinator-api/src/app/contexts/cross_chain/storage/__init__.py b/apps/coordinator-api/src/app/contexts/cross_chain/storage/__init__.py new file mode 100644 index 00000000..696fa3ef --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/cross_chain/storage/__init__.py @@ -0,0 +1 @@ +"""Cross-chain storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/developer_platform/__init__.py b/apps/coordinator-api/src/app/contexts/developer_platform/__init__.py new file mode 100644 index 00000000..91f6f161 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/developer_platform/__init__.py @@ -0,0 +1 @@ +"""Developer platform context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/developer_platform/domain/__init__.py b/apps/coordinator-api/src/app/contexts/developer_platform/domain/__init__.py new file mode 100644 index 00000000..ead8ae2b --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/developer_platform/domain/__init__.py @@ -0,0 +1 @@ +"""Developer platform domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/developer_platform/routers/__init__.py b/apps/coordinator-api/src/app/contexts/developer_platform/routers/__init__.py new file mode 100644 index 00000000..efb1d3c1 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/developer_platform/routers/__init__.py @@ -0,0 +1 @@ +"""Developer platform routers.""" diff --git a/apps/coordinator-api/src/app/routers/developer_platform.py b/apps/coordinator-api/src/app/contexts/developer_platform/routers/developer_platform.py similarity index 98% rename from apps/coordinator-api/src/app/routers/developer_platform.py rename to apps/coordinator-api/src/app/contexts/developer_platform/routers/developer_platform.py index df9e1d14..f8bd8958 100755 --- a/apps/coordinator-api/src/app/routers/developer_platform.py +++ b/apps/coordinator-api/src/app/contexts/developer_platform/routers/developer_platform.py @@ -11,17 +11,17 @@ from sqlmodel import Session, func, select from aitbc.rate_limiting import rate_limit -from ..domain.developer_platform import ( +from ....domain.developer_platform import ( BountyStatus, CertificationLevel, DeveloperCertification, DeveloperProfile, RegionalHub, ) -from ..schemas.developer_platform import BountyCreate, BountySubmissionCreate, CertificationGrant, DeveloperCreate -from ..services.developer_platform_service import DeveloperPlatformService -from ..services.governance_service import GovernanceService -from ..storage.db import get_session +from ....schemas.developer_platform import BountyCreate, BountySubmissionCreate, CertificationGrant, DeveloperCreate +from ....services.developer_platform_service import DeveloperPlatformService +from ....services.governance_service import GovernanceService +from ....storage.db import get_session router = APIRouter(prefix="/developer-platform", tags=["Developer Platform"]) @@ -127,9 +127,9 @@ async def update_developer_profile( @router.get("/leaderboard", response_model=list[dict[str, Any]]) @rate_limit(rate=200, per=60) async def get_leaderboard( + request: Request, limit: int = Query(100, ge=1, le=500, description="Maximum number of developers"), offset: int = Query(0, ge=0, description="Offset for pagination"), - request: Request, session: Session = Depends(get_session), dev_service: DeveloperPlatformService = Depends(get_developer_platform_service), ) -> list[dict[str, Any]]: @@ -207,10 +207,10 @@ async def create_bounty( @router.get("/bounties", response_model=list[dict[str, Any]]) @rate_limit(rate=200, per=60) async def list_bounties( + request: Request, status: BountyStatus | None = Query(None, description="Filter by bounty status"), limit: int = Query(100, ge=1, le=500, description="Maximum number of bounties"), offset: int = Query(0, ge=0, description="Offset for pagination"), - request: Request, session: Session = Depends(get_session), dev_service: DeveloperPlatformService = Depends(get_developer_platform_service), ) -> list[dict[str, Any]]: @@ -293,9 +293,9 @@ async def submit_bounty_solution( @rate_limit(rate=200, per=60) async def get_my_submissions( developer_id: str, + request: Request, limit: int = Query(100, ge=1, le=500, description="Maximum number of submissions"), offset: int = Query(0, ge=0, description="Offset for pagination"), - request: Request, session: Session = Depends(get_session), dev_service: DeveloperPlatformService = Depends(get_developer_platform_service), ) -> list[dict[str, Any]]: @@ -330,8 +330,8 @@ async def review_bounty_submission( submission_id: str, reviewer_address: str, review_notes: str, - approved: bool = Query(True, description="Whether to approve the submission"), request: Request, + approved: bool = Query(True, description="Whether to approve the submission"), session: Session = Depends(get_session), dev_service: DeveloperPlatformService = Depends(get_developer_platform_service), ) -> dict[str, Any]: diff --git a/apps/coordinator-api/src/app/contexts/developer_platform/services/__init__.py b/apps/coordinator-api/src/app/contexts/developer_platform/services/__init__.py new file mode 100644 index 00000000..e2b9ff9b --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/developer_platform/services/__init__.py @@ -0,0 +1 @@ +"""Developer platform services.""" diff --git a/apps/coordinator-api/src/app/contexts/developer_platform/storage/__init__.py b/apps/coordinator-api/src/app/contexts/developer_platform/storage/__init__.py new file mode 100644 index 00000000..205e7b0b --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/developer_platform/storage/__init__.py @@ -0,0 +1 @@ +"""Developer platform storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/ecosystem/__init__.py b/apps/coordinator-api/src/app/contexts/ecosystem/__init__.py new file mode 100644 index 00000000..8fdc14ce --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/ecosystem/__init__.py @@ -0,0 +1 @@ +"""Ecosystem context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/ecosystem/domain/__init__.py b/apps/coordinator-api/src/app/contexts/ecosystem/domain/__init__.py new file mode 100644 index 00000000..3778e87a --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/ecosystem/domain/__init__.py @@ -0,0 +1 @@ +"""Ecosystem domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/ecosystem/routers/__init__.py b/apps/coordinator-api/src/app/contexts/ecosystem/routers/__init__.py new file mode 100644 index 00000000..e9ab448a --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/ecosystem/routers/__init__.py @@ -0,0 +1 @@ +"""Ecosystem routers.""" diff --git a/apps/coordinator-api/src/app/routers/ecosystem_dashboard.py b/apps/coordinator-api/src/app/contexts/ecosystem/routers/ecosystem_dashboard.py similarity index 98% rename from apps/coordinator-api/src/app/routers/ecosystem_dashboard.py rename to apps/coordinator-api/src/app/contexts/ecosystem/routers/ecosystem_dashboard.py index b7c5c388..165f4a92 100755 --- a/apps/coordinator-api/src/app/routers/ecosystem_dashboard.py +++ b/apps/coordinator-api/src/app/contexts/ecosystem/routers/ecosystem_dashboard.py @@ -14,10 +14,10 @@ from sqlalchemy.orm import Session from aitbc import get_logger from aitbc.rate_limiting import rate_limit -from ..auth import get_current_user -from ..domain.bounty import AgentMetrics, BountyStats, EcosystemMetrics -from ..services.ecosystem_service import EcosystemService -from ..storage import get_session +from ....auth import get_current_user +from ....domain.bounty import AgentMetrics, BountyStats, EcosystemMetrics +from ....services.ecosystem_service import EcosystemService +from ....storage import get_session router = APIRouter() diff --git a/apps/coordinator-api/src/app/contexts/ecosystem/services/__init__.py b/apps/coordinator-api/src/app/contexts/ecosystem/services/__init__.py new file mode 100644 index 00000000..953efdca --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/ecosystem/services/__init__.py @@ -0,0 +1 @@ +"""Ecosystem services.""" diff --git a/apps/coordinator-api/src/app/contexts/ecosystem/storage/__init__.py b/apps/coordinator-api/src/app/contexts/ecosystem/storage/__init__.py new file mode 100644 index 00000000..615e3c08 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/ecosystem/storage/__init__.py @@ -0,0 +1 @@ +"""Ecosystem storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/enterprise_integration/__init__.py b/apps/coordinator-api/src/app/contexts/enterprise_integration/__init__.py new file mode 100644 index 00000000..b1aa1e18 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/enterprise_integration/__init__.py @@ -0,0 +1 @@ +"""Enterprise integration context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/enterprise_integration/domain/__init__.py b/apps/coordinator-api/src/app/contexts/enterprise_integration/domain/__init__.py new file mode 100644 index 00000000..e5f39303 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/enterprise_integration/domain/__init__.py @@ -0,0 +1 @@ +"""Enterprise integration domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/enterprise_integration/routers/__init__.py b/apps/coordinator-api/src/app/contexts/enterprise_integration/routers/__init__.py new file mode 100644 index 00000000..b3d6262c --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/enterprise_integration/routers/__init__.py @@ -0,0 +1 @@ +"""Enterprise integration routers.""" diff --git a/apps/coordinator-api/src/app/routers/partners.py b/apps/coordinator-api/src/app/contexts/enterprise_integration/routers/partners.py similarity index 99% rename from apps/coordinator-api/src/app/routers/partners.py rename to apps/coordinator-api/src/app/contexts/enterprise_integration/routers/partners.py index 3b4cedd7..97221ce1 100755 --- a/apps/coordinator-api/src/app/routers/partners.py +++ b/apps/coordinator-api/src/app/contexts/enterprise_integration/routers/partners.py @@ -16,7 +16,7 @@ from pydantic import BaseModel, Field from aitbc.rate_limiting import rate_limit -from ..storage import get_session +from ....storage import get_session router = APIRouter(tags=["partners"]) diff --git a/apps/coordinator-api/src/app/contexts/enterprise_integration/services/__init__.py b/apps/coordinator-api/src/app/contexts/enterprise_integration/services/__init__.py new file mode 100644 index 00000000..3c1b587e --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/enterprise_integration/services/__init__.py @@ -0,0 +1 @@ +"""Enterprise integration services.""" diff --git a/apps/coordinator-api/src/app/contexts/enterprise_integration/storage/__init__.py b/apps/coordinator-api/src/app/contexts/enterprise_integration/storage/__init__.py new file mode 100644 index 00000000..4297976b --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/enterprise_integration/storage/__init__.py @@ -0,0 +1 @@ +"""Enterprise integration storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/governance/__init__.py b/apps/coordinator-api/src/app/contexts/governance/__init__.py new file mode 100644 index 00000000..86ea1d14 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/governance/__init__.py @@ -0,0 +1 @@ +"""Governance context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/governance/domain/__init__.py b/apps/coordinator-api/src/app/contexts/governance/domain/__init__.py new file mode 100644 index 00000000..08c601e8 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/governance/domain/__init__.py @@ -0,0 +1 @@ +"""Governance domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/governance/routers/__init__.py b/apps/coordinator-api/src/app/contexts/governance/routers/__init__.py new file mode 100644 index 00000000..99d265b1 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/governance/routers/__init__.py @@ -0,0 +1 @@ +"""Governance routers.""" diff --git a/apps/coordinator-api/src/app/routers/governance.py b/apps/coordinator-api/src/app/contexts/governance/routers/governance.py similarity index 93% rename from apps/coordinator-api/src/app/routers/governance.py rename to apps/coordinator-api/src/app/contexts/governance/routers/governance.py index d3ac44ac..830ac49e 100755 --- a/apps/coordinator-api/src/app/routers/governance.py +++ b/apps/coordinator-api/src/app/contexts/governance/routers/governance.py @@ -20,15 +20,15 @@ from typing import Any from pydantic import BaseModel, Field -from ..domain.governance import ( +from ....domain.governance import ( GovernanceProfile, Proposal, TransparencyReport, Vote, VoteType, ) -from ..services.governance_service import GovernanceService -from ..storage import get_session +from ....services.governance_service import GovernanceService +from ....storage import get_session router = APIRouter(prefix="/governance", tags=["governance"]) @@ -96,12 +96,12 @@ async def create_proposal( request: Request, session: Annotated[Session, Depends(get_session)], proposer_id: str = Query(...), - request: ProposalCreateRequest = Body(...), + proposal_request: ProposalCreateRequest = Body(...), ) -> Proposal: """Submit a new governance proposal to the DAO""" service = GovernanceService(session) try: - proposal = await service.create_proposal(proposer_id, request.dict()) + proposal = await service.create_proposal(proposer_id, proposal_request.dict()) return proposal except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) @@ -116,13 +116,13 @@ async def cast_vote( proposal_id: str, session: Annotated[Session, Depends(get_session)], voter_id: str = Query(...), - request: VoteRequest = Body(...), + vote_request: VoteRequest = Body(...), ) -> Vote: """Cast a vote on an active proposal""" service = GovernanceService(session) try: vote = await service.cast_vote( - proposal_id=proposal_id, voter_id=voter_id, vote_type=request.vote_type, reason=request.reason + proposal_id=proposal_id, voter_id=voter_id, vote_type=vote_request.vote_type, reason=vote_request.reason ) return vote except ValueError as e: diff --git a/apps/coordinator-api/src/app/routers/governance_enhanced.py b/apps/coordinator-api/src/app/contexts/governance/routers/governance_enhanced.py similarity index 99% rename from apps/coordinator-api/src/app/routers/governance_enhanced.py rename to apps/coordinator-api/src/app/contexts/governance/routers/governance_enhanced.py index 7019b3e7..9438eece 100755 --- a/apps/coordinator-api/src/app/routers/governance_enhanced.py +++ b/apps/coordinator-api/src/app/contexts/governance/routers/governance_enhanced.py @@ -11,12 +11,12 @@ from sqlmodel import Session, func, select from aitbc.rate_limiting import rate_limit -from ..domain.governance import ( +from ....domain.governance import ( GovernanceProfile, VoteType, ) -from ..services.governance_service import GovernanceService -from ..storage.db import get_session +from ....services.governance_service import GovernanceService +from ....storage.db import get_session router = APIRouter(prefix="/governance-enhanced", tags=["Enhanced Governance"]) diff --git a/apps/coordinator-api/src/app/contexts/governance/services/__init__.py b/apps/coordinator-api/src/app/contexts/governance/services/__init__.py new file mode 100644 index 00000000..cf40b92f --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/governance/services/__init__.py @@ -0,0 +1 @@ +"""Governance services.""" diff --git a/apps/coordinator-api/src/app/services/dao_governance_service.py b/apps/coordinator-api/src/app/contexts/governance/services/dao_governance_service.py similarity index 96% rename from apps/coordinator-api/src/app/services/dao_governance_service.py rename to apps/coordinator-api/src/app/contexts/governance/services/dao_governance_service.py index 8c851874..698209ff 100755 --- a/apps/coordinator-api/src/app/services/dao_governance_service.py +++ b/apps/coordinator-api/src/app/contexts/governance/services/dao_governance_service.py @@ -12,9 +12,9 @@ from aitbc import get_logger from fastapi import HTTPException from sqlmodel import Session, select -from ..blockchain.contract_interactions import ContractInteractionService -from ..domain.dao_governance import DAOMember, DAOProposal, ProposalState, ProposalType, TreasuryAllocation, Vote -from ..schemas.dao_governance import AllocationCreate, MemberCreate, ProposalCreate, VoteCreate +from ...blockchain.contract_interactions import ContractInteractionService +from ....domain.dao_governance import DAOMember, DAOProposal, ProposalState, ProposalType, TreasuryAllocation, Vote +from ....schemas.dao_governance import AllocationCreate, MemberCreate, ProposalCreate, VoteCreate logger = logging.getLogger(__name__) diff --git a/apps/coordinator-api/src/app/services/governance_service.py b/apps/coordinator-api/src/app/contexts/governance/services/governance_service.py similarity index 99% rename from apps/coordinator-api/src/app/services/governance_service.py rename to apps/coordinator-api/src/app/contexts/governance/services/governance_service.py index 1a75fb58..226d1001 100755 --- a/apps/coordinator-api/src/app/services/governance_service.py +++ b/apps/coordinator-api/src/app/contexts/governance/services/governance_service.py @@ -12,7 +12,7 @@ from sqlmodel import Session, select logger = get_logger(__name__) -from ..domain.governance import ( +from ....domain.governance import ( DaoTreasury, GovernanceProfile, GovernanceRole, diff --git a/apps/coordinator-api/src/app/contexts/governance/storage/__init__.py b/apps/coordinator-api/src/app/contexts/governance/storage/__init__.py new file mode 100644 index 00000000..856471c9 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/governance/storage/__init__.py @@ -0,0 +1 @@ +"""Governance storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/gpu_multimodal/__init__.py b/apps/coordinator-api/src/app/contexts/gpu_multimodal/__init__.py new file mode 100644 index 00000000..c609275e --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/gpu_multimodal/__init__.py @@ -0,0 +1 @@ +"""GPU multimodal context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/gpu_multimodal/domain/__init__.py b/apps/coordinator-api/src/app/contexts/gpu_multimodal/domain/__init__.py new file mode 100644 index 00000000..e68b90d3 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/gpu_multimodal/domain/__init__.py @@ -0,0 +1 @@ +"""GPU multimodal domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/gpu_multimodal/routers/__init__.py b/apps/coordinator-api/src/app/contexts/gpu_multimodal/routers/__init__.py new file mode 100644 index 00000000..75ebd54d --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/gpu_multimodal/routers/__init__.py @@ -0,0 +1 @@ +"""GPU multimodal routers.""" diff --git a/apps/coordinator-api/src/app/routers/gpu_multimodal_health.py b/apps/coordinator-api/src/app/contexts/gpu_multimodal/routers/gpu_multimodal_health.py similarity index 99% rename from apps/coordinator-api/src/app/routers/gpu_multimodal_health.py rename to apps/coordinator-api/src/app/contexts/gpu_multimodal/routers/gpu_multimodal_health.py index 5747887a..914418bd 100755 --- a/apps/coordinator-api/src/app/routers/gpu_multimodal_health.py +++ b/apps/coordinator-api/src/app/contexts/gpu_multimodal/routers/gpu_multimodal_health.py @@ -16,7 +16,7 @@ from sqlalchemy.orm import Session from aitbc.rate_limiting import rate_limit -from ..storage import get_session +from ....storage import get_session router = APIRouter() diff --git a/apps/coordinator-api/src/app/contexts/gpu_multimodal/services/__init__.py b/apps/coordinator-api/src/app/contexts/gpu_multimodal/services/__init__.py new file mode 100644 index 00000000..54a10ead --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/gpu_multimodal/services/__init__.py @@ -0,0 +1 @@ +"""GPU multimodal services.""" diff --git a/apps/coordinator-api/src/app/contexts/gpu_multimodal/storage/__init__.py b/apps/coordinator-api/src/app/contexts/gpu_multimodal/storage/__init__.py new file mode 100644 index 00000000..13161018 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/gpu_multimodal/storage/__init__.py @@ -0,0 +1 @@ +"""GPU multimodal storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/hermes/__init__.py b/apps/coordinator-api/src/app/contexts/hermes/__init__.py new file mode 100644 index 00000000..726fad92 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/hermes/__init__.py @@ -0,0 +1 @@ +"""Hermes context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/hermes/domain/__init__.py b/apps/coordinator-api/src/app/contexts/hermes/domain/__init__.py new file mode 100644 index 00000000..27fe2863 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/hermes/domain/__init__.py @@ -0,0 +1 @@ +"""Hermes domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/hermes/routers/__init__.py b/apps/coordinator-api/src/app/contexts/hermes/routers/__init__.py new file mode 100644 index 00000000..23090ec8 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/hermes/routers/__init__.py @@ -0,0 +1 @@ +"""Hermes routers.""" diff --git a/apps/coordinator-api/src/app/routers/hermes_enhanced.py b/apps/coordinator-api/src/app/contexts/hermes/routers/hermes_enhanced.py similarity index 98% rename from apps/coordinator-api/src/app/routers/hermes_enhanced.py rename to apps/coordinator-api/src/app/contexts/hermes/routers/hermes_enhanced.py index 78f9bf15..49ff0231 100755 --- a/apps/coordinator-api/src/app/routers/hermes_enhanced.py +++ b/apps/coordinator-api/src/app/contexts/hermes/routers/hermes_enhanced.py @@ -14,8 +14,8 @@ logger = get_logger(__name__) from fastapi import APIRouter, Depends, HTTPException, Request from aitbc.rate_limiting import rate_limit -from ..deps import require_admin_key -from ..schemas.hermes_enhanced import ( +from ....deps import require_admin_key +from ....schemas.hermes_enhanced import ( AgentCollaborationRequest, AgentCollaborationResponse, EcosystemDevelopmentRequest, @@ -31,8 +31,8 @@ from ..schemas.hermes_enhanced import ( SkillRoutingRequest, SkillRoutingResponse, ) -from ..services.hermes_enhanced import hermesEnhancedService -from ..storage import get_session +from ....services.hermes_enhanced import hermesEnhancedService +from ....storage import get_session router = APIRouter(prefix="/hermes/enhanced", tags=["hermes Enhanced"]) diff --git a/apps/coordinator-api/src/app/routers/hermes_enhanced_app.py b/apps/coordinator-api/src/app/contexts/hermes/routers/hermes_enhanced_app.py similarity index 100% rename from apps/coordinator-api/src/app/routers/hermes_enhanced_app.py rename to apps/coordinator-api/src/app/contexts/hermes/routers/hermes_enhanced_app.py diff --git a/apps/coordinator-api/src/app/routers/hermes_enhanced_health.py b/apps/coordinator-api/src/app/contexts/hermes/routers/hermes_enhanced_health.py similarity index 98% rename from apps/coordinator-api/src/app/routers/hermes_enhanced_health.py rename to apps/coordinator-api/src/app/contexts/hermes/routers/hermes_enhanced_health.py index 0e59756c..f2a2e9c0 100755 --- a/apps/coordinator-api/src/app/routers/hermes_enhanced_health.py +++ b/apps/coordinator-api/src/app/contexts/hermes/routers/hermes_enhanced_health.py @@ -17,8 +17,8 @@ from aitbc.rate_limiting import rate_limit from aitbc import get_logger -from ..services.hermes_enhanced import hermesEnhancedService -from ..storage import get_session +from ....services.hermes_enhanced import hermesEnhancedService +from ....storage import get_session router = APIRouter() logger = get_logger(__name__) diff --git a/apps/coordinator-api/src/app/routers/hermes_enhanced_simple.py b/apps/coordinator-api/src/app/contexts/hermes/routers/hermes_enhanced_simple.py similarity index 98% rename from apps/coordinator-api/src/app/routers/hermes_enhanced_simple.py rename to apps/coordinator-api/src/app/contexts/hermes/routers/hermes_enhanced_simple.py index c5b20742..91793499 100755 --- a/apps/coordinator-api/src/app/routers/hermes_enhanced_simple.py +++ b/apps/coordinator-api/src/app/contexts/hermes/routers/hermes_enhanced_simple.py @@ -18,9 +18,9 @@ from pydantic import BaseModel, Field from sqlmodel import Session from aitbc.rate_limiting import rate_limit -from ..deps import require_admin_key -from ..services.hermes_enhanced_simple import hermesEnhancedService, SkillType -from ..storage import get_session +from ....deps import require_admin_key +from ....services.hermes_enhanced_simple import hermesEnhancedService, SkillType +from ....storage import get_session router = APIRouter(prefix="/hermes/enhanced", tags=["hermes Enhanced"]) diff --git a/apps/coordinator-api/src/app/contexts/hermes/services/__init__.py b/apps/coordinator-api/src/app/contexts/hermes/services/__init__.py new file mode 100644 index 00000000..377ca26a --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/hermes/services/__init__.py @@ -0,0 +1 @@ +"""Hermes services.""" diff --git a/apps/coordinator-api/src/app/services/hermes_enhanced.py b/apps/coordinator-api/src/app/contexts/hermes/services/hermes_enhanced.py similarity index 98% rename from apps/coordinator-api/src/app/services/hermes_enhanced.py rename to apps/coordinator-api/src/app/contexts/hermes/services/hermes_enhanced.py index b5f4460b..60e057c4 100755 --- a/apps/coordinator-api/src/app/services/hermes_enhanced.py +++ b/apps/coordinator-api/src/app/contexts/hermes/services/hermes_enhanced.py @@ -12,8 +12,8 @@ from uuid import uuid4 from sqlmodel import Session -from ..services.agent_coordination.integration import AgentIntegrationManager -from ..services.agent_coordination.agent_service import AgentStateManager, AIAgentOrchestrator +from ....services.agent_coordination.integration import AgentIntegrationManager +from ....services.agent_coordination.agent_service import AgentStateManager, AIAgentOrchestrator class SkillType(StrEnum): diff --git a/apps/coordinator-api/src/app/services/hermes_enhanced_simple.py b/apps/coordinator-api/src/app/contexts/hermes/services/hermes_enhanced_simple.py similarity index 100% rename from apps/coordinator-api/src/app/services/hermes_enhanced_simple.py rename to apps/coordinator-api/src/app/contexts/hermes/services/hermes_enhanced_simple.py diff --git a/apps/coordinator-api/src/app/contexts/hermes/storage/__init__.py b/apps/coordinator-api/src/app/contexts/hermes/storage/__init__.py new file mode 100644 index 00000000..693199bd --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/hermes/storage/__init__.py @@ -0,0 +1 @@ +"""Hermes storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/infrastructure/__init__.py b/apps/coordinator-api/src/app/contexts/infrastructure/__init__.py new file mode 100644 index 00000000..a28b38f4 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/infrastructure/__init__.py @@ -0,0 +1 @@ +"""Infrastructure context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/infrastructure/domain/__init__.py b/apps/coordinator-api/src/app/contexts/infrastructure/domain/__init__.py new file mode 100644 index 00000000..948c21dd --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/infrastructure/domain/__init__.py @@ -0,0 +1 @@ +"""Infrastructure domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/infrastructure/routers/__init__.py b/apps/coordinator-api/src/app/contexts/infrastructure/routers/__init__.py new file mode 100644 index 00000000..e8c3b3ab --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/infrastructure/routers/__init__.py @@ -0,0 +1 @@ +"""Infrastructure routers.""" diff --git a/apps/coordinator-api/src/app/routers/monitor.py b/apps/coordinator-api/src/app/contexts/infrastructure/routers/monitor.py similarity index 100% rename from apps/coordinator-api/src/app/routers/monitor.py rename to apps/coordinator-api/src/app/contexts/infrastructure/routers/monitor.py diff --git a/apps/coordinator-api/src/app/routers/monitoring_dashboard.py b/apps/coordinator-api/src/app/contexts/infrastructure/routers/monitoring_dashboard.py similarity index 100% rename from apps/coordinator-api/src/app/routers/monitoring_dashboard.py rename to apps/coordinator-api/src/app/contexts/infrastructure/routers/monitoring_dashboard.py diff --git a/apps/coordinator-api/src/app/contexts/infrastructure/services/__init__.py b/apps/coordinator-api/src/app/contexts/infrastructure/services/__init__.py new file mode 100644 index 00000000..6ed8d16b --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/infrastructure/services/__init__.py @@ -0,0 +1 @@ +"""Infrastructure services.""" diff --git a/apps/coordinator-api/src/app/contexts/infrastructure/storage/__init__.py b/apps/coordinator-api/src/app/contexts/infrastructure/storage/__init__.py new file mode 100644 index 00000000..e7f6b179 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/infrastructure/storage/__init__.py @@ -0,0 +1 @@ +"""Infrastructure storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/multimodal/__init__.py b/apps/coordinator-api/src/app/contexts/multimodal/__init__.py new file mode 100644 index 00000000..d0cb2681 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/multimodal/__init__.py @@ -0,0 +1 @@ +"""Multimodal context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/multimodal/domain/__init__.py b/apps/coordinator-api/src/app/contexts/multimodal/domain/__init__.py new file mode 100644 index 00000000..97657ea9 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/multimodal/domain/__init__.py @@ -0,0 +1 @@ +"""Multimodal domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/multimodal/routers/__init__.py b/apps/coordinator-api/src/app/contexts/multimodal/routers/__init__.py new file mode 100644 index 00000000..539646b3 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/multimodal/routers/__init__.py @@ -0,0 +1 @@ +"""Multimodal routers.""" diff --git a/apps/coordinator-api/src/app/routers/modality_optimization_health.py b/apps/coordinator-api/src/app/contexts/multimodal/routers/modality_optimization_health.py similarity index 99% rename from apps/coordinator-api/src/app/routers/modality_optimization_health.py rename to apps/coordinator-api/src/app/contexts/multimodal/routers/modality_optimization_health.py index 81c7ac52..f7f8b1fe 100755 --- a/apps/coordinator-api/src/app/routers/modality_optimization_health.py +++ b/apps/coordinator-api/src/app/contexts/multimodal/routers/modality_optimization_health.py @@ -16,7 +16,7 @@ from sqlalchemy.orm import Session from aitbc.rate_limiting import rate_limit from aitbc import get_logger -from ..storage import get_session +from ....storage import get_session router = APIRouter() diff --git a/apps/coordinator-api/src/app/routers/multi_modal_rl.py b/apps/coordinator-api/src/app/contexts/multimodal/routers/multi_modal_rl.py similarity index 100% rename from apps/coordinator-api/src/app/routers/multi_modal_rl.py rename to apps/coordinator-api/src/app/contexts/multimodal/routers/multi_modal_rl.py diff --git a/apps/coordinator-api/src/app/routers/multimodal_health.py b/apps/coordinator-api/src/app/contexts/multimodal/routers/multimodal_health.py similarity index 98% rename from apps/coordinator-api/src/app/routers/multimodal_health.py rename to apps/coordinator-api/src/app/contexts/multimodal/routers/multimodal_health.py index 504572c8..df9ff1a2 100755 --- a/apps/coordinator-api/src/app/routers/multimodal_health.py +++ b/apps/coordinator-api/src/app/contexts/multimodal/routers/multimodal_health.py @@ -15,8 +15,8 @@ from sqlalchemy.orm import Session from aitbc.rate_limiting import rate_limit -from ..services.multimodal_agent import MultiModalAgentService -from ..storage import get_session +from ....services.multimodal_agent import MultiModalAgentService +from ....storage import get_session router = APIRouter() diff --git a/apps/coordinator-api/src/app/contexts/multimodal/services/__init__.py b/apps/coordinator-api/src/app/contexts/multimodal/services/__init__.py new file mode 100644 index 00000000..ac8178dc --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/multimodal/services/__init__.py @@ -0,0 +1 @@ +"""Multimodal services.""" diff --git a/apps/coordinator-api/src/app/services/modality_optimization.py b/apps/coordinator-api/src/app/contexts/multimodal/services/modality_optimization.py similarity index 100% rename from apps/coordinator-api/src/app/services/modality_optimization.py rename to apps/coordinator-api/src/app/contexts/multimodal/services/modality_optimization.py diff --git a/apps/coordinator-api/src/app/services/multi_modal_fusion/__init__.py b/apps/coordinator-api/src/app/contexts/multimodal/services/multi_modal_fusion/__init__.py similarity index 100% rename from apps/coordinator-api/src/app/services/multi_modal_fusion/__init__.py rename to apps/coordinator-api/src/app/contexts/multimodal/services/multi_modal_fusion/__init__.py diff --git a/apps/coordinator-api/src/app/services/multi_modal_fusion/fusion_engine.py b/apps/coordinator-api/src/app/contexts/multimodal/services/multi_modal_fusion/fusion_engine.py similarity index 100% rename from apps/coordinator-api/src/app/services/multi_modal_fusion/fusion_engine.py rename to apps/coordinator-api/src/app/contexts/multimodal/services/multi_modal_fusion/fusion_engine.py diff --git a/apps/coordinator-api/src/app/services/multi_modal_fusion/neural_modules.py b/apps/coordinator-api/src/app/contexts/multimodal/services/multi_modal_fusion/neural_modules.py similarity index 100% rename from apps/coordinator-api/src/app/services/multi_modal_fusion/neural_modules.py rename to apps/coordinator-api/src/app/contexts/multimodal/services/multi_modal_fusion/neural_modules.py diff --git a/apps/coordinator-api/src/app/services/multimodal_agent.py b/apps/coordinator-api/src/app/contexts/multimodal/services/multimodal_agent.py similarity index 100% rename from apps/coordinator-api/src/app/services/multimodal_agent.py rename to apps/coordinator-api/src/app/contexts/multimodal/services/multimodal_agent.py diff --git a/apps/coordinator-api/src/app/contexts/multimodal/storage/__init__.py b/apps/coordinator-api/src/app/contexts/multimodal/storage/__init__.py new file mode 100644 index 00000000..c464fd66 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/multimodal/storage/__init__.py @@ -0,0 +1 @@ +"""Multimodal storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/reputation/__init__.py b/apps/coordinator-api/src/app/contexts/reputation/__init__.py new file mode 100644 index 00000000..3c927d3b --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/reputation/__init__.py @@ -0,0 +1 @@ +"""Reputation context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/reputation/domain/__init__.py b/apps/coordinator-api/src/app/contexts/reputation/domain/__init__.py new file mode 100644 index 00000000..62fe4cd4 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/reputation/domain/__init__.py @@ -0,0 +1 @@ +"""Reputation domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/reputation/routers/__init__.py b/apps/coordinator-api/src/app/contexts/reputation/routers/__init__.py new file mode 100644 index 00000000..03fc8669 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/reputation/routers/__init__.py @@ -0,0 +1 @@ +"""Reputation routers.""" diff --git a/apps/coordinator-api/src/app/routers/reputation.py b/apps/coordinator-api/src/app/contexts/reputation/routers/reputation.py similarity index 99% rename from apps/coordinator-api/src/app/routers/reputation.py rename to apps/coordinator-api/src/app/contexts/reputation/routers/reputation.py index ab1aa059..00373043 100755 --- a/apps/coordinator-api/src/app/routers/reputation.py +++ b/apps/coordinator-api/src/app/contexts/reputation/routers/reputation.py @@ -20,9 +20,9 @@ logger = get_logger(__name__) from sqlmodel import Field, func, select -from ..domain.reputation import AgentReputation, CommunityFeedback, ReputationLevel, TrustScoreCategory -from ..services.reputation_service import ReputationService -from ..storage import get_session +from ....domain.reputation import AgentReputation, CommunityFeedback, ReputationLevel, TrustScoreCategory +from ....services.reputation_service import ReputationService +from ....storage import get_session router = APIRouter(prefix="/v1/reputation", tags=["reputation"]) diff --git a/apps/coordinator-api/src/app/contexts/reputation/services/__init__.py b/apps/coordinator-api/src/app/contexts/reputation/services/__init__.py new file mode 100644 index 00000000..c39c9a0f --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/reputation/services/__init__.py @@ -0,0 +1 @@ +"""Reputation services.""" diff --git a/apps/coordinator-api/src/app/services/reputation_service.py b/apps/coordinator-api/src/app/contexts/reputation/services/reputation_service.py similarity index 99% rename from apps/coordinator-api/src/app/services/reputation_service.py rename to apps/coordinator-api/src/app/contexts/reputation/services/reputation_service.py index a7bef2f8..00759bf1 100755 --- a/apps/coordinator-api/src/app/services/reputation_service.py +++ b/apps/coordinator-api/src/app/contexts/reputation/services/reputation_service.py @@ -12,7 +12,7 @@ logger = get_logger(__name__) from sqlmodel import Session, and_, func, select -from ..domain.reputation import ( +from ....domain.reputation import ( AgentReputation, CommunityFeedback, ReputationEvent, diff --git a/apps/coordinator-api/src/app/contexts/reputation/storage/__init__.py b/apps/coordinator-api/src/app/contexts/reputation/storage/__init__.py new file mode 100644 index 00000000..7bb0d7f1 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/reputation/storage/__init__.py @@ -0,0 +1 @@ +"""Reputation storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/rewards/__init__.py b/apps/coordinator-api/src/app/contexts/rewards/__init__.py new file mode 100644 index 00000000..1f1df115 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/rewards/__init__.py @@ -0,0 +1 @@ +"""Rewards context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/rewards/domain/__init__.py b/apps/coordinator-api/src/app/contexts/rewards/domain/__init__.py new file mode 100644 index 00000000..f458b686 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/rewards/domain/__init__.py @@ -0,0 +1 @@ +"""Rewards domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/rewards/routers/__init__.py b/apps/coordinator-api/src/app/contexts/rewards/routers/__init__.py new file mode 100644 index 00000000..f75f5447 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/rewards/routers/__init__.py @@ -0,0 +1 @@ +"""Rewards routers.""" diff --git a/apps/coordinator-api/src/app/routers/rewards.py b/apps/coordinator-api/src/app/contexts/rewards/routers/rewards.py similarity index 99% rename from apps/coordinator-api/src/app/routers/rewards.py rename to apps/coordinator-api/src/app/contexts/rewards/routers/rewards.py index a033d93e..b9a14332 100755 --- a/apps/coordinator-api/src/app/routers/rewards.py +++ b/apps/coordinator-api/src/app/contexts/rewards/routers/rewards.py @@ -18,9 +18,9 @@ from aitbc.rate_limiting import rate_limit logger = get_logger(__name__) -from ..domain.rewards import AgentRewardProfile, RewardStatus, RewardTier, RewardType -from ..services.reward_service import RewardEngine -from ..storage import get_session +from ....domain.rewards import AgentRewardProfile, RewardStatus, RewardTier, RewardType +from ....services.reward_service import RewardEngine +from ....storage import get_session router = APIRouter(prefix="/v1/rewards", tags=["rewards"]) diff --git a/apps/coordinator-api/src/app/contexts/rewards/services/__init__.py b/apps/coordinator-api/src/app/contexts/rewards/services/__init__.py new file mode 100644 index 00000000..958b6c0c --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/rewards/services/__init__.py @@ -0,0 +1 @@ +"""Rewards services.""" diff --git a/apps/coordinator-api/src/app/services/reward_service.py b/apps/coordinator-api/src/app/contexts/rewards/services/reward_service.py similarity index 99% rename from apps/coordinator-api/src/app/services/reward_service.py rename to apps/coordinator-api/src/app/contexts/rewards/services/reward_service.py index 0c1c0a44..f1960902 100755 --- a/apps/coordinator-api/src/app/services/reward_service.py +++ b/apps/coordinator-api/src/app/contexts/rewards/services/reward_service.py @@ -13,8 +13,8 @@ logger = get_logger(__name__) from sqlmodel import Session, and_, select -from ..domain.reputation import AgentReputation -from ..domain.rewards import ( +from ....domain.reputation import AgentReputation +from ....domain.rewards import ( AgentRewardProfile, RewardCalculation, RewardDistribution, diff --git a/apps/coordinator-api/src/app/contexts/rewards/storage/__init__.py b/apps/coordinator-api/src/app/contexts/rewards/storage/__init__.py new file mode 100644 index 00000000..45c1b25a --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/rewards/storage/__init__.py @@ -0,0 +1 @@ +"""Rewards storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/security/__init__.py b/apps/coordinator-api/src/app/contexts/security/__init__.py new file mode 100644 index 00000000..79025671 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/security/__init__.py @@ -0,0 +1 @@ +"""Security context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/security/domain/__init__.py b/apps/coordinator-api/src/app/contexts/security/domain/__init__.py new file mode 100644 index 00000000..591e2564 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/security/domain/__init__.py @@ -0,0 +1 @@ +"""Security domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/security/routers/__init__.py b/apps/coordinator-api/src/app/contexts/security/routers/__init__.py new file mode 100644 index 00000000..d44e5647 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/security/routers/__init__.py @@ -0,0 +1 @@ +"""Security routers.""" diff --git a/apps/coordinator-api/src/app/routers/agent_security_router.py b/apps/coordinator-api/src/app/contexts/security/routers/agent_security_router.py similarity index 99% rename from apps/coordinator-api/src/app/routers/agent_security_router.py rename to apps/coordinator-api/src/app/contexts/security/routers/agent_security_router.py index 57af404d..de8a4756 100755 --- a/apps/coordinator-api/src/app/routers/agent_security_router.py +++ b/apps/coordinator-api/src/app/contexts/security/routers/agent_security_router.py @@ -16,9 +16,9 @@ logger = get_logger(__name__) from sqlmodel import Session, select -from ..deps import require_admin_key -from ..domain.agent import AIAgentWorkflow -from ..services.agent_coordination.security import ( +from ....deps import require_admin_key +from ....domain.agent import AIAgentWorkflow +from ....services.agent_coordination.security import ( AgentAuditLog, AgentAuditor, AgentSandboxManager, @@ -29,7 +29,7 @@ from ..services.agent_coordination.security import ( AuditEventType, SecurityLevel, ) -from ..storage import get_session +from ....storage import get_session router = APIRouter(prefix="/agents/security", tags=["Agent Security"]) diff --git a/apps/coordinator-api/src/app/contexts/security/services/__init__.py b/apps/coordinator-api/src/app/contexts/security/services/__init__.py new file mode 100644 index 00000000..22f4e837 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/security/services/__init__.py @@ -0,0 +1 @@ +"""Security services.""" diff --git a/apps/coordinator-api/src/app/services/access_control.py b/apps/coordinator-api/src/app/contexts/security/services/access_control.py similarity index 100% rename from apps/coordinator-api/src/app/services/access_control.py rename to apps/coordinator-api/src/app/contexts/security/services/access_control.py diff --git a/apps/coordinator-api/src/app/services/encryption.py b/apps/coordinator-api/src/app/contexts/security/services/encryption.py similarity index 100% rename from apps/coordinator-api/src/app/services/encryption.py rename to apps/coordinator-api/src/app/contexts/security/services/encryption.py diff --git a/apps/coordinator-api/src/app/services/hsm_key_manager.py b/apps/coordinator-api/src/app/contexts/security/services/hsm_key_manager.py similarity index 100% rename from apps/coordinator-api/src/app/services/hsm_key_manager.py rename to apps/coordinator-api/src/app/contexts/security/services/hsm_key_manager.py diff --git a/apps/coordinator-api/src/app/services/key_management.py b/apps/coordinator-api/src/app/contexts/security/services/key_management.py similarity index 100% rename from apps/coordinator-api/src/app/services/key_management.py rename to apps/coordinator-api/src/app/contexts/security/services/key_management.py diff --git a/apps/coordinator-api/src/app/services/kyc_aml_providers.py b/apps/coordinator-api/src/app/contexts/security/services/kyc_aml_providers.py similarity index 100% rename from apps/coordinator-api/src/app/services/kyc_aml_providers.py rename to apps/coordinator-api/src/app/contexts/security/services/kyc_aml_providers.py diff --git a/apps/coordinator-api/src/app/services/quota_enforcement.py b/apps/coordinator-api/src/app/contexts/security/services/quota_enforcement.py similarity index 100% rename from apps/coordinator-api/src/app/services/quota_enforcement.py rename to apps/coordinator-api/src/app/contexts/security/services/quota_enforcement.py diff --git a/apps/coordinator-api/src/app/services/trading_surveillance.py b/apps/coordinator-api/src/app/contexts/security/services/trading_surveillance.py similarity index 100% rename from apps/coordinator-api/src/app/services/trading_surveillance.py rename to apps/coordinator-api/src/app/contexts/security/services/trading_surveillance.py diff --git a/apps/coordinator-api/src/app/contexts/security/storage/__init__.py b/apps/coordinator-api/src/app/contexts/security/storage/__init__.py new file mode 100644 index 00000000..3a65162f --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/security/storage/__init__.py @@ -0,0 +1 @@ +"""Security storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/settlement/__init__.py b/apps/coordinator-api/src/app/contexts/settlement/__init__.py new file mode 100644 index 00000000..558ee406 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/settlement/__init__.py @@ -0,0 +1 @@ +"""Settlement context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/settlement/domain/__init__.py b/apps/coordinator-api/src/app/contexts/settlement/domain/__init__.py new file mode 100644 index 00000000..63ab3fc4 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/settlement/domain/__init__.py @@ -0,0 +1 @@ +"""Settlement domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/settlement/routers/__init__.py b/apps/coordinator-api/src/app/contexts/settlement/routers/__init__.py new file mode 100644 index 00000000..42ee0299 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/settlement/routers/__init__.py @@ -0,0 +1 @@ +"""Settlement routers.""" diff --git a/apps/coordinator-api/src/app/routers/settlement.py b/apps/coordinator-api/src/app/contexts/settlement/routers/settlement.py similarity index 99% rename from apps/coordinator-api/src/app/routers/settlement.py rename to apps/coordinator-api/src/app/contexts/settlement/routers/settlement.py index e6f5e3cf..7051938a 100644 --- a/apps/coordinator-api/src/app/routers/settlement.py +++ b/apps/coordinator-api/src/app/contexts/settlement/routers/settlement.py @@ -10,7 +10,7 @@ from pydantic import BaseModel, Field from aitbc.rate_limiting import rate_limit -from ..auth import get_api_key +from ....auth import get_api_key from .settlement.manager import BridgeManager router = APIRouter(prefix="/settlement", tags=["settlement"]) diff --git a/apps/coordinator-api/src/app/contexts/settlement/services/__init__.py b/apps/coordinator-api/src/app/contexts/settlement/services/__init__.py new file mode 100644 index 00000000..7f9ff8d4 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/settlement/services/__init__.py @@ -0,0 +1 @@ +"""Settlement services.""" diff --git a/apps/coordinator-api/src/app/contexts/settlement/storage/__init__.py b/apps/coordinator-api/src/app/contexts/settlement/storage/__init__.py new file mode 100644 index 00000000..47297345 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/settlement/storage/__init__.py @@ -0,0 +1 @@ +"""Settlement storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/staking/__init__.py b/apps/coordinator-api/src/app/contexts/staking/__init__.py new file mode 100644 index 00000000..96ba3a3f --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/staking/__init__.py @@ -0,0 +1 @@ +"""Staking context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/staking/domain/__init__.py b/apps/coordinator-api/src/app/contexts/staking/domain/__init__.py new file mode 100644 index 00000000..f8511abc --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/staking/domain/__init__.py @@ -0,0 +1 @@ +"""Staking domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/staking/routers/__init__.py b/apps/coordinator-api/src/app/contexts/staking/routers/__init__.py new file mode 100644 index 00000000..0bcd9ef3 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/staking/routers/__init__.py @@ -0,0 +1 @@ +"""Staking routers.""" diff --git a/apps/coordinator-api/src/app/routers/staking.py b/apps/coordinator-api/src/app/contexts/staking/routers/staking.py similarity index 98% rename from apps/coordinator-api/src/app/routers/staking.py rename to apps/coordinator-api/src/app/contexts/staking/routers/staking.py index 7d0c7cb3..7916df5d 100755 --- a/apps/coordinator-api/src/app/routers/staking.py +++ b/apps/coordinator-api/src/app/contexts/staking/routers/staking.py @@ -14,11 +14,11 @@ from sqlalchemy.orm import Session from aitbc import get_logger from aitbc.rate_limiting import rate_limit -from ..auth import get_current_user -from ..domain.bounty import AgentMetrics, AgentStake, EcosystemMetrics, PerformanceTier, StakeStatus, StakingPool -from ..services.blockchain_service import BlockchainService -from ..services.staking_service import StakingService -from ..storage import get_session +from ....auth import get_current_user +from ....domain.bounty import AgentMetrics, AgentStake, EcosystemMetrics, PerformanceTier, StakeStatus, StakingPool +from ....services.blockchain_service import BlockchainService +from ....services.staking_service import StakingService +from ....storage import get_session router = APIRouter() @@ -249,7 +249,7 @@ async def get_stakes( async def add_to_stake( request: Request, stake_id: str, - request: StakeUpdateRequest, + stake_request: StakeUpdateRequest, background_tasks: BackgroundTasks, session: Session = Depends(get_session), staking_service: StakingService = Depends(get_staking_service), @@ -491,7 +491,7 @@ async def get_agent_apy( async def update_agent_performance( request: Request, agent_wallet: str, - request: AgentPerformanceUpdateRequest, + performance_request: AgentPerformanceUpdateRequest, background_tasks: BackgroundTasks, session: Session = Depends(get_session), staking_service: StakingService = Depends(get_staking_service), @@ -531,7 +531,7 @@ async def update_agent_performance( async def distribute_agent_earnings( request: Request, agent_wallet: str, - request: EarningsDistributionRequest, + earnings_request: EarningsDistributionRequest, background_tasks: BackgroundTasks, session: Session = Depends(get_session), staking_service: StakingService = Depends(get_staking_service), diff --git a/apps/coordinator-api/src/app/contexts/staking/services/__init__.py b/apps/coordinator-api/src/app/contexts/staking/services/__init__.py new file mode 100644 index 00000000..6d1de9fe --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/staking/services/__init__.py @@ -0,0 +1 @@ +"""Staking services.""" diff --git a/apps/coordinator-api/src/app/services/staking_service.py b/apps/coordinator-api/src/app/contexts/staking/services/staking_service.py similarity index 99% rename from apps/coordinator-api/src/app/services/staking_service.py rename to apps/coordinator-api/src/app/contexts/staking/services/staking_service.py index 6c6d6231..aaf7b98e 100755 --- a/apps/coordinator-api/src/app/services/staking_service.py +++ b/apps/coordinator-api/src/app/contexts/staking/services/staking_service.py @@ -10,7 +10,7 @@ from sqlalchemy import and_, func, select from sqlalchemy.orm import Session from aitbc import get_logger -from ..domain.bounty import AgentMetrics, AgentStake, PerformanceTier, StakeStatus, StakingPool +from ....domain.bounty import AgentMetrics, AgentStake, PerformanceTier, StakeStatus, StakingPool logger = get_logger(__name__) diff --git a/apps/coordinator-api/src/app/contexts/staking/storage/__init__.py b/apps/coordinator-api/src/app/contexts/staking/storage/__init__.py new file mode 100644 index 00000000..0ef1d8e9 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/staking/storage/__init__.py @@ -0,0 +1 @@ +"""Staking storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/trading/__init__.py b/apps/coordinator-api/src/app/contexts/trading/__init__.py new file mode 100644 index 00000000..ec34f662 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/trading/__init__.py @@ -0,0 +1 @@ +"""Trading context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/trading/domain/__init__.py b/apps/coordinator-api/src/app/contexts/trading/domain/__init__.py new file mode 100644 index 00000000..9bfb6d46 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/trading/domain/__init__.py @@ -0,0 +1 @@ +"""Trading domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/trading/routers/__init__.py b/apps/coordinator-api/src/app/contexts/trading/routers/__init__.py new file mode 100644 index 00000000..4de0ed56 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/trading/routers/__init__.py @@ -0,0 +1 @@ +"""Trading routers.""" diff --git a/apps/coordinator-api/src/app/routers/trading.py b/apps/coordinator-api/src/app/contexts/trading/routers/trading.py similarity index 99% rename from apps/coordinator-api/src/app/routers/trading.py rename to apps/coordinator-api/src/app/contexts/trading/routers/trading.py index cf46899b..3aa11d09 100755 --- a/apps/coordinator-api/src/app/routers/trading.py +++ b/apps/coordinator-api/src/app/contexts/trading/routers/trading.py @@ -18,7 +18,7 @@ from aitbc.rate_limiting import rate_limit logger = get_logger(__name__) -from ..domain.trading import ( +from ....domain.trading import ( NegotiationStatus, SettlementType, TradeAgreement, @@ -29,8 +29,8 @@ from ..domain.trading import ( TradeStatus, TradeType, ) -from ..services.trading_marketplace.trading import P2PTradingProtocol -from ..storage import get_session +from ....services.trading_marketplace.trading import P2PTradingProtocol +from ....storage import get_session router = APIRouter(prefix="/v1/trading", tags=["trading"]) diff --git a/apps/coordinator-api/src/app/contexts/trading/services/__init__.py b/apps/coordinator-api/src/app/contexts/trading/services/__init__.py new file mode 100644 index 00000000..d4e79db2 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/trading/services/__init__.py @@ -0,0 +1 @@ +"""Trading services.""" diff --git a/apps/coordinator-api/src/app/services/trading_marketplace/__init__.py b/apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/__init__.py similarity index 100% rename from apps/coordinator-api/src/app/services/trading_marketplace/__init__.py rename to apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/__init__.py diff --git a/apps/coordinator-api/src/app/services/trading_marketplace/amm.py b/apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/amm.py similarity index 100% rename from apps/coordinator-api/src/app/services/trading_marketplace/amm.py rename to apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/amm.py diff --git a/apps/coordinator-api/src/app/services/trading_marketplace/bid_strategy.py b/apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/bid_strategy.py similarity index 100% rename from apps/coordinator-api/src/app/services/trading_marketplace/bid_strategy.py rename to apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/bid_strategy.py diff --git a/apps/coordinator-api/src/app/services/trading_marketplace/dynamic_pricing.py b/apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/dynamic_pricing.py similarity index 100% rename from apps/coordinator-api/src/app/services/trading_marketplace/dynamic_pricing.py rename to apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/dynamic_pricing.py diff --git a/apps/coordinator-api/src/app/services/trading_marketplace/gpu_optimizer.py b/apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/gpu_optimizer.py similarity index 100% rename from apps/coordinator-api/src/app/services/trading_marketplace/gpu_optimizer.py rename to apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/gpu_optimizer.py diff --git a/apps/coordinator-api/src/app/services/trading_marketplace/trading.py b/apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/trading.py similarity index 100% rename from apps/coordinator-api/src/app/services/trading_marketplace/trading.py rename to apps/coordinator-api/src/app/contexts/trading/services/trading_marketplace/trading.py diff --git a/apps/coordinator-api/src/app/contexts/trading/storage/__init__.py b/apps/coordinator-api/src/app/contexts/trading/storage/__init__.py new file mode 100644 index 00000000..303404a4 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/trading/storage/__init__.py @@ -0,0 +1 @@ +"""Trading storage layer.""" diff --git a/apps/coordinator-api/src/app/contexts/zk_applications/__init__.py b/apps/coordinator-api/src/app/contexts/zk_applications/__init__.py new file mode 100644 index 00000000..ddf0dc6b --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/zk_applications/__init__.py @@ -0,0 +1 @@ +"""ZK applications context for coordinator-api.""" diff --git a/apps/coordinator-api/src/app/contexts/zk_applications/domain/__init__.py b/apps/coordinator-api/src/app/contexts/zk_applications/domain/__init__.py new file mode 100644 index 00000000..21b3a7de --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/zk_applications/domain/__init__.py @@ -0,0 +1 @@ +"""ZK applications domain models.""" diff --git a/apps/coordinator-api/src/app/contexts/zk_applications/routers/__init__.py b/apps/coordinator-api/src/app/contexts/zk_applications/routers/__init__.py new file mode 100644 index 00000000..3118f18e --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/zk_applications/routers/__init__.py @@ -0,0 +1 @@ +"""ZK applications routers.""" diff --git a/apps/coordinator-api/src/app/routers/ml_zk_proofs.py b/apps/coordinator-api/src/app/contexts/zk_applications/routers/ml_zk_proofs.py similarity index 98% rename from apps/coordinator-api/src/app/routers/ml_zk_proofs.py rename to apps/coordinator-api/src/app/contexts/zk_applications/routers/ml_zk_proofs.py index 3a431fc3..b0e403f4 100755 --- a/apps/coordinator-api/src/app/routers/ml_zk_proofs.py +++ b/apps/coordinator-api/src/app/contexts/zk_applications/routers/ml_zk_proofs.py @@ -4,8 +4,8 @@ from typing import Any from fastapi import APIRouter, HTTPException, Request from aitbc.rate_limiting import rate_limit -from ..services.fhe_service import FHEService -from ..services.zk_proofs import ZKProofService +from ....services.fhe_service import FHEService +from ....services.zk_proofs import ZKProofService router = APIRouter(prefix="/v1/ml-zk", tags=["ml-zk"]) diff --git a/apps/coordinator-api/src/app/routers/zk_applications.py b/apps/coordinator-api/src/app/contexts/zk_applications/routers/zk_applications.py similarity index 99% rename from apps/coordinator-api/src/app/routers/zk_applications.py rename to apps/coordinator-api/src/app/contexts/zk_applications/routers/zk_applications.py index 7126b493..a29eaeb2 100755 --- a/apps/coordinator-api/src/app/routers/zk_applications.py +++ b/apps/coordinator-api/src/app/contexts/zk_applications/routers/zk_applications.py @@ -14,8 +14,8 @@ from typing import Any from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel, Field -from ..schemas import UserProfile -from ..storage import get_session +from ....schemas import UserProfile +from ....storage import get_session router = APIRouter(tags=["zk-applications"]) diff --git a/apps/coordinator-api/src/app/contexts/zk_applications/services/__init__.py b/apps/coordinator-api/src/app/contexts/zk_applications/services/__init__.py new file mode 100644 index 00000000..293b0777 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/zk_applications/services/__init__.py @@ -0,0 +1 @@ +"""ZK applications services.""" diff --git a/apps/coordinator-api/src/app/contexts/zk_applications/storage/__init__.py b/apps/coordinator-api/src/app/contexts/zk_applications/storage/__init__.py new file mode 100644 index 00000000..2c4a6e87 --- /dev/null +++ b/apps/coordinator-api/src/app/contexts/zk_applications/storage/__init__.py @@ -0,0 +1 @@ +"""ZK applications storage layer.""" diff --git a/apps/coordinator-api/src/app/routers/__init__.py b/apps/coordinator-api/src/app/routers/__init__.py index 1d627929..01cdaf76 100755 --- a/apps/coordinator-api/src/app/routers/__init__.py +++ b/apps/coordinator-api/src/app/routers/__init__.py @@ -31,6 +31,83 @@ from .multi_modal_rl import router as multi_modal_rl # from .registry import router as registry +# Governance routers moved to contexts/governance +from .contexts.governance.routers.governance import router as governance +from .contexts.governance.routers.governance_enhanced import router as governance_enhanced + +# Staking router moved to contexts/staking +from .contexts.staking.routers.staking import router as staking + +# Reputation router moved to contexts/reputation +from .contexts.reputation.routers.reputation import router as reputation + +# Rewards router moved to contexts/rewards +from .contexts.rewards.routers.rewards import router as rewards + +# Trading router moved to contexts/trading +from .contexts.trading.routers.trading import router as trading + +# Hermes routers moved to contexts/hermes +from .contexts.hermes.routers.hermes_enhanced import router as hermes_enhanced +from .contexts.hermes.routers.hermes_enhanced_simple import router as hermes_enhanced_simple +from .contexts.hermes.routers.hermes_enhanced_health import router as hermes_enhanced_health + +# Security router moved to contexts/security +from .contexts.security.routers.agent_security_router import router as agent_security_router + +# Analytics router moved to contexts/analytics +from .contexts.analytics.routers.analytics import router as analytics + +# Certification router moved to contexts/certification +from .contexts.certification.routers.certification import router as certification + +# Multimodal routers moved to contexts/multimodal +from .contexts.multimodal.routers.multi_modal_rl import router as multi_modal_rl +from .contexts.multimodal.routers.multimodal_health import router as multimodal_health +from .contexts.multimodal.routers.modality_optimization_health import router as modality_optimization_health + +# Developer platform router moved to contexts/developer_platform +from .contexts.developer_platform.routers.developer_platform import router as developer_platform + +# Community router moved to contexts/community +from .contexts.community.routers.community import router as community + +# Bounty router moved to contexts/bounty +from .contexts.bounty.routers.bounty import router as bounty + +# Confidential router moved to contexts/confidential +from .contexts.confidential.routers.confidential import router as confidential + +# ZK applications routers moved to contexts/zk_applications +from .contexts.zk_applications.routers.zk_applications import router as zk_applications +from .contexts.zk_applications.routers.ml_zk_proofs import router as ml_zk_proofs + +# Agent coordination routers moved to contexts/agent_coordination +from .contexts.agent_coordination.routers.agent_router import router as agent_router +from .contexts.agent_coordination.routers.agent_integration_router import router as agent_integration_router +from .contexts.agent_coordination.routers.agent_creativity import router as agent_creativity +from .contexts.agent_coordination.routers.agent_performance import router as agent_performance +from .contexts.agent_coordination.routers.swarm import router as swarm + +# Enterprise integration router moved to contexts/enterprise_integration +from .contexts.enterprise_integration.routers.partners import router as partners + +# Advanced AI router moved to contexts/advanced_ai +from .contexts.advanced_ai.routers.adaptive_learning_health import router as adaptive_learning_health + +# Ecosystem router moved to contexts/ecosystem +from .contexts.ecosystem.routers.ecosystem_dashboard import router as ecosystem_dashboard + +# GPU multimodal router moved to contexts/gpu_multimodal +from .contexts.gpu_multimodal.routers.gpu_multimodal_health import router as gpu_multimodal_health + +# Settlement router moved to contexts/settlement +from .contexts.settlement.routers.settlement import router as settlement + +# Infrastructure routers moved to contexts/infrastructure +from .contexts.infrastructure.routers.monitor import router as monitor +from .contexts.infrastructure.routers.monitoring_dashboard import router as monitoring_dashboard + __all__ = [ "client", "miner", @@ -52,11 +129,37 @@ __all__ = [ "cross_chain_integration", "global_marketplace_integration", "developer_platform", + "governance", "governance_enhanced", + "staking", + "reputation", + "rewards", + "trading", + "hermes_enhanced", + "hermes_enhanced_simple", + "hermes_enhanced_health", + "agent_security_router", + "analytics", + "certification", + "multi_modal_rl", + "multimodal_health", + "modality_optimization_health", + "community", + "bounty", + "confidential", + "zk_applications", + "ml_zk_proofs", + "agent_router", + "agent_integration_router", + "agent_creativity", + "agent_performance", + "swarm", + "partners", + "adaptive_learning_health", + "ecosystem_dashboard", + "gpu_multimodal_health", + "settlement", + "monitor", + "monitoring_dashboard", "registry", ] -from .cross_chain_integration import router as cross_chain_integration -from .developer_platform import router as developer_platform -from .global_marketplace import router as global_marketplace -from .global_marketplace_integration import router as global_marketplace_integration -from .governance_enhanced import router as governance_enhanced diff --git a/apps/coordinator-api/src/app/routers/exchange.py b/apps/coordinator-api/src/app/routers/exchange.py index d194e356..43fb74cb 100755 --- a/apps/coordinator-api/src/app/routers/exchange.py +++ b/apps/coordinator-api/src/app/routers/exchange.py @@ -8,16 +8,12 @@ from datetime import datetime, timezone from typing import Any from fastapi import APIRouter, BackgroundTasks, HTTPException, Request -from slowapi import Limiter -from slowapi.util import get_remote_address from aitbc import get_logger +from aitbc.rate_limiting import rate_limit logger = get_logger(__name__) - -limiter = Limiter(key_func=get_remote_address) - from ..schemas import ( ExchangePaymentRequest, ExchangePaymentResponse, @@ -46,7 +42,7 @@ BITCOIN_CONFIG = { @router.post("/exchange/create-payment", response_model=ExchangePaymentResponse) -@limiter.limit("20/minute") +@rate_limit(rate=20, per=60) async def create_payment( request: Request, payment_request: ExchangePaymentRequest, background_tasks: BackgroundTasks ) -> dict[str, Any]: @@ -88,8 +84,11 @@ async def create_payment( @router.get("/exchange/payment-status/{payment_id}", response_model=PaymentStatusResponse) +@rate_limit(rate=200, per=60) @cached(**get_cache_config("user_balance")) # Cache payment status for 30 seconds -async def get_payment_status(payment_id: str) -> dict[str, Any]: +async def get_payment_status( + request: Request, payment_id: str +) -> dict[str, Any]: """Get payment status""" if payment_id not in payments: @@ -105,7 +104,10 @@ async def get_payment_status(payment_id: str) -> dict[str, Any]: @router.post("/exchange/confirm-payment/{payment_id}") -async def confirm_payment(payment_id: str, tx_hash: str) -> dict[str, Any]: +@rate_limit(rate=50, per=60) +async def confirm_payment( + request: Request, payment_id: str, tx_hash: str +) -> dict[str, Any]: """Confirm payment (webhook from payment processor)""" if payment_id not in payments: @@ -136,7 +138,10 @@ async def confirm_payment(payment_id: str, tx_hash: str) -> dict[str, Any]: @router.get("/exchange/rates", response_model=ExchangeRatesResponse) -async def get_exchange_rates() -> ExchangeRatesResponse: +@rate_limit(rate=500, per=60) +async def get_exchange_rates( + request: Request +) -> ExchangeRatesResponse: """Get current exchange rates""" return ExchangeRatesResponse( @@ -145,7 +150,10 @@ async def get_exchange_rates() -> ExchangeRatesResponse: @router.get("/exchange/market-stats", response_model=MarketStatsResponse) -async def get_market_stats() -> MarketStatsResponse: +@rate_limit(rate=500, per=60) +async def get_market_stats( + request: Request +) -> MarketStatsResponse: """Get market statistics""" # Calculate 24h volume from payments @@ -172,7 +180,10 @@ async def get_market_stats() -> MarketStatsResponse: @router.get("/exchange/wallet/balance", response_model=WalletBalanceResponse) -async def get_wallet_balance_api() -> WalletBalanceResponse: +@rate_limit(rate=200, per=60) +async def get_wallet_balance_api( + request: Request +) -> WalletBalanceResponse: """Get Bitcoin wallet balance""" try: balance_data = get_wallet_balance() @@ -182,7 +193,10 @@ async def get_wallet_balance_api() -> WalletBalanceResponse: @router.get("/exchange/wallet/info", response_model=WalletInfoResponse) -async def get_wallet_info_api() -> WalletInfoResponse: +@rate_limit(rate=200, per=60) +async def get_wallet_info_api( + request: Request +) -> WalletInfoResponse: """Get comprehensive wallet information""" try: wallet_data = get_wallet_info() @@ -212,13 +226,19 @@ async def monitor_payment(payment_id: str) -> None: # Agent endpoints temporarily added to exchange router @router.get("/agents/test") -async def test_agent_endpoint() -> dict[str, str]: +@rate_limit(rate=1000, per=60) +async def test_agent_endpoint( + request: Request +) -> dict[str, str]: """Test endpoint to verify agent routes are working""" return {"message": "Agent routes are working", "timestamp": datetime.now(timezone.utc).isoformat()} @router.post("/agents/networks", response_model=dict, status_code=201) -async def create_agent_network(network_data: dict) -> dict[str, Any]: +@rate_limit(rate=50, per=60) +async def create_agent_network( + request: Request, network_data: dict +) -> dict[str, Any]: """Create a new agent network for collaborative processing""" try: @@ -254,7 +274,10 @@ async def create_agent_network(network_data: dict) -> dict[str, Any]: @router.get("/agents/executions/{execution_id}/receipt") -async def get_execution_receipt(execution_id: str) -> dict[str, Any]: +@rate_limit(rate=200, per=60) +async def get_execution_receipt( + request: Request, execution_id: str +) -> dict[str, Any]: """Get verifiable receipt for completed execution""" try: diff --git a/apps/coordinator-api/src/app/routers/miner.py b/apps/coordinator-api/src/app/routers/miner.py index 462cb6d8..1e9fcc49 100755 --- a/apps/coordinator-api/src/app/routers/miner.py +++ b/apps/coordinator-api/src/app/routers/miner.py @@ -2,11 +2,10 @@ from datetime import datetime, timezone from typing import Annotated, Any from fastapi import APIRouter, Depends, HTTPException, Request, Response, status -from slowapi import Limiter -from slowapi.util import get_remote_address from sqlalchemy.orm import Session from aitbc import get_logger +from aitbc.rate_limiting import rate_limit from ..config import settings from ..deps import get_miner_id, require_miner_key from ..schemas import AssignedJob, JobFailSubmit, JobResultSubmit, JobState, MinerHeartbeat, MinerRegister, PollRequest @@ -16,13 +15,11 @@ from ..storage import get_session logger = get_logger(__name__) - -limiter = Limiter(key_func=get_remote_address) router = APIRouter(tags=["miner"]) @router.post("/miners/register", summary="Register or update miner") -@limiter.limit(lambda: settings.rate_limit_miner_register) +@rate_limit(rate=50, per=60) async def register( req: MinerRegister, request: Request, @@ -36,7 +33,7 @@ async def register( @router.post("/miners/heartbeat", summary="Send miner heartbeat") -@limiter.limit(lambda: settings.rate_limit_miner_heartbeat) +@rate_limit(rate=100, per=60) async def heartbeat( req: MinerHeartbeat, request: Request, @@ -53,7 +50,9 @@ async def heartbeat( # NOTE: until scheduling is fully implemented the poll endpoint performs a simple FIFO assignment. @router.post("/miners/poll", response_model=AssignedJob, summary="Poll for next job") +@rate_limit(rate=100, per=60) async def poll( + request: Request, req: PollRequest, session: Annotated[Session, Depends(get_session)], api_key: str = Depends(require_miner_key()), @@ -66,11 +65,13 @@ async def poll( @router.post("/miners/{job_id}/result", summary="Submit job result") +@rate_limit(rate=50, per=60) async def submit_result( + request: Request, job_id: str, req: JobResultSubmit, session: Annotated[Session, Depends(get_session)], - miner_id: str = Depends(require_miner_key()), + miner_id: str = Depends(get_miner_id()), ) -> dict[str, Any]: # type: ignore[arg-type] job_service = JobService(session) miner_service = MinerService(session) @@ -122,11 +123,13 @@ async def submit_result( @router.post("/miners/{job_id}/fail", summary="Submit job failure") +@rate_limit(rate=50, per=60) async def submit_failure( + request: Request, job_id: str, req: JobFailSubmit, session: Annotated[Session, Depends(get_session)], - miner_id: str = Depends(require_miner_key()), + miner_id: str = Depends(get_miner_id()), ) -> dict[str, str]: # type: ignore[arg-type] try: service = JobService(session) @@ -137,7 +140,9 @@ async def submit_failure( @router.post("/miners/{miner_id}/jobs", summary="List jobs for a miner") +@rate_limit(rate=200, per=60) async def list_miner_jobs( + request: Request, miner_id: str, limit: int = 20, offset: int = 0, @@ -179,7 +184,9 @@ async def list_miner_jobs( @router.post("/miners/{miner_id}/earnings", summary="Get miner earnings") +@rate_limit(rate=200, per=60) async def get_miner_earnings( + request: Request, miner_id: str, from_time: str | None = None, to_time: str | None = None, @@ -215,7 +222,9 @@ async def get_miner_earnings( @router.put("/miners/{miner_id}/capabilities", summary="Update miner capabilities") +@rate_limit(rate=50, per=60) async def update_miner_capabilities( + request: Request, miner_id: str, req: MinerRegister, session: Annotated[Session, Depends(get_session)] = Annotated[Session, Depends(get_session)], @@ -239,7 +248,9 @@ async def update_miner_capabilities( @router.delete("/miners/{miner_id}", summary="Deregister miner") +@rate_limit(rate=50, per=60) async def deregister_miner( + request: Request, miner_id: str, session: Annotated[Session, Depends(get_session)] = Annotated[Session, Depends(get_session)], api_key: str = Depends(require_miner_key()), diff --git a/apps/exchange/complete_cross_chain_exchange.py b/apps/exchange/complete_cross_chain_exchange.py index b2b00d61..17f0bdbf 100755 --- a/apps/exchange/complete_cross_chain_exchange.py +++ b/apps/exchange/complete_cross_chain_exchange.py @@ -19,9 +19,17 @@ import hashlib from aitbc.network.http_client import AsyncAITBCHTTPClient from aitbc.aitbc_logging import get_logger from aitbc.exceptions import NetworkError +from aitbc.rate_limiting import RateLimitMiddleware app = FastAPI(title="AITBC Complete Cross-Chain Exchange", version="3.0.0") +# Add rate limiting middleware +app.add_middleware( + RateLimitMiddleware, + rate=100, + per=60 +) + # Initialize logger logger = get_logger(__name__) diff --git a/apps/exchange/multichain_exchange_api.py b/apps/exchange/multichain_exchange_api.py index 0e9de800..3e4bd9c5 100755 --- a/apps/exchange/multichain_exchange_api.py +++ b/apps/exchange/multichain_exchange_api.py @@ -17,9 +17,17 @@ import os from aitbc.network.http_client import AsyncAITBCHTTPClient from aitbc.aitbc_logging import get_logger from aitbc.exceptions import NetworkError +from aitbc.rate_limiting import RateLimitMiddleware app = FastAPI(title="AITBC Multi-Chain Exchange", version="2.0.0") +# Add rate limiting middleware +app.add_middleware( + RateLimitMiddleware, + rate=100, + per=60 +) + # Initialize logger logger = get_logger(__name__) diff --git a/apps/pool-hub/src/app/routers/health.py b/apps/pool-hub/src/app/routers/health.py index 1b427db9..14ce708b 100755 --- a/apps/pool-hub/src/app/routers/health.py +++ b/apps/pool-hub/src/app/routers/health.py @@ -1,14 +1,17 @@ """Health check routes for Pool Hub""" -from fastapi import APIRouter +from fastapi import APIRouter, Request from datetime import datetime, timezone from sqlalchemy import text +from aitbc.rate_limiting import rate_limit + router = APIRouter(tags=["health"]) @router.get("/health") -async def health_check(): +@rate_limit(rate=1000, per=60) +async def health_check(request: Request): """Basic health check.""" return { "status": "ok", @@ -18,7 +21,8 @@ async def health_check(): @router.get("/ready") -async def readiness_check(): +@rate_limit(rate=1000, per=60) +async def readiness_check(request: Request): """Readiness check for Kubernetes.""" # Check dependencies checks = {"database": await check_database(), "redis": await check_redis()} @@ -33,7 +37,8 @@ async def readiness_check(): @router.get("/live") -async def liveness_check(): +@rate_limit(rate=1000, per=60) +async def liveness_check(request: Request): """Liveness check for Kubernetes.""" return {"live": True} diff --git a/apps/pool-hub/src/app/routers/jobs.py b/apps/pool-hub/src/app/routers/jobs.py index 13ad8009..bca886d3 100755 --- a/apps/pool-hub/src/app/routers/jobs.py +++ b/apps/pool-hub/src/app/routers/jobs.py @@ -1,10 +1,11 @@ """Job distribution routes for Pool Hub""" -from fastapi import APIRouter, HTTPException, Depends, Query +from fastapi import APIRouter, HTTPException, Depends, Query, Request from typing import List, Optional from datetime import datetime, timezone from pydantic import BaseModel +from aitbc.rate_limiting import rate_limit from ..registry import MinerRegistry from ..scoring import ScoringEngine @@ -50,7 +51,9 @@ def get_scoring() -> ScoringEngine: @router.post("/assign", response_model=JobAssignment) +@rate_limit(rate=50, per=60) async def assign_job( + request: Request, job: JobRequest, registry: MinerRegistry = Depends(get_registry), scoring: ScoringEngine = Depends(get_scoring) @@ -92,7 +95,9 @@ async def assign_job( @router.post("/result") +@rate_limit(rate=50, per=60) async def submit_result( + request: Request, result: JobResult, registry: MinerRegistry = Depends(get_registry), scoring: ScoringEngine = Depends(get_scoring) @@ -120,7 +125,9 @@ async def submit_result( @router.get("/pending") +@rate_limit(rate=200, per=60) async def get_pending_jobs( + request: Request, pool_id: Optional[str] = Query(None), limit: int = Query(50, le=100), registry: MinerRegistry = Depends(get_registry) @@ -130,7 +137,9 @@ async def get_pending_jobs( @router.get("/{job_id}") +@rate_limit(rate=200, per=60) async def get_job_status( + request: Request, job_id: str, registry: MinerRegistry = Depends(get_registry) ): @@ -142,7 +151,9 @@ async def get_job_status( @router.post("/{job_id}/reassign") +@rate_limit(rate=50, per=60) async def reassign_job( + request: Request, job_id: str, registry: MinerRegistry = Depends(get_registry), scoring: ScoringEngine = Depends(get_scoring) diff --git a/apps/pool-hub/src/app/routers/miners.py b/apps/pool-hub/src/app/routers/miners.py index 323395c1..4193453a 100755 --- a/apps/pool-hub/src/app/routers/miners.py +++ b/apps/pool-hub/src/app/routers/miners.py @@ -1,10 +1,11 @@ """Miner management routes for Pool Hub""" -from fastapi import APIRouter, HTTPException, Depends, Query +from fastapi import APIRouter, HTTPException, Depends, Query, Request from typing import List, Optional from datetime import datetime from pydantic import BaseModel +from aitbc.rate_limiting import rate_limit from ..registry import MinerRegistry from ..scoring import ScoringEngine @@ -53,7 +54,9 @@ def get_scoring() -> ScoringEngine: @router.post("/register", response_model=MinerInfo) +@rate_limit(rate=50, per=60) async def register_miner( + request: Request, registration: MinerRegistration, registry: MinerRegistry = Depends(get_registry) ): @@ -73,7 +76,9 @@ async def register_miner( @router.post("/{miner_id}/heartbeat") +@rate_limit(rate=100, per=60) async def miner_heartbeat( + request: Request, miner_id: str, status: MinerStatus, registry: MinerRegistry = Depends(get_registry) @@ -94,7 +99,9 @@ async def miner_heartbeat( @router.get("/{miner_id}", response_model=MinerInfo) +@rate_limit(rate=200, per=60) async def get_miner( + request: Request, miner_id: str, registry: MinerRegistry = Depends(get_registry) ): @@ -106,7 +113,9 @@ async def get_miner( @router.get("/", response_model=List[MinerInfo]) +@rate_limit(rate=200, per=60) async def list_miners( + request: Request, pool_id: Optional[str] = Query(None), status: Optional[str] = Query(None), capability: Optional[str] = Query(None), @@ -123,7 +132,9 @@ async def list_miners( @router.delete("/{miner_id}") +@rate_limit(rate=50, per=60) async def unregister_miner( + request: Request, miner_id: str, registry: MinerRegistry = Depends(get_registry) ): @@ -137,7 +148,9 @@ async def unregister_miner( @router.get("/{miner_id}/score") +@rate_limit(rate=200, per=60) async def get_miner_score( + request: Request, miner_id: str, registry: MinerRegistry = Depends(get_registry), scoring: ScoringEngine = Depends(get_scoring) @@ -159,7 +172,9 @@ async def get_miner_score( @router.post("/{miner_id}/capabilities") +@rate_limit(rate=50, per=60) async def update_capabilities( + request: Request, miner_id: str, capabilities: List[str], registry: MinerRegistry = Depends(get_registry) diff --git a/apps/pool-hub/src/app/routers/pools.py b/apps/pool-hub/src/app/routers/pools.py index 459e2923..7b3a5ec7 100755 --- a/apps/pool-hub/src/app/routers/pools.py +++ b/apps/pool-hub/src/app/routers/pools.py @@ -1,10 +1,11 @@ """Pool management routes for Pool Hub""" -from fastapi import APIRouter, HTTPException, Depends, Query +from fastapi import APIRouter, HTTPException, Depends, Query, Request from typing import List, Optional from datetime import datetime from pydantic import BaseModel +from aitbc.rate_limiting import rate_limit from ..registry import MinerRegistry router = APIRouter(prefix="/pools", tags=["pools"]) @@ -55,7 +56,9 @@ def get_registry() -> MinerRegistry: @router.post("/", response_model=PoolInfo) +@rate_limit(rate=50, per=60) async def create_pool( + request: Request, pool: PoolCreate, registry: MinerRegistry = Depends(get_registry) ): @@ -76,7 +79,9 @@ async def create_pool( @router.get("/{pool_id}", response_model=PoolInfo) +@rate_limit(rate=200, per=60) async def get_pool( + request: Request, pool_id: str, registry: MinerRegistry = Depends(get_registry) ): @@ -88,7 +93,9 @@ async def get_pool( @router.get("/", response_model=List[PoolInfo]) +@rate_limit(rate=200, per=60) async def list_pools( + request: Request, limit: int = Query(50, le=100), offset: int = Query(0), registry: MinerRegistry = Depends(get_registry) @@ -98,7 +105,9 @@ async def list_pools( @router.get("/{pool_id}/stats", response_model=PoolStats) +@rate_limit(rate=200, per=60) async def get_pool_stats( + request: Request, pool_id: str, registry: MinerRegistry = Depends(get_registry) ): @@ -111,7 +120,9 @@ async def get_pool_stats( @router.get("/{pool_id}/miners") +@rate_limit(rate=200, per=60) async def get_pool_miners( + request: Request, pool_id: str, status: Optional[str] = Query(None), limit: int = Query(50, le=100), @@ -126,7 +137,9 @@ async def get_pool_miners( @router.put("/{pool_id}") +@rate_limit(rate=50, per=60) async def update_pool( + request: Request, pool_id: str, updates: dict, registry: MinerRegistry = Depends(get_registry) @@ -144,7 +157,9 @@ async def update_pool( @router.delete("/{pool_id}") +@rate_limit(rate=50, per=60) async def delete_pool( + request: Request, pool_id: str, registry: MinerRegistry = Depends(get_registry) ): diff --git a/apps/wallet/src/app/api_rest.py b/apps/wallet/src/app/api_rest.py index 72a3c0da..f44d695a 100755 --- a/apps/wallet/src/app/api_rest.py +++ b/apps/wallet/src/app/api_rest.py @@ -2,8 +2,10 @@ from __future__ import annotations import base64 from datetime import datetime +from typing import Optional from aitbc.logging import get_logger +from aitbc.rate_limiting import rate_limit from fastapi import APIRouter, Depends, HTTPException, status, Request @@ -39,24 +41,9 @@ from .receipts.service import ReceiptValidationResult, ReceiptVerifierService from .chain.manager import ChainManager, chain_manager from .chain.multichain_ledger import MultiChainLedgerAdapter from .chain.chain_aware_wallet_service import ChainAwareWalletService -from .security import RateLimiter, wipe_buffer +from .security import wipe_buffer logger = get_logger(__name__) -_rate_limiter = RateLimiter(max_requests=30, window_seconds=60) - - -def _rate_key(action: str, request: Request, wallet_id: Optional[str] = None) -> str: - host = request.client.host if request.client else "unknown" - parts = [action, host] - if wallet_id: - parts.append(wallet_id) - return ":".join(parts) - - -def _enforce_limit(action: str, request: Request, wallet_id: Optional[str] = None) -> None: - key = _rate_key(action, request, wallet_id) - if not _rate_limiter.allow(key): - raise HTTPException(status_code=status.HTTP_429_TOO_MANY_REQUESTS, detail="rate limit exceeded") router = APIRouter(prefix="/v1", tags=["wallets", "receipts"]) @@ -72,7 +59,9 @@ def _result_to_response(result: ReceiptValidationResult) -> ReceiptVerifyRespons response_model=ReceiptVerifyResponse, summary="Verify latest receipt for a job", ) +@rate_limit(rate=200, per=60) def verify_latest_receipt( + request: Request, job_id: str, service: ReceiptVerifierService = Depends(get_receipt_service), ) -> ReceiptVerifyResponse: @@ -87,7 +76,9 @@ def verify_latest_receipt( response_model=ReceiptVerificationListResponse, summary="Verify all historical receipts for a job", ) +@rate_limit(rate=200, per=60) def verify_receipt_history( + request: Request, job_id: str, service: ReceiptVerifierService = Depends(get_receipt_service), ) -> ReceiptVerificationListResponse: @@ -97,7 +88,9 @@ def verify_receipt_history( @router.get("/wallets", response_model=WalletListResponse, summary="List wallets") +@rate_limit(rate=200, per=60) def list_wallets( + request: Request, keystore: PersistentKeystoreService = Depends(get_keystore), ledger: SQLiteLedgerAdapter = Depends(get_ledger), ) -> WalletListResponse: @@ -112,26 +105,26 @@ def list_wallets( return WalletListResponse(items=descriptors) @router.post("/wallets", response_model=WalletCreateResponse, status_code=status.HTTP_201_CREATED, summary="Create wallet") +@rate_limit(rate=50, per=60) def create_wallet( - request: WalletCreateRequest, - http_request: Request, + request: Request, + wallet_request: WalletCreateRequest, keystore: PersistentKeystoreService = Depends(get_keystore), ledger: SQLiteLedgerAdapter = Depends(get_ledger), ) -> WalletCreateResponse: - _enforce_limit("wallet-create", http_request) try: - secret = base64.b64decode(request.secret_key) if request.secret_key else None + secret = base64.b64decode(wallet_request.secret_key) if wallet_request.secret_key else None except Exception as exc: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="invalid base64 secret") from exc try: - ip_address = http_request.client.host if http_request.client else "unknown" + ip_address = request.client.host if request.client else "unknown" record = keystore.create_wallet( - wallet_id=request.wallet_id, - password=request.password, + wallet_id=wallet_request.wallet_id, + password=wallet_request.password, secret=secret, - metadata=request.metadata, + metadata=wallet_request.metadata, ip_address=ip_address ) except ValueError as exc: @@ -148,21 +141,21 @@ def create_wallet( @router.post("/wallets/{wallet_id}/unlock", response_model=WalletUnlockResponse, summary="Unlock wallet") +@rate_limit(rate=50, per=60) def unlock_wallet( + request: Request, wallet_id: str, - request: WalletUnlockRequest, - http_request: Request, + unlock_request: WalletUnlockRequest, keystore: PersistentKeystoreService = Depends(get_keystore), ledger: SQLiteLedgerAdapter = Depends(get_ledger), ) -> WalletUnlockResponse: - _enforce_limit("wallet-unlock", http_request, wallet_id) try: - ip_address = http_request.client.host if http_request.client else "unknown" - secret = bytearray(keystore.unlock_wallet(wallet_id, request.password, ip_address)) + ip_address = request.client.host if request.client else "unknown" + secret = bytearray(keystore.unlock_wallet(wallet_id, unlock_request.password, ip_address)) ledger.record_event(wallet_id, "unlocked", {"success": True, "ip_address": ip_address}) logger.info("Unlocked wallet", extra={"wallet_id": wallet_id}) except (KeyError, ValueError): - ip_address = http_request.client.host if http_request.client else "unknown" + ip_address = request.client.host if request.client else "unknown" ledger.record_event(wallet_id, "unlocked", {"success": False, "ip_address": ip_address}) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="invalid credentials") finally: @@ -173,26 +166,26 @@ def unlock_wallet( @router.post("/wallets/{wallet_id}/sign", response_model=WalletSignResponse, summary="Sign payload") +@rate_limit(rate=50, per=60) def sign_payload( + request: Request, wallet_id: str, - request: WalletSignRequest, - http_request: Request, + sign_request: WalletSignRequest, keystore: PersistentKeystoreService = Depends(get_keystore), ledger: SQLiteLedgerAdapter = Depends(get_ledger), ) -> WalletSignResponse: - _enforce_limit("wallet-sign", http_request, wallet_id) try: - message = base64.b64decode(request.message_base64) + message = base64.b64decode(sign_request.message_base64) except Exception as exc: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="invalid base64 message") from exc try: - ip_address = http_request.client.host if http_request.client else "unknown" - signature = keystore.sign_message(wallet_id, request.password, message, ip_address) + ip_address = request.client.host if request.client else "unknown" + signature = keystore.sign_message(wallet_id, sign_request.password, message, ip_address) ledger.record_event(wallet_id, "sign", {"success": True, "ip_address": ip_address}) logger.debug("Signed payload", extra={"wallet_id": wallet_id}) except (KeyError, ValueError): - ip_address = http_request.client.host if http_request.client else "unknown" + ip_address = request.client.host if request.client else "unknown" ledger.record_event(wallet_id, "sign", {"success": False, "ip_address": ip_address}) raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="invalid credentials") @@ -203,7 +196,9 @@ def sign_payload( # Multi-Chain Endpoints @router.get("/chains", response_model=ChainListResponse, summary="List all chains") +@rate_limit(rate=200, per=60) def list_chains( + request: Request, chain_manager: ChainManager = Depends(get_chain_manager), multichain_ledger: MultiChainLedgerAdapter = Depends(get_multichain_ledger) ) -> ChainListResponse: @@ -234,29 +229,28 @@ def list_chains( @router.post("/chains", response_model=ChainCreateResponse, status_code=status.HTTP_201_CREATED, summary="Create a new chain") +@rate_limit(rate=50, per=60) def create_chain( - request: ChainCreateRequest, - http_request: Request, + request: Request, + chain_request: ChainCreateRequest, chain_manager: ChainManager = Depends(get_chain_manager) ) -> ChainCreateResponse: """Create a new blockchain chain configuration""" - _enforce_limit("chain-create", http_request) - from .chain.manager import ChainConfig chain_config = ChainConfig( - chain_id=request.chain_id, - name=request.name, - coordinator_url=request.coordinator_url, - coordinator_api_key=request.coordinator_api_key, - metadata=request.metadata + chain_id=chain_request.chain_id, + name=chain_request.name, + coordinator_url=chain_request.coordinator_url, + coordinator_api_key=chain_request.coordinator_api_key, + metadata=chain_request.metadata ) success = chain_manager.add_chain(chain_config) if not success: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, - detail=f"Chain {request.chain_id} already exists" + detail=f"Chain {chain_request.chain_id} already exists" ) chain_info = ChainInfo( @@ -274,7 +268,9 @@ def create_chain( @router.get("/chains/{chain_id}/wallets", response_model=WalletListResponse, summary="List wallets in a specific chain") +@rate_limit(rate=200, per=60) def list_chain_wallets( + request: Request, chain_id: str, wallet_service: ChainAwareWalletService = Depends(get_chain_aware_wallet_service) ) -> WalletListResponse: @@ -296,10 +292,11 @@ def list_chain_wallets( @router.post("/chains/{chain_id}/wallets", response_model=WalletCreateResponse, status_code=status.HTTP_201_CREATED, summary="Create wallet in a specific chain") +@rate_limit(rate=50, per=60) def create_chain_wallet( + request: Request, chain_id: str, - request: WalletCreateRequest, - http_request: Request, + wallet_request: WalletCreateRequest, wallet_service: ChainAwareWalletService = Depends(get_chain_aware_wallet_service) ) -> WalletCreateResponse: """Create a wallet in a specific blockchain chain""" @@ -310,19 +307,17 @@ def create_chain_wallet( if not CHAIN_ID_PATTERN.match(chain_id): raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid chain_id format") - _enforce_limit("wallet-create", http_request) - try: - secret = base64.b64decode(request.secret_key) if request.secret_key else None + secret = base64.b64decode(wallet_request.secret_key) if wallet_request.secret_key else None except Exception as exc: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="invalid base64 secret") from exc wallet_metadata = wallet_service.create_wallet( chain_id=chain_id, - wallet_id=request.wallet_id, - password=request.password, + wallet_id=wallet_request.wallet_id, + password=wallet_request.password, secret_key=secret, - metadata=request.metadata + metadata=wallet_request.metadata ) if not wallet_metadata: @@ -343,11 +338,12 @@ def create_chain_wallet( @router.post("/chains/{chain_id}/wallets/{wallet_id}/unlock", response_model=WalletUnlockResponse, summary="Unlock wallet in a specific chain") +@rate_limit(rate=50, per=60) def unlock_chain_wallet( + request: Request, chain_id: str, wallet_id: str, - request: WalletUnlockRequest, - http_request: Request, + unlock_request: WalletUnlockRequest, wallet_service: ChainAwareWalletService = Depends(get_chain_aware_wallet_service) ) -> WalletUnlockResponse: """Unlock a wallet in a specific blockchain chain""" @@ -358,9 +354,7 @@ def unlock_chain_wallet( if not CHAIN_ID_PATTERN.match(chain_id): raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid chain_id format") - _enforce_limit("wallet-unlock", http_request, wallet_id) - - success = wallet_service.unlock_wallet(chain_id, wallet_id, request.password) + success = wallet_service.unlock_wallet(chain_id, wallet_id, unlock_request.password) if not success: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="invalid credentials") @@ -368,11 +362,12 @@ def unlock_chain_wallet( @router.post("/chains/{chain_id}/wallets/{wallet_id}/sign", response_model=WalletSignResponse, summary="Sign payload with wallet in a specific chain") +@rate_limit(rate=50, per=60) def sign_chain_payload( + request: Request, chain_id: str, wallet_id: str, - request: WalletSignRequest, - http_request: Request, + sign_request: WalletSignRequest, wallet_service: ChainAwareWalletService = Depends(get_chain_aware_wallet_service) ) -> WalletSignResponse: """Sign a payload with a wallet in a specific blockchain chain""" @@ -383,15 +378,13 @@ def sign_chain_payload( if not CHAIN_ID_PATTERN.match(chain_id): raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid chain_id format") - _enforce_limit("wallet-sign", http_request, wallet_id) - try: - message = base64.b64decode(request.message_base64) + message = base64.b64decode(sign_request.message_base64) except Exception as exc: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="invalid base64 message") from exc - ip_address = http_request.client.host if http_request.client else "unknown" - signature = wallet_service.sign_message(chain_id, wallet_id, request.password, message, ip_address) + ip_address = request.client.host if request.client else "unknown" + signature = wallet_service.sign_message(chain_id, wallet_id, sign_request.password, message, ip_address) if not signature: raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail="invalid credentials") @@ -404,9 +397,10 @@ def sign_chain_payload( @router.post("/wallets/migrate", response_model=WalletMigrationResponse, summary="Migrate wallet between chains") +@rate_limit(rate=50, per=60) def migrate_wallet( - request: WalletMigrationRequest, - http_request: Request, + request: Request, + migration_request: WalletMigrationRequest, wallet_service: ChainAwareWalletService = Depends(get_chain_aware_wallet_service) ) -> WalletMigrationResponse: """Migrate a wallet from one chain to another""" @@ -414,17 +408,15 @@ def migrate_wallet( import re CHAIN_ID_PATTERN = re.compile(r'^[a-zA-Z0-9_-]{3,30}$') - if not CHAIN_ID_PATTERN.match(request.source_chain_id) or not CHAIN_ID_PATTERN.match(request.target_chain_id): + if not CHAIN_ID_PATTERN.match(migration_request.source_chain_id) or not CHAIN_ID_PATTERN.match(migration_request.target_chain_id): raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid chain_id format") - _enforce_limit("wallet-migrate", http_request) - success = wallet_service.migrate_wallet_between_chains( - source_chain_id=request.source_chain_id, - target_chain_id=request.target_chain_id, - wallet_id=request.wallet_id, - password=request.password, - new_password=request.new_password + source_chain_id=migration_request.source_chain_id, + target_chain_id=migration_request.target_chain_id, + wallet_id=migration_request.wallet_id, + password=migration_request.password, + new_password=migration_request.new_password ) if not success: @@ -434,8 +426,8 @@ def migrate_wallet( ) # Get both wallet descriptors - source_wallet = wallet_service.get_wallet(request.source_chain_id, request.wallet_id) - target_wallet = wallet_service.get_wallet(request.target_chain_id, request.wallet_id) + source_wallet = wallet_service.get_wallet(migration_request.source_chain_id, migration_request.wallet_id) + target_wallet = wallet_service.get_wallet(migration_request.target_chain_id, migration_request.wallet_id) if not source_wallet or not target_wallet: raise HTTPException( diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 2a205b44..f8360511 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -1,7 +1,5 @@ # AITBC Development Roadmap -## Current Focus: v0.1 Release Preparation - ### Codebase Analysis (May 2026) **Scale Overview** @@ -208,22 +206,29 @@ - Checksum verification supported via SHA256SUMS file - [ ] Binary distribution via GitHub Releases (deferred until v1 release - policy: no GitHub Releases before v1) -### Quality Assurance - -- [ ] Cross-platform compatibility validation -- [ ] Security penetration testing - ### Codebase Quality & Technical Debt #### HIGH (Medium-term, 2-6 weeks) -- [ ] Decompose coordinator-api - DEFERRED (Phase 1: Infrastructure complete, extraction postponed due to domain coupling complexity) +- [ ] Decompose coordinator-api - IN PROGRESS (Domain refactoring in progress) + - Phase 1: Infrastructure complete, extraction postponed due to domain coupling complexity - Built: shared-core, shared-domain (partial), agent-management skeleton - - Blocked: extraction complexity, will resume with domain refactoring - Created 7 microservice directories: agent-management, blockchain, computing, enterprise, identity, payment, ai-models - Built shared-core library: config.py, database.py, logging.py - Created service templates and directory structure - - Next: Extract agent-management service (largest bounded context) + - Domain refactoring progress (Phase 2: Context Creation): + - Created DOMAIN_REFACTORING_PLAN.md with 29 identified bounded contexts + - High-priority contexts created (7/7): + - governance context: 2 routers, 2 services moved, imports updated, compilation verified + - staking context: 1 router, 1 service moved, imports updated, compilation verified + - reputation context: 1 router, 1 service moved, imports updated, compilation verified + - rewards context: 1 router, 1 service moved, imports updated, compilation verified + - trading context: 1 router, trading_marketplace services moved, imports updated, compilation verified + - hermes context: 4 routers, 2 services moved, imports updated, compilation verified + - security context: 1 router, 7 services moved, imports updated, compilation verified + - routers/__init__.py updated to reference all new context locations + - All 7 high-priority contexts compile successfully + - Next: Create remaining 22 contexts (analytics, certification, multimodal, advanced_rl, ai_analytics, cross_chain, developer_platform, community, bounty, confidential, zk_applications, agent_coordination, enterprise_integration, advanced_ai, ecosystem, gpu_multimodal, edge_gpu, infrastructure, storage, wallet, language, settlement) - advanced_rl/ package created (engine.py 867 LOC, agents.py, marketplace_optimizer.py) - certification/ package created (certification_system.py 582 LOC, partnership_manager.py 472 LOC, badge_system.py, service.py) - multi_modal_fusion/ package created (fusion_engine.py, neural_modules.py)