diff --git a/apps/coordinator-api/src/app/agent_identity/core.py b/apps/coordinator-api/src/app/agent_identity/core.py index 96d60e5f..cee01bae 100755 --- a/apps/coordinator-api/src/app/agent_identity/core.py +++ b/apps/coordinator-api/src/app/agent_identity/core.py @@ -52,7 +52,7 @@ class AgentIdentityCore: avatar_url=request.avatar_url, supported_chains=request.supported_chains, primary_chain=request.primary_chain, - identity_data=request.metadata, + identity_data=request.meta_data, tags=request.tags, ) @@ -70,12 +70,14 @@ class AgentIdentityCore: async def get_identity_by_agent_id(self, agent_id: str) -> AgentIdentity | None: """Get identity by agent ID""" stmt = select(AgentIdentity).where(AgentIdentity.agent_id == agent_id) - return self.session.exec(stmt).first() + result = self.session.execute(stmt) + return result.scalars().first() async def get_identity_by_owner(self, owner_address: str) -> list[AgentIdentity]: """Get all identities for an owner""" stmt = select(AgentIdentity).where(AgentIdentity.owner_address == owner_address.lower()) - return self.session.exec(stmt).all() + result = self.session.execute(stmt) + return list(result.scalars().all()) async def update_identity(self, identity_id: str, request: AgentIdentityUpdate) -> AgentIdentity: """Update an existing agent identity""" @@ -148,7 +150,8 @@ class AgentIdentityCore: stmt = select(CrossChainMapping).where( CrossChainMapping.agent_id == identity.agent_id, CrossChainMapping.chain_id == chain_id ) - return self.session.exec(stmt).first() + result = self.session.execute(stmt) + return result.scalars().first() async def get_all_cross_chain_mappings(self, identity_id: str) -> list[CrossChainMapping]: """Get all cross-chain mappings for an identity""" @@ -157,7 +160,8 @@ class AgentIdentityCore: return [] stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == identity.agent_id) - return self.session.exec(stmt).all() + result = self.session.execute(stmt) + return list(result.scalars().all()) async def verify_cross_chain_identity( self, @@ -222,7 +226,8 @@ class AgentIdentityCore: stmt = select(CrossChainMapping).where( CrossChainMapping.chain_address == chain_address.lower(), CrossChainMapping.chain_id == chain_id ) - return self.session.exec(stmt).first() + result = self.session.execute(stmt) + return result.scalars().first() async def update_cross_chain_mapping( self, identity_id: str, chain_id: int, request: CrossChainMappingUpdate @@ -357,11 +362,13 @@ class AgentIdentityCore: # Get verification records stmt = select(IdentityVerification).where(IdentityVerification.agent_id == identity.agent_id) - verifications = self.session.exec(stmt).all() + result = self.session.execute(stmt) + verifications = list(result.scalars().all()) # Get wallet information stmt = select(AgentWallet).where(AgentWallet.agent_id == identity.agent_id) - wallets = self.session.exec(stmt).all() + result = self.session.execute(stmt) + wallets = list(result.scalars().all()) return { "identity": { @@ -432,7 +439,8 @@ class AgentIdentityCore: # Apply pagination stmt = stmt.offset(offset).limit(limit) - return self.session.exec(stmt).all() + result = self.session.execute(stmt) + return list(result.scalars().all()) async def generate_identity_proof(self, identity_id: str, chain_id: int) -> dict[str, Any]: """Generate a cryptographic proof for identity verification""" diff --git a/apps/coordinator-api/src/app/agent_identity/registry.py b/apps/coordinator-api/src/app/agent_identity/registry.py index bda33b42..29a24e27 100755 --- a/apps/coordinator-api/src/app/agent_identity/registry.py +++ b/apps/coordinator-api/src/app/agent_identity/registry.py @@ -41,7 +41,8 @@ class CrossChainRegistry: # Get or create agent identity stmt = select(AgentIdentity).where(AgentIdentity.agent_id == agent_id) - identity = self.session.exec(stmt).first() + result = self.session.execute(stmt) + identity = result.scalars().first() if not identity: raise ValueError(f"Agent identity not found for agent_id: {agent_id}") @@ -112,7 +113,8 @@ class CrossChainRegistry: """Resolve agent identity to chain-specific address""" stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == agent_id, CrossChainMapping.chain_id == chain_id) - mapping = self.session.exec(stmt).first() + result = self.session.execute(stmt) + mapping = result.scalars().first() if not mapping: return None @@ -125,7 +127,8 @@ class CrossChainRegistry: stmt = select(CrossChainMapping).where( CrossChainMapping.chain_address == chain_address.lower(), CrossChainMapping.chain_id == chain_id ) - mapping = self.session.exec(stmt).first() + result = self.session.execute(stmt) + mapping = result.scalars().first() if not mapping: return None @@ -248,14 +251,16 @@ class CrossChainRegistry: # Get identity stmt = select(AgentIdentity).where(AgentIdentity.agent_id == agent_id) - identity = self.session.exec(stmt).first() + result = self.session.execute(stmt) + identity = result.scalars().first() if not identity: raise ValueError(f"Agent identity not found: {agent_id}") # Get all cross-chain mappings stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == agent_id) - mappings = self.session.exec(stmt).all() + result = self.session.execute(stmt) + mappings = list(result.scalars().all()) reputation_scores = {} @@ -270,7 +275,8 @@ class CrossChainRegistry: """Get cross-chain mapping by agent ID and chain ID""" stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == agent_id, CrossChainMapping.chain_id == chain_id) - return self.session.exec(stmt).first() + result = self.session.execute(stmt) + return result.scalars().first() async def get_cross_chain_mapping_by_identity_chain(self, identity_id: str, chain_id: int) -> CrossChainMapping | None: """Get cross-chain mapping by identity ID and chain ID""" @@ -287,19 +293,22 @@ class CrossChainRegistry: stmt = select(CrossChainMapping).where( CrossChainMapping.chain_address == chain_address.lower(), CrossChainMapping.chain_id == chain_id ) - return self.session.exec(stmt).first() + result = self.session.execute(stmt) + return result.scalars().first() async def get_all_cross_chain_mappings(self, agent_id: str) -> list[CrossChainMapping]: """Get all cross-chain mappings for an agent""" stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == agent_id) - return self.session.exec(stmt).all() + result = self.session.execute(stmt) + return list(result.scalars().all()) async def get_verified_mappings(self, agent_id: str) -> list[CrossChainMapping]: """Get all verified cross-chain mappings for an agent""" stmt = select(CrossChainMapping).where(CrossChainMapping.agent_id == agent_id, CrossChainMapping.is_verified) - return self.session.exec(stmt).all() + result = self.session.execute(stmt) + return list(result.scalars().all()) async def get_identity_verifications(self, agent_id: str, chain_id: int | None = None) -> list[IdentityVerification]: """Get verification records for an agent""" @@ -309,7 +318,8 @@ class CrossChainRegistry: if chain_id: stmt = stmt.where(IdentityVerification.chain_id == chain_id) - return self.session.exec(stmt).all() + result = self.session.execute(stmt) + return list(result.scalars().all()) async def migrate_agent_identity( self, agent_id: str, from_chain: int, to_chain: int, new_address: str, verifier_address: str | None = None @@ -409,22 +419,17 @@ class CrossChainRegistry: """Get comprehensive registry statistics""" # Total identities - identity_count = self.session.exec(select(AgentIdentity)).count() - - # Total mappings - mapping_count = self.session.exec(select(CrossChainMapping)).count() - - # Verified mappings - verified_mapping_count = self.session.exec( + identity_count = self.session.execute(select(AgentIdentity)).scalar() + mapping_count = self.session.execute(select(CrossChainMapping)).scalar() + verified_mapping_count = self.session.execute( select(CrossChainMapping).where(CrossChainMapping.is_verified) - ).count() - - # Total verifications - verification_count = self.session.exec(select(IdentityVerification)).count() + ).scalar() + verification_count = self.session.execute(select(IdentityVerification)).scalar() # Chain breakdown chain_breakdown = {} - mappings = self.session.exec(select(CrossChainMapping)).all() + result = self.session.execute(select(CrossChainMapping)) + mappings = list(result.scalars().all()) for mapping in mappings: chain_name = self._get_chain_name(mapping.chain_id) @@ -457,7 +462,8 @@ class CrossChainRegistry: # Find expired verifications stmt = select(IdentityVerification).where(IdentityVerification.expires_at < current_time) - expired_verifications = self.session.exec(stmt).all() + result = self.session.execute(stmt) + expired_verifications = list(result.scalars().all()) cleaned_count = 0 @@ -555,7 +561,8 @@ class CrossChainRegistry: """Get identity ID by agent ID""" stmt = select(AgentIdentity).where(AgentIdentity.agent_id == agent_id) - identity = self.session.exec(stmt).first() + result = self.session.execute(stmt) + identity = result.scalars().first() if not identity: raise ValueError(f"Identity not found for agent: {agent_id}") diff --git a/apps/coordinator-api/src/app/agent_identity/wallet_adapter.py b/apps/coordinator-api/src/app/agent_identity/wallet_adapter.py index 870286bd..e6c95735 100755 --- a/apps/coordinator-api/src/app/agent_identity/wallet_adapter.py +++ b/apps/coordinator-api/src/app/agent_identity/wallet_adapter.py @@ -311,7 +311,8 @@ class MultiChainWalletAdapter: stmt = select(AgentWallet).where( AgentWallet.agent_id == agent_id, AgentWallet.chain_id == chain_id, AgentWallet.is_active ) - wallet = self.session.exec(stmt).first() + result = self.session.execute(stmt) + wallet = result.scalars().first() if not wallet: raise ValueError(f"Active wallet not found for agent {agent_id} on chain {chain_id}") @@ -335,7 +336,8 @@ class MultiChainWalletAdapter: stmt = select(AgentWallet).where( AgentWallet.agent_id == agent_id, AgentWallet.chain_id == chain_id, AgentWallet.is_active ) - wallet = self.session.exec(stmt).first() + result = self.session.execute(stmt) + wallet = result.scalars().first() if not wallet: raise ValueError(f"Active wallet not found for agent {agent_id} on chain {chain_id}") @@ -366,7 +368,8 @@ class MultiChainWalletAdapter: stmt = select(AgentWallet).where( AgentWallet.agent_id == agent_id, AgentWallet.chain_id == chain_id, AgentWallet.is_active ) - wallet = self.session.exec(stmt).first() + result = self.session.execute(stmt) + wallet = result.scalars().first() if not wallet: raise ValueError(f"Active wallet not found for agent {agent_id} on chain {chain_id}") @@ -382,7 +385,8 @@ class MultiChainWalletAdapter: # Get wallet from database stmt = select(AgentWallet).where(AgentWallet.agent_id == agent_id, AgentWallet.chain_id == chain_id) - wallet = self.session.exec(stmt).first() + result = self.session.execute(stmt) + wallet = result.scalars().first() if not wallet: raise ValueError(f"Wallet not found for agent {agent_id} on chain {chain_id}") @@ -405,14 +409,16 @@ class MultiChainWalletAdapter: """Get all wallets for an agent across all chains""" stmt = select(AgentWallet).where(AgentWallet.agent_id == agent_id) - return self.session.exec(stmt).all() + result = self.session.execute(stmt) + return list(result.scalars().all()) async def deactivate_wallet(self, agent_id: str, chain_id: int) -> bool: """Deactivate an agent wallet""" # Get wallet from database stmt = select(AgentWallet).where(AgentWallet.agent_id == agent_id, AgentWallet.chain_id == chain_id) - wallet = self.session.exec(stmt).first() + result = self.session.execute(stmt) + wallet = result.scalars().first() if not wallet: raise ValueError(f"Wallet not found for agent {agent_id} on chain {chain_id}") diff --git a/apps/coordinator-api/src/app/contexts/agent_identity/domain/agent_identity.py b/apps/coordinator-api/src/app/contexts/agent_identity/domain/agent_identity.py index fc262874..67a157e7 100755 --- a/apps/coordinator-api/src/app/contexts/agent_identity/domain/agent_identity.py +++ b/apps/coordinator-api/src/app/contexts/agent_identity/domain/agent_identity.py @@ -84,14 +84,6 @@ class AgentIdentity(SQLModel, table=True): created_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) updated_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc)) - # Indexes for performance - __table_args__ = { -# # Index( Index("idx_agent_identity_owner", "owner_address"),) -# # Index( Index("idx_agent_identity_status", "status"),) -# # Index( Index("idx_agent_identity_verified", "is_verified"),) -# # Index( Index("idx_agent_identity_reputation", "reputation_score"),) - } - class CrossChainMapping(SQLModel, table=True): """Mapping of agent identity across different blockchains""" diff --git a/apps/coordinator-api/src/app/contexts/agent_identity/routers/agent_identity.py b/apps/coordinator-api/src/app/contexts/agent_identity/routers/agent_identity.py index 36fbf590..63adb021 100755 --- a/apps/coordinator-api/src/app/contexts/agent_identity/routers/agent_identity.py +++ b/apps/coordinator-api/src/app/contexts/agent_identity/routers/agent_identity.py @@ -44,7 +44,9 @@ async def create_agent_identity(request: dict[str, Any], manager: AgentIdentityM ) return JSONResponse(content=result, status_code=201) except Exception as e: - raise HTTPException(status_code=400, detail="Failed to create agent identity") + import traceback + error_detail = f"Failed to create agent identity: {str(e)}\n{traceback.format_exc()}" + raise HTTPException(status_code=400, detail=error_detail) @router.get("/identities/{agent_id}", response_model=dict[str, Any]) diff --git a/apps/coordinator-api/src/app/contexts/zk_applications/routers/ml_zk_proofs.py b/apps/coordinator-api/src/app/contexts/zk_applications/routers/ml_zk_proofs.py index 15742be1..140ca156 100755 --- a/apps/coordinator-api/src/app/contexts/zk_applications/routers/ml_zk_proofs.py +++ b/apps/coordinator-api/src/app/contexts/zk_applications/routers/ml_zk_proofs.py @@ -57,9 +57,9 @@ async def verify_ml_training(request: Request, verification_request: dict) -> di ) return { - "verified": verification_result["verified"], - "training_correct": verification_result["training_correct"], - "gradient_descent_valid": verification_result["gradient_descent_valid"], + "verified": verification_result.get("verified", False), + "computation_correct": verification_result.get("computation_correct", False), + "privacy_preserved": verification_result.get("privacy_preserved", False), } except Exception as e: raise HTTPException(status_code=500, detail=str(e)) diff --git a/apps/coordinator-api/src/app/services/zk_proofs.py b/apps/coordinator-api/src/app/services/zk_proofs.py index b551ca1a..1da58dc9 100755 --- a/apps/coordinator-api/src/app/services/zk_proofs.py +++ b/apps/coordinator-api/src/app/services/zk_proofs.py @@ -164,7 +164,7 @@ main(); if result.returncode != 0: logger.error(f"Proof verification failed: {result.stderr}") - return {"verified": False, "error": result.stderr} + return {"verified": False, "computation_correct": False, "privacy_preserved": False, "error": result.stderr} is_verified = result.stdout.strip() == "true" return { diff --git a/apps/gpu-service/src/gpu_service/main.py b/apps/gpu-service/src/gpu_service/main.py index 4347f8bd..63ec0021 100644 --- a/apps/gpu-service/src/gpu_service/main.py +++ b/apps/gpu-service/src/gpu_service/main.py @@ -139,15 +139,22 @@ async def scan_edge_gpus( return await svc.discover_and_register_edge_gpus(miner_id) +from pydantic import BaseModel + + +class OptimizeInferenceRequest(BaseModel): + model_name: str + request_data: dict + + @app.post("/v1/marketplace/edge-gpu/optimize/inference/{gpu_id}") async def optimize_inference( gpu_id: str, - model_name: str, - request_data: dict, + request: OptimizeInferenceRequest, svc: EdgeGPUService = Depends(get_edge_service), ): """Optimize ML inference request for edge GPU""" - return await svc.optimize_inference_for_edge(gpu_id, model_name, request_data) + return await svc.optimize_inference_for_edge(gpu_id, request.model_name, request.request_data) @app.post("/v1/transactions") diff --git a/apps/wallet/simple_daemon.py b/apps/wallet/simple_daemon.py index d69129a8..6b344771 100755 --- a/apps/wallet/simple_daemon.py +++ b/apps/wallet/simple_daemon.py @@ -161,6 +161,75 @@ async def list_chain_wallets(chain_id: str): "total": len(wallet_list) }) +@app.post("/v1/chains/{chain_id}/wallets") +async def create_chain_wallet(chain_id: str, request: dict[str, Any] = None): + """Create a wallet in a specific chain""" + if request is None: + request = {} + + wallet_name = request.get("wallet_name", f"{chain_id}-wallet-{datetime.now().timestamp()}") + password = request.get("password", "") + + # Import wallet creation from CLI + try: + from aitbc_cli.commands.wallet import create_wallet as cli_create_wallet + import io + import sys + + # Capture stdout to avoid printing to console + old_stdout = sys.stdout + sys.stdout = io.StringIO() + + # Create wallet using CLI function + result = cli_create_wallet(wallet_name, password) + + # Restore stdout + sys.stdout = old_stdout + + return JSONResponse({ + "wallet_name": wallet_name, + "chain_id": chain_id, + "address": result.get("address", ""), + "public_key": result.get("public_key", ""), + "encrypted": result.get("encrypted", False), + "created_at": datetime.now().isoformat(), + "mode": "daemon" + }) + except ImportError: + # Fallback: create a simple wallet if CLI not available + from aitbc import derive_ethereum_address + import secrets + + private_key = secrets.token_hex(32) + public_key = derive_ethereum_address(private_key) + address = f"ait1{public_key[2:]}" + + # Save to keystore + wallet_data = { + "address": address, + "public_key": public_key, + "private_key": private_key, + "encrypted": False, + "chain_id": chain_id + } + + KEYSTORE_PATH.mkdir(parents=True, exist_ok=True) + wallet_file = KEYSTORE_PATH / f"{wallet_name}.json" + with open(wallet_file, 'w') as f: + json.dump(wallet_data, f) + + return JSONResponse({ + "wallet_name": wallet_name, + "chain_id": chain_id, + "address": address, + "public_key": public_key, + "encrypted": False, + "created_at": datetime.now().isoformat(), + "mode": "daemon" + }) + except Exception as e: + raise HTTPException(status_code=500, detail=f"Failed to create wallet: {str(e)}") + @app.get("/v1/chains/{chain_id}/wallets/{wallet_id}") async def get_chain_wallet_info(chain_id: str, wallet_id: str): """Get wallet information from a specific chain""" @@ -249,9 +318,70 @@ async def list_wallets(): return JSONResponse({"items": wallets, "total": len(wallets)}) @app.post("/v1/wallets") -async def create_wallet(): +async def create_wallet(request: dict[str, Any] = None): """Create a wallet""" - raise HTTPException(status_code=501, detail="Wallet creation not implemented - use CLI instead") + if request is None: + request = {} + + wallet_name = request.get("wallet_name", f"wallet-{datetime.now().timestamp()}") + password = request.get("password", "") + + # Import wallet creation from CLI + try: + from aitbc_cli.commands.wallet import create_wallet as cli_create_wallet + import io + import sys + + # Capture stdout to avoid printing to console + old_stdout = sys.stdout + sys.stdout = io.StringIO() + + # Create wallet using CLI function + result = cli_create_wallet(wallet_name, password) + + # Restore stdout + sys.stdout = old_stdout + + return JSONResponse({ + "wallet_name": wallet_name, + "address": result.get("address", ""), + "public_key": result.get("public_key", ""), + "encrypted": result.get("encrypted", False), + "created_at": datetime.now().isoformat(), + "mode": "daemon" + }) + except ImportError: + # Fallback: create a simple wallet if CLI not available + from aitbc import derive_ethereum_address + import secrets + + private_key = secrets.token_hex(32) + public_key = derive_ethereum_address(private_key) + address = f"ait1{public_key[2:]}" + + # Save to keystore + wallet_data = { + "address": address, + "public_key": public_key, + "private_key": private_key, + "encrypted": False + } + + KEYSTORE_PATH.mkdir(parents=True, exist_ok=True) + wallet_file = KEYSTORE_PATH / f"{wallet_name}.json" + with open(wallet_file, 'w') as f: + json.dump(wallet_data, f) + + return JSONResponse({ + "wallet_name": wallet_name, + "address": address, + "public_key": public_key, + "encrypted": False, + "created_at": datetime.now().isoformat(), + "mode": "daemon" + }) + except Exception as e: + raise HTTPException(status_code=500, detail=f"Failed to create wallet: {str(e)}") @app.post("/v1/wallets/{wallet_id}/unlock") async def unlock_wallet(wallet_id: str):