aitbc: implement lazy loading for module imports to improve startup performance
Some checks failed
CLI Tests / test-cli (push) Failing after 3s
Integration Tests / test-service-integration (push) Successful in 1m57s
Production Tests / Production Integration Tests (push) Successful in 17s
Python Tests / test-python (push) Successful in 22s
Security Scanning / security-scan (push) Successful in 2m43s
Some checks failed
CLI Tests / test-cli (push) Failing after 3s
Integration Tests / test-service-integration (push) Successful in 1m57s
Production Tests / Production Integration Tests (push) Successful in 17s
Python Tests / test-python (push) Successful in 22s
Security Scanning / security-scan (push) Successful in 2m43s
This commit is contained in:
@@ -1,257 +1,199 @@
|
||||
"""
|
||||
AITBC Package
|
||||
Centralized utilities for AITBC applications
|
||||
Centralized utilities for AITBC applications.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from importlib import import_module
|
||||
from typing import Any
|
||||
|
||||
from .aitbc_logging import get_logger, setup_logger
|
||||
from .constants import (
|
||||
DATA_DIR,
|
||||
CONFIG_DIR,
|
||||
LOG_DIR,
|
||||
REPO_DIR,
|
||||
KEYSTORE_DIR,
|
||||
BLOCKCHAIN_DATA_DIR,
|
||||
MARKETPLACE_DATA_DIR,
|
||||
ENV_FILE,
|
||||
NODE_ENV_FILE,
|
||||
BLOCKCHAIN_RPC_PORT,
|
||||
BLOCKCHAIN_P2P_PORT,
|
||||
AGENT_COORDINATOR_PORT,
|
||||
BLOCKCHAIN_DATA_DIR,
|
||||
BLOCKCHAIN_P2P_PORT,
|
||||
BLOCKCHAIN_RPC_PORT,
|
||||
CONFIG_DIR,
|
||||
DATA_DIR,
|
||||
ENV_FILE,
|
||||
KEYSTORE_DIR,
|
||||
LOG_DIR,
|
||||
MARKETPLACE_DATA_DIR,
|
||||
MARKETPLACE_PORT,
|
||||
NODE_ENV_FILE,
|
||||
PACKAGE_VERSION,
|
||||
REPO_DIR,
|
||||
)
|
||||
from .env import (
|
||||
get_bool_env_var,
|
||||
get_env_var,
|
||||
get_float_env_var,
|
||||
get_int_env_var,
|
||||
get_list_env_var,
|
||||
get_required_env_var,
|
||||
)
|
||||
from .exceptions import (
|
||||
AITBCError,
|
||||
ConfigurationError,
|
||||
NetworkError,
|
||||
AuthenticationError,
|
||||
EncryptionError,
|
||||
DatabaseError,
|
||||
ValidationError,
|
||||
BridgeError,
|
||||
RetryError,
|
||||
CircuitBreakerOpenError,
|
||||
ConfigurationError,
|
||||
DatabaseError,
|
||||
EncryptionError,
|
||||
NetworkError,
|
||||
RateLimitError,
|
||||
)
|
||||
from .env import (
|
||||
get_env_var,
|
||||
get_required_env_var,
|
||||
get_bool_env_var,
|
||||
get_int_env_var,
|
||||
get_float_env_var,
|
||||
get_list_env_var,
|
||||
RetryError,
|
||||
ValidationError,
|
||||
)
|
||||
from .paths import (
|
||||
get_data_path,
|
||||
get_config_path,
|
||||
get_log_path,
|
||||
get_repo_path,
|
||||
ensure_dir,
|
||||
ensure_file_dir,
|
||||
resolve_path,
|
||||
get_keystore_path,
|
||||
get_blockchain_data_path,
|
||||
get_config_path,
|
||||
get_data_path,
|
||||
get_keystore_path,
|
||||
get_log_path,
|
||||
get_marketplace_data_path,
|
||||
)
|
||||
from .json_utils import (
|
||||
load_json,
|
||||
save_json,
|
||||
merge_json,
|
||||
json_to_string,
|
||||
string_to_json,
|
||||
get_nested_value,
|
||||
set_nested_value,
|
||||
flatten_json,
|
||||
)
|
||||
from .http_client import AITBCHTTPClient, AsyncAITBCHTTPClient
|
||||
from .config import BaseAITBCConfig, AITBCConfig
|
||||
from .decorators import (
|
||||
retry,
|
||||
timing,
|
||||
cache_result,
|
||||
validate_args,
|
||||
handle_exceptions,
|
||||
async_timing,
|
||||
)
|
||||
from .validation import (
|
||||
validate_address,
|
||||
validate_hash,
|
||||
validate_url,
|
||||
validate_port,
|
||||
validate_email,
|
||||
validate_non_empty,
|
||||
validate_positive_number,
|
||||
validate_range,
|
||||
validate_chain_id,
|
||||
validate_uuid,
|
||||
)
|
||||
from .async_helpers import (
|
||||
run_sync,
|
||||
gather_with_concurrency,
|
||||
run_with_timeout,
|
||||
batch_process,
|
||||
sync_to_async,
|
||||
async_to_sync,
|
||||
retry_async,
|
||||
wait_for_condition,
|
||||
)
|
||||
from .database import (
|
||||
DatabaseConnection,
|
||||
get_database_connection,
|
||||
ensure_database,
|
||||
vacuum_database,
|
||||
get_table_info,
|
||||
table_exists,
|
||||
)
|
||||
from .monitoring import (
|
||||
MetricsCollector,
|
||||
PerformanceTimer,
|
||||
HealthChecker,
|
||||
)
|
||||
from .data_layer import DataLayer, MockDataGenerator, RealDataFetcher, get_data_layer
|
||||
from .crypto import (
|
||||
derive_ethereum_address,
|
||||
sign_transaction_hash,
|
||||
verify_signature,
|
||||
encrypt_private_key,
|
||||
decrypt_private_key,
|
||||
generate_secure_random_bytes,
|
||||
keccak256_hash,
|
||||
sha256_hash,
|
||||
validate_ethereum_address,
|
||||
generate_ethereum_private_key,
|
||||
)
|
||||
from .web3_utils import Web3Client, create_web3_client
|
||||
from .security import (
|
||||
generate_token,
|
||||
generate_api_key,
|
||||
validate_token_format,
|
||||
validate_api_key,
|
||||
SessionManager,
|
||||
APIKeyManager,
|
||||
generate_secure_random_string,
|
||||
generate_secure_random_int,
|
||||
SecretManager,
|
||||
hash_password,
|
||||
verify_password,
|
||||
generate_nonce,
|
||||
generate_hmac,
|
||||
verify_hmac,
|
||||
)
|
||||
from .time_utils import (
|
||||
get_utc_now,
|
||||
get_timestamp_utc,
|
||||
format_iso8601,
|
||||
parse_iso8601,
|
||||
timestamp_to_iso,
|
||||
iso_to_timestamp,
|
||||
format_duration,
|
||||
format_duration_precise,
|
||||
parse_duration,
|
||||
add_duration,
|
||||
subtract_duration,
|
||||
get_time_until,
|
||||
get_time_since,
|
||||
calculate_deadline,
|
||||
is_deadline_passed,
|
||||
get_deadline_remaining,
|
||||
format_time_ago,
|
||||
format_time_in,
|
||||
to_timezone,
|
||||
get_timezone_offset,
|
||||
is_business_hours,
|
||||
get_start_of_day,
|
||||
get_end_of_day,
|
||||
get_start_of_week,
|
||||
get_end_of_week,
|
||||
get_start_of_month,
|
||||
get_end_of_month,
|
||||
sleep_until,
|
||||
retry_until_deadline,
|
||||
Timer,
|
||||
)
|
||||
from .api_utils import (
|
||||
APIResponse,
|
||||
PaginatedResponse,
|
||||
success_response,
|
||||
error_response,
|
||||
not_found_response,
|
||||
unauthorized_response,
|
||||
forbidden_response,
|
||||
validation_error_response,
|
||||
conflict_response,
|
||||
internal_error_response,
|
||||
PaginationParams,
|
||||
paginate_items,
|
||||
build_paginated_response,
|
||||
RateLimitHeaders,
|
||||
build_cors_headers,
|
||||
build_standard_headers,
|
||||
validate_sort_field,
|
||||
validate_sort_order,
|
||||
build_sort_params,
|
||||
filter_fields,
|
||||
exclude_fields,
|
||||
sanitize_response,
|
||||
merge_responses,
|
||||
get_client_ip,
|
||||
get_user_agent,
|
||||
build_request_metadata,
|
||||
)
|
||||
from .events import (
|
||||
Event,
|
||||
EventPriority,
|
||||
EventBus,
|
||||
AsyncEventBus,
|
||||
event_handler,
|
||||
publish_event,
|
||||
get_global_event_bus,
|
||||
set_global_event_bus,
|
||||
EventFilter,
|
||||
EventAggregator,
|
||||
EventRouter,
|
||||
)
|
||||
from .queue_manager import (
|
||||
Job,
|
||||
JobStatus,
|
||||
JobPriority,
|
||||
TaskQueue,
|
||||
JobScheduler,
|
||||
BackgroundTaskManager,
|
||||
WorkerPool,
|
||||
debounce,
|
||||
throttle,
|
||||
)
|
||||
from .state import (
|
||||
StateTransition,
|
||||
StateTransitionError,
|
||||
StatePersistenceError,
|
||||
StateMachine,
|
||||
ConfigurableStateMachine,
|
||||
StatePersistence,
|
||||
AsyncStateMachine,
|
||||
StateMonitor,
|
||||
StateValidator,
|
||||
StateSnapshot,
|
||||
)
|
||||
from .testing import (
|
||||
MockFactory,
|
||||
TestDataGenerator,
|
||||
TestHelpers,
|
||||
MockResponse,
|
||||
MockDatabase,
|
||||
MockCache,
|
||||
mock_async_call,
|
||||
create_mock_config,
|
||||
create_test_scenario,
|
||||
get_repo_path,
|
||||
resolve_path,
|
||||
)
|
||||
|
||||
__version__ = "0.6.0"
|
||||
|
||||
_LAZY_EXPORTS: dict[str, tuple[str, str]] = {
|
||||
"load_json": ("json_utils", "load_json"),
|
||||
"save_json": ("json_utils", "save_json"),
|
||||
"merge_json": ("json_utils", "merge_json"),
|
||||
"json_to_string": ("json_utils", "json_to_string"),
|
||||
"string_to_json": ("json_utils", "string_to_json"),
|
||||
"get_nested_value": ("json_utils", "get_nested_value"),
|
||||
"set_nested_value": ("json_utils", "set_nested_value"),
|
||||
"flatten_json": ("json_utils", "flatten_json"),
|
||||
"AITBCHTTPClient": ("http_client", "AITBCHTTPClient"),
|
||||
"AsyncAITBCHTTPClient": ("http_client", "AsyncAITBCHTTPClient"),
|
||||
"BaseAITBCConfig": ("config", "BaseAITBCConfig"),
|
||||
"AITBCConfig": ("config", "AITBCConfig"),
|
||||
"retry": ("decorators", "retry"),
|
||||
"timing": ("decorators", "timing"),
|
||||
"cache_result": ("decorators", "cache_result"),
|
||||
"validate_args": ("decorators", "validate_args"),
|
||||
"handle_exceptions": ("decorators", "handle_exceptions"),
|
||||
"async_timing": ("decorators", "async_timing"),
|
||||
"validate_address": ("validation", "validate_address"),
|
||||
"validate_hash": ("validation", "validate_hash"),
|
||||
"validate_url": ("validation", "validate_url"),
|
||||
"validate_port": ("validation", "validate_port"),
|
||||
"validate_email": ("validation", "validate_email"),
|
||||
"validate_non_empty": ("validation", "validate_non_empty"),
|
||||
"validate_positive_number": ("validation", "validate_positive_number"),
|
||||
"validate_range": ("validation", "validate_range"),
|
||||
"validate_chain_id": ("validation", "validate_chain_id"),
|
||||
"validate_uuid": ("validation", "validate_uuid"),
|
||||
"run_sync": ("async_helpers", "run_sync"),
|
||||
"gather_with_concurrency": ("async_helpers", "gather_with_concurrency"),
|
||||
"run_with_timeout": ("async_helpers", "run_with_timeout"),
|
||||
"batch_process": ("async_helpers", "batch_process"),
|
||||
"sync_to_async": ("async_helpers", "sync_to_async"),
|
||||
"async_to_sync": ("async_helpers", "async_to_sync"),
|
||||
"retry_async": ("async_helpers", "retry_async"),
|
||||
"wait_for_condition": ("async_helpers", "wait_for_condition"),
|
||||
"DatabaseConnection": ("database", "DatabaseConnection"),
|
||||
"get_database_connection": ("database", "get_database_connection"),
|
||||
"ensure_database": ("database", "ensure_database"),
|
||||
"vacuum_database": ("database", "vacuum_database"),
|
||||
"get_table_info": ("database", "get_table_info"),
|
||||
"table_exists": ("database", "table_exists"),
|
||||
"MetricsCollector": ("monitoring", "MetricsCollector"),
|
||||
"PerformanceTimer": ("monitoring", "PerformanceTimer"),
|
||||
"HealthChecker": ("monitoring", "HealthChecker"),
|
||||
"DataLayer": ("data_layer", "DataLayer"),
|
||||
"MockDataGenerator": ("data_layer", "MockDataGenerator"),
|
||||
"RealDataFetcher": ("data_layer", "RealDataFetcher"),
|
||||
"get_data_layer": ("data_layer", "get_data_layer"),
|
||||
"derive_ethereum_address": ("crypto", "derive_ethereum_address"),
|
||||
"sign_transaction_hash": ("crypto", "sign_transaction_hash"),
|
||||
"verify_signature": ("crypto", "verify_signature"),
|
||||
"encrypt_private_key": ("crypto", "encrypt_private_key"),
|
||||
"decrypt_private_key": ("crypto", "decrypt_private_key"),
|
||||
"generate_secure_random_bytes": ("crypto", "generate_secure_random_bytes"),
|
||||
"keccak256_hash": ("crypto", "keccak256_hash"),
|
||||
"sha256_hash": ("crypto", "sha256_hash"),
|
||||
"validate_ethereum_address": ("crypto", "validate_ethereum_address"),
|
||||
"generate_ethereum_private_key": ("crypto", "generate_ethereum_private_key"),
|
||||
"Web3Client": ("web3_utils", "Web3Client"),
|
||||
"create_web3_client": ("web3_utils", "create_web3_client"),
|
||||
"generate_token": ("security", "generate_token"),
|
||||
"generate_api_key": ("security", "generate_api_key"),
|
||||
"validate_token_format": ("security", "validate_token_format"),
|
||||
"validate_api_key": ("security", "validate_api_key"),
|
||||
"SessionManager": ("security", "SessionManager"),
|
||||
"APIKeyManager": ("security", "APIKeyManager"),
|
||||
"generate_secure_random_string": ("security", "generate_secure_random_string"),
|
||||
"generate_secure_random_int": ("security", "generate_secure_random_int"),
|
||||
"SecretManager": ("security", "SecretManager"),
|
||||
"hash_password": ("security", "hash_password"),
|
||||
"verify_password": ("security", "verify_password"),
|
||||
"generate_nonce": ("security", "generate_nonce"),
|
||||
"generate_hmac": ("security", "generate_hmac"),
|
||||
"verify_hmac": ("security", "verify_hmac"),
|
||||
}
|
||||
|
||||
for _name in (
|
||||
"get_utc_now get_timestamp_utc format_iso8601 parse_iso8601 timestamp_to_iso iso_to_timestamp "
|
||||
"format_duration format_duration_precise parse_duration add_duration subtract_duration get_time_until "
|
||||
"get_time_since calculate_deadline is_deadline_passed get_deadline_remaining format_time_ago "
|
||||
"format_time_in to_timezone get_timezone_offset is_business_hours get_start_of_day get_end_of_day "
|
||||
"get_start_of_week get_end_of_week get_start_of_month get_end_of_month sleep_until retry_until_deadline Timer"
|
||||
).split():
|
||||
_LAZY_EXPORTS[_name] = ("time_utils", _name)
|
||||
|
||||
for _name in (
|
||||
"APIResponse PaginatedResponse success_response error_response not_found_response unauthorized_response "
|
||||
"forbidden_response validation_error_response conflict_response internal_error_response PaginationParams "
|
||||
"paginate_items build_paginated_response RateLimitHeaders build_cors_headers build_standard_headers "
|
||||
"validate_sort_field validate_sort_order build_sort_params filter_fields exclude_fields sanitize_response "
|
||||
"merge_responses get_client_ip get_user_agent build_request_metadata"
|
||||
).split():
|
||||
_LAZY_EXPORTS[_name] = ("api_utils", _name)
|
||||
|
||||
for _name in (
|
||||
"Event EventPriority EventBus AsyncEventBus event_handler publish_event get_global_event_bus "
|
||||
"set_global_event_bus EventFilter EventAggregator EventRouter"
|
||||
).split():
|
||||
_LAZY_EXPORTS[_name] = ("events", _name)
|
||||
|
||||
for _name in (
|
||||
"Job JobStatus JobPriority TaskQueue JobScheduler BackgroundTaskManager WorkerPool debounce throttle"
|
||||
).split():
|
||||
_LAZY_EXPORTS[_name] = ("queue_manager", _name)
|
||||
|
||||
for _name in (
|
||||
"StateTransition StateTransitionError StatePersistenceError StateMachine ConfigurableStateMachine "
|
||||
"StatePersistence AsyncStateMachine StateMonitor StateValidator StateSnapshot"
|
||||
).split():
|
||||
_LAZY_EXPORTS[_name] = ("state", _name)
|
||||
|
||||
for _name in (
|
||||
"MockFactory TestDataGenerator TestHelpers MockResponse MockDatabase MockCache mock_async_call "
|
||||
"create_mock_config create_test_scenario"
|
||||
).split():
|
||||
_LAZY_EXPORTS[_name] = ("testing", _name)
|
||||
|
||||
|
||||
def __getattr__(name: str) -> Any:
|
||||
if name not in _LAZY_EXPORTS:
|
||||
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
||||
module_name, attribute_name = _LAZY_EXPORTS[name]
|
||||
module = import_module(f".{module_name}", __name__)
|
||||
value = getattr(module, attribute_name)
|
||||
globals()[name] = value
|
||||
return value
|
||||
|
||||
|
||||
__all__ = [
|
||||
# Logging
|
||||
"get_logger",
|
||||
"setup_logger",
|
||||
# Constants
|
||||
"DATA_DIR",
|
||||
"CONFIG_DIR",
|
||||
"LOG_DIR",
|
||||
@@ -266,7 +208,6 @@ __all__ = [
|
||||
"AGENT_COORDINATOR_PORT",
|
||||
"MARKETPLACE_PORT",
|
||||
"PACKAGE_VERSION",
|
||||
# Exceptions
|
||||
"AITBCError",
|
||||
"ConfigurationError",
|
||||
"NetworkError",
|
||||
@@ -278,14 +219,12 @@ __all__ = [
|
||||
"RetryError",
|
||||
"CircuitBreakerOpenError",
|
||||
"RateLimitError",
|
||||
# Environment helpers
|
||||
"get_env_var",
|
||||
"get_required_env_var",
|
||||
"get_bool_env_var",
|
||||
"get_int_env_var",
|
||||
"get_float_env_var",
|
||||
"get_list_env_var",
|
||||
# Path utilities
|
||||
"get_data_path",
|
||||
"get_config_path",
|
||||
"get_log_path",
|
||||
@@ -296,192 +235,5 @@ __all__ = [
|
||||
"get_keystore_path",
|
||||
"get_blockchain_data_path",
|
||||
"get_marketplace_data_path",
|
||||
# JSON utilities
|
||||
"load_json",
|
||||
"save_json",
|
||||
"merge_json",
|
||||
"json_to_string",
|
||||
"string_to_json",
|
||||
"get_nested_value",
|
||||
"set_nested_value",
|
||||
"flatten_json",
|
||||
# HTTP client
|
||||
"AITBCHTTPClient",
|
||||
"AsyncAITBCHTTPClient",
|
||||
# Configuration
|
||||
"BaseAITBCConfig",
|
||||
"AITBCConfig",
|
||||
# Decorators
|
||||
"retry",
|
||||
"timing",
|
||||
"cache_result",
|
||||
"validate_args",
|
||||
"handle_exceptions",
|
||||
"async_timing",
|
||||
# Validators
|
||||
"validate_address",
|
||||
"validate_hash",
|
||||
"validate_url",
|
||||
"validate_port",
|
||||
"validate_email",
|
||||
"validate_non_empty",
|
||||
"validate_positive_number",
|
||||
"validate_range",
|
||||
"validate_chain_id",
|
||||
"validate_uuid",
|
||||
# Async helpers
|
||||
"run_sync",
|
||||
"gather_with_concurrency",
|
||||
"run_with_timeout",
|
||||
"batch_process",
|
||||
"sync_to_async",
|
||||
"async_to_sync",
|
||||
"retry_async",
|
||||
"wait_for_condition",
|
||||
# Database
|
||||
"DatabaseConnection",
|
||||
"get_database_connection",
|
||||
"ensure_database",
|
||||
"vacuum_database",
|
||||
"get_table_info",
|
||||
"table_exists",
|
||||
# Data layer
|
||||
"DataLayer",
|
||||
"MockDataGenerator",
|
||||
"RealDataFetcher",
|
||||
"get_data_layer",
|
||||
# Monitoring
|
||||
"MetricsCollector",
|
||||
"PerformanceTimer",
|
||||
"HealthChecker",
|
||||
# Cryptography
|
||||
"derive_ethereum_address",
|
||||
"sign_transaction_hash",
|
||||
"verify_signature",
|
||||
"encrypt_private_key",
|
||||
"decrypt_private_key",
|
||||
"generate_secure_random_bytes",
|
||||
"keccak256_hash",
|
||||
"sha256_hash",
|
||||
"validate_ethereum_address",
|
||||
"generate_ethereum_private_key",
|
||||
# Web3 utilities
|
||||
"Web3Client",
|
||||
"create_web3_client",
|
||||
# Security
|
||||
"generate_token",
|
||||
"generate_api_key",
|
||||
"validate_token_format",
|
||||
"validate_api_key",
|
||||
"SessionManager",
|
||||
"APIKeyManager",
|
||||
"generate_secure_random_string",
|
||||
"generate_secure_random_int",
|
||||
"SecretManager",
|
||||
"hash_password",
|
||||
"verify_password",
|
||||
"generate_nonce",
|
||||
"generate_hmac",
|
||||
"verify_hmac",
|
||||
# Time utilities
|
||||
"get_utc_now",
|
||||
"get_timestamp_utc",
|
||||
"format_iso8601",
|
||||
"parse_iso8601",
|
||||
"timestamp_to_iso",
|
||||
"iso_to_timestamp",
|
||||
"format_duration",
|
||||
"format_duration_precise",
|
||||
"parse_duration",
|
||||
"add_duration",
|
||||
"subtract_duration",
|
||||
"get_time_until",
|
||||
"get_time_since",
|
||||
"calculate_deadline",
|
||||
"is_deadline_passed",
|
||||
"get_deadline_remaining",
|
||||
"format_time_ago",
|
||||
"format_time_in",
|
||||
"to_timezone",
|
||||
"get_timezone_offset",
|
||||
"is_business_hours",
|
||||
"get_start_of_day",
|
||||
"get_end_of_day",
|
||||
"get_start_of_week",
|
||||
"get_end_of_week",
|
||||
"get_start_of_month",
|
||||
"get_end_of_month",
|
||||
"sleep_until",
|
||||
"retry_until_deadline",
|
||||
"Timer",
|
||||
# API utilities
|
||||
"APIResponse",
|
||||
"PaginatedResponse",
|
||||
"success_response",
|
||||
"error_response",
|
||||
"not_found_response",
|
||||
"unauthorized_response",
|
||||
"forbidden_response",
|
||||
"validation_error_response",
|
||||
"conflict_response",
|
||||
"internal_error_response",
|
||||
"PaginationParams",
|
||||
"paginate_items",
|
||||
"build_paginated_response",
|
||||
"RateLimitHeaders",
|
||||
"build_cors_headers",
|
||||
"build_standard_headers",
|
||||
"validate_sort_field",
|
||||
"validate_sort_order",
|
||||
"build_sort_params",
|
||||
"filter_fields",
|
||||
"exclude_fields",
|
||||
"sanitize_response",
|
||||
"merge_responses",
|
||||
"get_client_ip",
|
||||
"get_user_agent",
|
||||
"build_request_metadata",
|
||||
# Events
|
||||
"Event",
|
||||
"EventPriority",
|
||||
"EventBus",
|
||||
"AsyncEventBus",
|
||||
"event_handler",
|
||||
"publish_event",
|
||||
"get_global_event_bus",
|
||||
"set_global_event_bus",
|
||||
"EventFilter",
|
||||
"EventAggregator",
|
||||
"EventRouter",
|
||||
# Queue
|
||||
"Job",
|
||||
"JobStatus",
|
||||
"JobPriority",
|
||||
"TaskQueue",
|
||||
"JobScheduler",
|
||||
"BackgroundTaskManager",
|
||||
"WorkerPool",
|
||||
"debounce",
|
||||
"throttle",
|
||||
# State
|
||||
"StateTransition",
|
||||
"StateTransitionError",
|
||||
"StatePersistenceError",
|
||||
"StateMachine",
|
||||
"ConfigurableStateMachine",
|
||||
"StatePersistence",
|
||||
"AsyncStateMachine",
|
||||
"StateMonitor",
|
||||
"StateValidator",
|
||||
"StateSnapshot",
|
||||
# Testing
|
||||
"MockFactory",
|
||||
"TestDataGenerator",
|
||||
"TestHelpers",
|
||||
"MockResponse",
|
||||
"MockDatabase",
|
||||
"MockCache",
|
||||
"mock_async_call",
|
||||
"create_mock_config",
|
||||
"create_test_scenario",
|
||||
*_LAZY_EXPORTS.keys(),
|
||||
]
|
||||
|
||||
31
apps/agent-coordinator/src/app/exceptions.py
Normal file
31
apps/agent-coordinator/src/app/exceptions.py
Normal file
@@ -0,0 +1,31 @@
|
||||
from datetime import datetime
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
def register_exception_handlers(app):
|
||||
@app.exception_handler(404)
|
||||
async def not_found_handler(request, exc):
|
||||
return JSONResponse(
|
||||
status_code=404,
|
||||
content={
|
||||
"status": "error",
|
||||
"message": "Resource not found",
|
||||
"timestamp": datetime.utcnow().isoformat(),
|
||||
},
|
||||
)
|
||||
|
||||
@app.exception_handler(500)
|
||||
async def internal_error_handler(request, exc):
|
||||
logger.error(f"Internal server error: {exc}")
|
||||
return JSONResponse(
|
||||
status_code=500,
|
||||
content={
|
||||
"status": "error",
|
||||
"message": "Internal server error",
|
||||
"timestamp": datetime.utcnow().isoformat(),
|
||||
},
|
||||
)
|
||||
40
apps/agent-coordinator/src/app/lifespan.py
Normal file
40
apps/agent-coordinator/src/app/lifespan.py
Normal file
@@ -0,0 +1,40 @@
|
||||
import asyncio
|
||||
from contextlib import asynccontextmanager
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi import FastAPI
|
||||
|
||||
from . import state
|
||||
from .protocols.communication import CommunicationManager
|
||||
from .protocols.message_types import MessageProcessor
|
||||
from .routing.agent_discovery import AgentDiscoveryService, AgentRegistry
|
||||
from .routing.load_balancer import LoadBalancer, LoadBalancingStrategy, TaskDistributor
|
||||
|
||||
logger = get_logger(__name__)
|
||||
|
||||
|
||||
@asynccontextmanager
|
||||
async def lifespan(app: FastAPI):
|
||||
logger.info("Starting AITBC Agent Coordinator...")
|
||||
|
||||
state.agent_registry = AgentRegistry()
|
||||
await state.agent_registry.start()
|
||||
|
||||
state.discovery_service = AgentDiscoveryService(state.agent_registry)
|
||||
state.load_balancer = LoadBalancer(state.agent_registry)
|
||||
state.load_balancer.set_strategy(LoadBalancingStrategy.LEAST_CONNECTIONS)
|
||||
state.task_distributor = TaskDistributor(state.load_balancer)
|
||||
state.communication_manager = CommunicationManager("agent-coordinator")
|
||||
state.message_processor = MessageProcessor("agent-coordinator")
|
||||
|
||||
asyncio.create_task(state.task_distributor.start_distribution())
|
||||
asyncio.create_task(state.message_processor.start_processing())
|
||||
|
||||
logger.info("Agent Coordinator started successfully")
|
||||
|
||||
yield
|
||||
|
||||
logger.info("Shutting down AITBC Agent Coordinator...")
|
||||
if state.agent_registry:
|
||||
await state.agent_registry.stop()
|
||||
logger.info("Agent Coordinator shut down")
|
||||
File diff suppressed because it is too large
Load Diff
27
apps/agent-coordinator/src/app/middleware.py
Normal file
27
apps/agent-coordinator/src/app/middleware.py
Normal file
@@ -0,0 +1,27 @@
|
||||
import time
|
||||
|
||||
from .auth.middleware import security_headers
|
||||
from .monitoring.prometheus_metrics import performance_monitor
|
||||
|
||||
|
||||
def register_middleware(app):
|
||||
@app.middleware("http")
|
||||
async def metrics_middleware(request, call_next):
|
||||
start_time = time.time()
|
||||
response = await call_next(request)
|
||||
duration = time.time() - start_time
|
||||
performance_monitor.record_request(
|
||||
method=request.method,
|
||||
endpoint=request.url.path,
|
||||
status_code=response.status_code,
|
||||
duration=duration,
|
||||
)
|
||||
return response
|
||||
|
||||
@app.middleware("http")
|
||||
async def security_headers_middleware(request, call_next):
|
||||
response = await call_next(request)
|
||||
headers = security_headers.get_security_headers()
|
||||
for header, value in headers.items():
|
||||
response.headers[header] = value
|
||||
return response
|
||||
30
apps/agent-coordinator/src/app/models.py
Normal file
30
apps/agent-coordinator/src/app/models.py
Normal file
@@ -0,0 +1,30 @@
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
|
||||
class AgentRegistrationRequest(BaseModel):
|
||||
agent_id: str = Field(..., description="Unique agent identifier")
|
||||
agent_type: str = Field(..., description="Type of agent")
|
||||
capabilities: List[str] = Field(default_factory=list, description="Agent capabilities")
|
||||
services: List[str] = Field(default_factory=list, description="Available services")
|
||||
endpoints: Dict[str, str] = Field(default_factory=dict, description="Service endpoints")
|
||||
metadata: Dict[str, Any] = Field(default_factory=dict, description="Additional metadata")
|
||||
|
||||
|
||||
class AgentStatusUpdate(BaseModel):
|
||||
status: str = Field(..., description="Agent status")
|
||||
load_metrics: Dict[str, float] = Field(default_factory=dict, description="Load metrics")
|
||||
|
||||
|
||||
class TaskSubmission(BaseModel):
|
||||
task_data: Dict[str, Any] = Field(..., description="Task data")
|
||||
priority: str = Field("normal", description="Task priority")
|
||||
requirements: Optional[Dict[str, Any]] = Field(None, description="Task requirements")
|
||||
|
||||
|
||||
class MessageRequest(BaseModel):
|
||||
receiver_id: str = Field(..., description="Receiver agent ID")
|
||||
message_type: str = Field(..., description="Message type")
|
||||
payload: Dict[str, Any] = Field(..., description="Message payload")
|
||||
priority: str = Field("normal", description="Message priority")
|
||||
14
apps/agent-coordinator/src/app/routers/__init__.py
Normal file
14
apps/agent-coordinator/src/app/routers/__init__.py
Normal file
@@ -0,0 +1,14 @@
|
||||
from . import agents, ai, alerts, auth, consensus, health, messages, monitoring, tasks, users
|
||||
|
||||
ROUTERS = [
|
||||
health.router,
|
||||
agents.router,
|
||||
tasks.router,
|
||||
messages.router,
|
||||
ai.router,
|
||||
consensus.router,
|
||||
auth.router,
|
||||
users.router,
|
||||
monitoring.router,
|
||||
alerts.router,
|
||||
]
|
||||
142
apps/agent-coordinator/src/app/routers/agents.py
Normal file
142
apps/agent-coordinator/src/app/routers/agents.py
Normal file
@@ -0,0 +1,142 @@
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from .. import state
|
||||
from ..auth.jwt_handler import api_key_manager, jwt_handler
|
||||
from ..auth.middleware import get_current_user, require_role
|
||||
from ..auth.permissions import Permission, Role, permission_manager
|
||||
from ..ai.advanced_ai import ai_integration
|
||||
from ..ai.realtime_learning import learning_system
|
||||
from ..consensus.distributed_consensus import distributed_consensus
|
||||
from ..models import AgentRegistrationRequest, AgentStatusUpdate, MessageRequest, TaskSubmission
|
||||
from ..monitoring.alerting import alert_manager
|
||||
from ..monitoring.prometheus_metrics import metrics_registry, performance_monitor
|
||||
from ..protocols.communication import MessageType, create_protocol
|
||||
from ..protocols.message_types import create_task_message
|
||||
from ..routing.agent_discovery import create_agent_info
|
||||
from ..routing.load_balancer import LoadBalancingStrategy, TaskPriority
|
||||
|
||||
logger = get_logger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
# Agent registration
|
||||
@router.post("/agents/register")
|
||||
async def register_agent(request: AgentRegistrationRequest):
|
||||
"""Register a new agent"""
|
||||
try:
|
||||
if not state.agent_registry:
|
||||
raise HTTPException(status_code=503, detail="Agent registry not available")
|
||||
|
||||
# Create agent info with validation
|
||||
try:
|
||||
agent_info = create_agent_info(
|
||||
agent_id=request.agent_id,
|
||||
agent_type=request.agent_type,
|
||||
capabilities=request.capabilities,
|
||||
services=request.services,
|
||||
endpoints=request.endpoints
|
||||
)
|
||||
agent_info.metadata = request.metadata
|
||||
except ValueError as e:
|
||||
raise HTTPException(status_code=422, detail=str(e))
|
||||
|
||||
# Register agent
|
||||
success = await state.agent_registry.register_agent(agent_info)
|
||||
|
||||
if success:
|
||||
return {
|
||||
"status": "success",
|
||||
"message": f"Agent {request.agent_id} registered successfully",
|
||||
"agent_id": request.agent_id,
|
||||
"registered_at": datetime.utcnow().isoformat()
|
||||
}
|
||||
else:
|
||||
raise HTTPException(status_code=500, detail="Failed to register agent")
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error registering agent: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Agent discovery
|
||||
@router.post("/agents/discover")
|
||||
async def discover_agents(query: Dict[str, Any]):
|
||||
"""Discover agents based on criteria"""
|
||||
try:
|
||||
if not state.agent_registry:
|
||||
raise HTTPException(status_code=503, detail="Agent registry not available")
|
||||
|
||||
agents = await state.agent_registry.discover_agents(query)
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"query": query,
|
||||
"agents": [agent.to_dict() for agent in agents],
|
||||
"count": len(agents),
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error discovering agents: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Get agent by ID
|
||||
@router.get("/agents/{agent_id}")
|
||||
async def get_agent(agent_id: str):
|
||||
"""Get agent information by ID"""
|
||||
try:
|
||||
if not state.agent_registry:
|
||||
raise HTTPException(status_code=503, detail="Agent registry not available")
|
||||
|
||||
agent = await state.agent_registry.get_agent_by_id(agent_id)
|
||||
|
||||
if not agent:
|
||||
raise HTTPException(status_code=404, detail="Agent not found")
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"agent": agent.to_dict(),
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting agent: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Update agent status
|
||||
@router.put("/agents/{agent_id}/status")
|
||||
async def update_agent_status(agent_id: str, request: AgentStatusUpdate):
|
||||
"""Update agent status"""
|
||||
try:
|
||||
if not state.agent_registry:
|
||||
raise HTTPException(status_code=503, detail="Agent registry not available")
|
||||
|
||||
from ..routing.agent_discovery import AgentStatus
|
||||
|
||||
success = await state.agent_registry.update_agent_status(
|
||||
agent_id,
|
||||
AgentStatus(request.status),
|
||||
request.load_metrics
|
||||
)
|
||||
|
||||
if success:
|
||||
return {
|
||||
"status": "success",
|
||||
"message": f"Agent {agent_id} status updated",
|
||||
"agent_id": agent_id,
|
||||
"new_status": request.status,
|
||||
"updated_at": datetime.utcnow().isoformat()
|
||||
}
|
||||
else:
|
||||
raise HTTPException(status_code=500, detail="Failed to update agent status")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error updating agent status: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
135
apps/agent-coordinator/src/app/routers/ai.py
Normal file
135
apps/agent-coordinator/src/app/routers/ai.py
Normal file
@@ -0,0 +1,135 @@
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from .. import state
|
||||
from ..auth.jwt_handler import api_key_manager, jwt_handler
|
||||
from ..auth.middleware import get_current_user, require_role
|
||||
from ..auth.permissions import Permission, Role, permission_manager
|
||||
from ..ai.advanced_ai import ai_integration
|
||||
from ..ai.realtime_learning import learning_system
|
||||
from ..consensus.distributed_consensus import distributed_consensus
|
||||
from ..models import AgentRegistrationRequest, AgentStatusUpdate, MessageRequest, TaskSubmission
|
||||
from ..monitoring.alerting import alert_manager
|
||||
from ..monitoring.prometheus_metrics import metrics_registry, performance_monitor
|
||||
from ..protocols.communication import MessageType, create_protocol
|
||||
from ..protocols.message_types import create_task_message
|
||||
from ..routing.agent_discovery import create_agent_info
|
||||
from ..routing.load_balancer import LoadBalancingStrategy, TaskPriority
|
||||
|
||||
logger = get_logger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
# Advanced AI/ML endpoints
|
||||
@router.post("/ai/learning/experience")
|
||||
async def record_learning_experience(experience_data: Dict[str, Any]):
|
||||
"""Record a learning experience for the AI system"""
|
||||
try:
|
||||
result = await learning_system.record_experience(experience_data)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error recording learning experience: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.get("/ai/learning/statistics")
|
||||
async def get_learning_statistics():
|
||||
"""Get learning system statistics"""
|
||||
try:
|
||||
result = await learning_system.get_learning_statistics()
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting learning statistics: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/ai/learning/predict")
|
||||
async def predict_performance(context: Dict[str, Any], action: str = Query(...)):
|
||||
"""Predict performance for a given action"""
|
||||
try:
|
||||
result = await learning_system.predict_performance(context, action)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error predicting performance: {e}")
|
||||
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]):
|
||||
"""Get AI-recommended action"""
|
||||
try:
|
||||
result = await learning_system.recommend_action(context, available_actions)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error recommending action: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/ai/neural-network/create")
|
||||
async def create_neural_network(config: Dict[str, Any]):
|
||||
"""Create a new neural network"""
|
||||
try:
|
||||
result = await ai_integration.create_neural_network(config)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error creating neural network: {e}")
|
||||
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):
|
||||
"""Train a neural network"""
|
||||
try:
|
||||
result = await ai_integration.train_neural_network(network_id, training_data, epochs)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error training neural network: {e}")
|
||||
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]):
|
||||
"""Make prediction with neural network"""
|
||||
try:
|
||||
result = await ai_integration.predict_with_neural_network(network_id, features)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error predicting with neural network: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/ai/ml-model/create")
|
||||
async def create_ml_model(config: Dict[str, Any]):
|
||||
"""Create a new ML model"""
|
||||
try:
|
||||
result = await ai_integration.create_ml_model(config)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error creating ML model: {e}")
|
||||
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]]):
|
||||
"""Train an ML model"""
|
||||
try:
|
||||
result = await ai_integration.train_ml_model(model_id, training_data)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error training ML model: {e}")
|
||||
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]):
|
||||
"""Make prediction with ML model"""
|
||||
try:
|
||||
result = await ai_integration.predict_with_ml_model(model_id, features)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error predicting with ML model: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.get("/ai/statistics")
|
||||
async def get_ai_statistics():
|
||||
"""Get comprehensive AI/ML statistics"""
|
||||
try:
|
||||
result = await ai_integration.get_ai_statistics()
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting AI statistics: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
218
apps/agent-coordinator/src/app/routers/alerts.py
Normal file
218
apps/agent-coordinator/src/app/routers/alerts.py
Normal file
@@ -0,0 +1,218 @@
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from .. import state
|
||||
from ..auth.jwt_handler import api_key_manager, jwt_handler
|
||||
from ..auth.middleware import get_current_user, require_role
|
||||
from ..auth.permissions import Permission, Role, permission_manager
|
||||
from ..ai.advanced_ai import ai_integration
|
||||
from ..ai.realtime_learning import learning_system
|
||||
from ..consensus.distributed_consensus import distributed_consensus
|
||||
from ..models import AgentRegistrationRequest, AgentStatusUpdate, MessageRequest, TaskSubmission
|
||||
from ..monitoring.alerting import alert_manager
|
||||
from ..monitoring.prometheus_metrics import metrics_registry, performance_monitor
|
||||
from ..protocols.communication import MessageType, create_protocol
|
||||
from ..protocols.message_types import create_task_message
|
||||
from ..routing.agent_discovery import create_agent_info
|
||||
from ..routing.load_balancer import LoadBalancingStrategy, TaskPriority
|
||||
|
||||
logger = get_logger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
# Alerting endpoints
|
||||
@router.get("/alerts")
|
||||
async def get_alerts(
|
||||
status: Optional[str] = None,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Get alerts with optional status filter"""
|
||||
try:
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.SECURITY_VIEW):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
if status == "active":
|
||||
alerts = alert_manager.get_active_alerts()
|
||||
else:
|
||||
alerts = alert_manager.get_alert_history()
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"alerts": alerts,
|
||||
"total": len(alerts)
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting alerts: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/alerts/{alert_id}/resolve")
|
||||
async def resolve_alert(
|
||||
alert_id: str,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Resolve an alert"""
|
||||
try:
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.SECURITY_MANAGE):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
result = alert_manager.resolve_alert(alert_id)
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error resolving alert: {e}")
|
||||
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)):
|
||||
"""Get alert statistics"""
|
||||
try:
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.SECURITY_VIEW):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
stats = alert_manager.get_alert_stats()
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"stats": stats
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting alert stats: {e}")
|
||||
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)):
|
||||
"""Get alert rules"""
|
||||
try:
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.SECURITY_VIEW):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
rules = [rule.to_dict() for rule in alert_manager.rules.values()]
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"rules": rules,
|
||||
"total": len(rules)
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting alert rules: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# SLA monitoring endpoints
|
||||
@router.get("/sla")
|
||||
async def get_sla_status(
|
||||
sla_id: Optional[str] = None,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Get SLA status"""
|
||||
try:
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.SECURITY_VIEW):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
if sla_id:
|
||||
sla_status = alert_manager.sla_monitor.get_sla_compliance(sla_id)
|
||||
else:
|
||||
sla_status = alert_manager.sla_monitor.get_all_sla_status()
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"sla": sla_status
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting SLA status: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/sla/{sla_id}/record")
|
||||
async def record_sla_metric(
|
||||
sla_id: str,
|
||||
value: float,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Record SLA metric"""
|
||||
try:
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.SECURITY_MANAGE):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
alert_manager.sla_monitor.record_metric(sla_id, value)
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"message": f"SLA metric recorded for {sla_id}",
|
||||
"value": value,
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error recording SLA metric: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# System status endpoint with monitoring
|
||||
@router.get("/system/status")
|
||||
async def get_system_status(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):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
# Get various status information
|
||||
performance = performance_monitor.get_performance_summary()
|
||||
alerts = alert_manager.get_active_alerts()
|
||||
sla_status = alert_manager.sla_monitor.get_all_sla_status()
|
||||
|
||||
# Get system health
|
||||
import psutil
|
||||
memory = psutil.virtual_memory()
|
||||
cpu = psutil.cpu_percent(interval=1)
|
||||
|
||||
status = {
|
||||
"overall": "healthy" if len(alerts) == 0 else "degraded",
|
||||
"performance": performance,
|
||||
"alerts": {
|
||||
"active_count": len(alerts),
|
||||
"critical_count": len([a for a in alerts if a.get("severity") == "critical"]),
|
||||
"warning_count": len([a for a in alerts if a.get("severity") == "warning"])
|
||||
},
|
||||
"sla": {
|
||||
"overall_compliance": sla_status.get("overall_compliance", 100.0),
|
||||
"total_slas": sla_status.get("total_slas", 0)
|
||||
},
|
||||
"system": {
|
||||
"memory_usage": memory.percent,
|
||||
"cpu_usage": cpu,
|
||||
"uptime": performance["uptime_seconds"]
|
||||
},
|
||||
"services": {
|
||||
"agent_coordinator": "running",
|
||||
"agent_registry": "running" if state.agent_registry else "stopped",
|
||||
"load_balancer": "running" if state.load_balancer else "stopped",
|
||||
"task_distributor": "running" if state.task_distributor else "stopped"
|
||||
},
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
return status
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting system status: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
196
apps/agent-coordinator/src/app/routers/auth.py
Normal file
196
apps/agent-coordinator/src/app/routers/auth.py
Normal file
@@ -0,0 +1,196 @@
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from .. import state
|
||||
from ..auth.jwt_handler import api_key_manager, jwt_handler
|
||||
from ..auth.middleware import get_current_user, require_role
|
||||
from ..auth.permissions import Permission, Role, permission_manager
|
||||
from ..ai.advanced_ai import ai_integration
|
||||
from ..ai.realtime_learning import learning_system
|
||||
from ..consensus.distributed_consensus import distributed_consensus
|
||||
from ..models import AgentRegistrationRequest, AgentStatusUpdate, MessageRequest, TaskSubmission
|
||||
from ..monitoring.alerting import alert_manager
|
||||
from ..monitoring.prometheus_metrics import metrics_registry, performance_monitor
|
||||
from ..protocols.communication import MessageType, create_protocol
|
||||
from ..protocols.message_types import create_task_message
|
||||
from ..routing.agent_discovery import create_agent_info
|
||||
from ..routing.load_balancer import LoadBalancingStrategy, TaskPriority
|
||||
|
||||
logger = get_logger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
# Authentication endpoints
|
||||
@router.post("/auth/login")
|
||||
async def login(login_data: Dict[str, str]):
|
||||
"""User login with username and password"""
|
||||
try:
|
||||
username = login_data.get("username")
|
||||
password = login_data.get("password")
|
||||
|
||||
if not username or not password:
|
||||
raise HTTPException(status_code=422, detail="Username and password are required")
|
||||
|
||||
# In a real implementation, verify credentials against database
|
||||
# For demo, we'll create a simple user
|
||||
import os
|
||||
|
||||
demo_users = {
|
||||
"admin": os.getenv("DEMO_ADMIN_PASSWORD", "admin123"),
|
||||
"operator": os.getenv("DEMO_OPERATOR_PASSWORD", "operator123"),
|
||||
"user": os.getenv("DEMO_USER_PASSWORD", "user123")
|
||||
}
|
||||
|
||||
if username == "admin" and password == demo_users["admin"]:
|
||||
user_id = "admin_001"
|
||||
role = Role.ADMIN
|
||||
elif username == "operator" and password == demo_users["operator"]:
|
||||
user_id = "operator_001"
|
||||
role = Role.OPERATOR
|
||||
elif username == "user" and password == demo_users["user"]:
|
||||
user_id = "user_001"
|
||||
role = Role.USER
|
||||
else:
|
||||
raise HTTPException(status_code=401, detail="Invalid credentials")
|
||||
|
||||
# Assign role to user
|
||||
permission_manager.assign_role(user_id, role)
|
||||
|
||||
# Generate JWT token
|
||||
token_result = jwt_handler.generate_token({
|
||||
"user_id": user_id,
|
||||
"username": username,
|
||||
"role": role.value,
|
||||
"permissions": [perm.value for perm in permission_manager.user_permissions.get(user_id, set())]
|
||||
})
|
||||
|
||||
# Generate refresh token
|
||||
refresh_result = jwt_handler.generate_refresh_token({
|
||||
"user_id": user_id,
|
||||
"username": username,
|
||||
"role": role.value
|
||||
})
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"user_id": user_id,
|
||||
"username": username,
|
||||
"role": role.value,
|
||||
"access_token": token_result["token"],
|
||||
"refresh_token": refresh_result["refresh_token"],
|
||||
"expires_at": token_result["expires_at"],
|
||||
"token_type": token_result["token_type"]
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error during login: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/auth/refresh")
|
||||
async def refresh_token(refresh_data: Dict[str, str]):
|
||||
"""Refresh access token using refresh token"""
|
||||
try:
|
||||
refresh_token = refresh_data.get("refresh_token")
|
||||
|
||||
if not refresh_token:
|
||||
raise HTTPException(status_code=422, detail="Refresh token is required")
|
||||
|
||||
result = jwt_handler.refresh_access_token(refresh_token)
|
||||
|
||||
if result["status"] == "error":
|
||||
raise HTTPException(status_code=401, detail=result["message"])
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error refreshing token: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/auth/validate")
|
||||
async def validate_token(validate_data: Dict[str, str]):
|
||||
"""Validate JWT token"""
|
||||
try:
|
||||
token = validate_data.get("token")
|
||||
|
||||
if not token:
|
||||
raise HTTPException(status_code=422, detail="Token is required")
|
||||
|
||||
result = jwt_handler.validate_token(token)
|
||||
|
||||
if not result["valid"]:
|
||||
raise HTTPException(status_code=401, detail=result["message"])
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error validating token: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/auth/api-key/generate")
|
||||
async def generate_api_key(
|
||||
user_id: str,
|
||||
permissions: List[str] = None,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Generate API key for user"""
|
||||
try:
|
||||
# Check if user has permission to generate API keys
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.SECURITY_MANAGE):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
result = api_key_manager.generate_api_key(user_id, permissions)
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error generating API key: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/auth/api-key/validate")
|
||||
async def validate_api_key(api_key: str):
|
||||
"""Validate API key"""
|
||||
try:
|
||||
result = api_key_manager.validate_api_key(api_key)
|
||||
|
||||
if not result["valid"]:
|
||||
raise HTTPException(status_code=401, detail="Invalid API key")
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error validating API key: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.delete("/auth/api-key/{api_key}")
|
||||
async def revoke_api_key(
|
||||
api_key: str,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Revoke API key"""
|
||||
try:
|
||||
# Check if user has permission to manage API keys
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.SECURITY_MANAGE):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
result = api_key_manager.revoke_api_key(api_key)
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error revoking API key: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
133
apps/agent-coordinator/src/app/routers/consensus.py
Normal file
133
apps/agent-coordinator/src/app/routers/consensus.py
Normal file
@@ -0,0 +1,133 @@
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from .. import state
|
||||
from ..auth.jwt_handler import api_key_manager, jwt_handler
|
||||
from ..auth.middleware import get_current_user, require_role
|
||||
from ..auth.permissions import Permission, Role, permission_manager
|
||||
from ..ai.advanced_ai import ai_integration
|
||||
from ..ai.realtime_learning import learning_system
|
||||
from ..consensus.distributed_consensus import distributed_consensus
|
||||
from ..models import AgentRegistrationRequest, AgentStatusUpdate, MessageRequest, TaskSubmission
|
||||
from ..monitoring.alerting import alert_manager
|
||||
from ..monitoring.prometheus_metrics import metrics_registry, performance_monitor
|
||||
from ..protocols.communication import MessageType, create_protocol
|
||||
from ..protocols.message_types import create_task_message
|
||||
from ..routing.agent_discovery import create_agent_info
|
||||
from ..routing.load_balancer import LoadBalancingStrategy, TaskPriority
|
||||
|
||||
logger = get_logger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
# Distributed consensus endpoints
|
||||
@router.post("/consensus/node/register")
|
||||
async def register_consensus_node(node_data: Dict[str, Any]):
|
||||
"""Register a node in the consensus network"""
|
||||
try:
|
||||
result = await distributed_consensus.register_node(node_data)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error registering consensus node: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/consensus/proposal/create")
|
||||
async def create_consensus_proposal(proposal_data: Dict[str, Any]):
|
||||
"""Create a new consensus proposal"""
|
||||
try:
|
||||
result = await distributed_consensus.create_proposal(proposal_data)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error creating consensus proposal: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/consensus/proposal/{proposal_id}/vote")
|
||||
async def cast_consensus_vote(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)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error casting consensus vote: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.get("/consensus/proposal/{proposal_id}")
|
||||
async def get_proposal_status(proposal_id: str):
|
||||
"""Get proposal status"""
|
||||
try:
|
||||
result = await distributed_consensus.get_proposal_status(proposal_id)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting proposal status: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.put("/consensus/algorithm")
|
||||
async def set_consensus_algorithm(algorithm: str = Query(..., description="Consensus algorithm")):
|
||||
"""Set the consensus algorithm"""
|
||||
try:
|
||||
result = await distributed_consensus.set_consensus_algorithm(algorithm)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error setting consensus algorithm: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.get("/consensus/statistics")
|
||||
async def get_consensus_statistics():
|
||||
"""Get consensus statistics"""
|
||||
try:
|
||||
result = await distributed_consensus.get_consensus_statistics()
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting consensus statistics: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.put("/consensus/node/{node_id}/status")
|
||||
async def update_node_status(node_id: str, is_active: bool):
|
||||
"""Update node status"""
|
||||
try:
|
||||
result = await distributed_consensus.update_node_status(node_id, is_active)
|
||||
return result
|
||||
except Exception as e:
|
||||
logger.error(f"Error updating node status: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Advanced features status endpoint
|
||||
@router.get("/advanced-features/status")
|
||||
async def get_advanced_features_status():
|
||||
"""Get status of all advanced features"""
|
||||
try:
|
||||
learning_stats = await learning_system.get_learning_statistics()
|
||||
ai_stats = await ai_integration.get_ai_statistics()
|
||||
consensus_stats = await distributed_consensus.get_consensus_statistics()
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"timestamp": datetime.utcnow().isoformat(),
|
||||
"features": {
|
||||
"realtime_learning": {
|
||||
"status": "active",
|
||||
"experiences": learning_stats.get("total_experiences", 0),
|
||||
"learning_rate": learning_stats.get("learning_rate", 0.01),
|
||||
"models": learning_stats.get("models_count", 0)
|
||||
},
|
||||
"advanced_ai": {
|
||||
"status": "active",
|
||||
"models": ai_stats.get("total_models", 0),
|
||||
"neural_networks": ai_stats.get("total_neural_networks", 0),
|
||||
"predictions": ai_stats.get("total_predictions", 0)
|
||||
},
|
||||
"distributed_consensus": {
|
||||
"status": "active",
|
||||
"nodes": consensus_stats.get("active_nodes", 0),
|
||||
"proposals": consensus_stats.get("total_proposals", 0),
|
||||
"success_rate": consensus_stats.get("success_rate", 0.0),
|
||||
"algorithm": consensus_stats.get("current_algorithm", "majority_vote")
|
||||
}
|
||||
}
|
||||
}
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting advanced features status: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
57
apps/agent-coordinator/src/app/routers/health.py
Normal file
57
apps/agent-coordinator/src/app/routers/health.py
Normal file
@@ -0,0 +1,57 @@
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from .. import state
|
||||
from ..auth.jwt_handler import api_key_manager, jwt_handler
|
||||
from ..auth.middleware import get_current_user, require_role
|
||||
from ..auth.permissions import Permission, Role, permission_manager
|
||||
from ..ai.advanced_ai import ai_integration
|
||||
from ..ai.realtime_learning import learning_system
|
||||
from ..consensus.distributed_consensus import distributed_consensus
|
||||
from ..models import AgentRegistrationRequest, AgentStatusUpdate, MessageRequest, TaskSubmission
|
||||
from ..monitoring.alerting import alert_manager
|
||||
from ..monitoring.prometheus_metrics import metrics_registry, performance_monitor
|
||||
from ..protocols.communication import MessageType, create_protocol
|
||||
from ..protocols.message_types import create_task_message
|
||||
from ..routing.agent_discovery import create_agent_info
|
||||
from ..routing.load_balancer import LoadBalancingStrategy, TaskPriority
|
||||
|
||||
logger = get_logger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
# Health check endpoint
|
||||
@router.get("/health")
|
||||
async def health_check():
|
||||
"""Health check endpoint"""
|
||||
return {
|
||||
"status": "healthy",
|
||||
"service": "agent-coordinator",
|
||||
"timestamp": datetime.utcnow().isoformat(),
|
||||
"version": "1.0.0"
|
||||
}
|
||||
|
||||
# Root endpoint
|
||||
@router.get("/")
|
||||
async def root():
|
||||
"""Root endpoint with service information"""
|
||||
return {
|
||||
"service": "AITBC Agent Coordinator",
|
||||
"description": "Advanced multi-agent coordination and management system",
|
||||
"version": "1.0.0",
|
||||
"endpoints": [
|
||||
"/health",
|
||||
"/agents/register",
|
||||
"/agents/discover",
|
||||
"/agents/{agent_id}",
|
||||
"/agents/{agent_id}/status",
|
||||
"/tasks/submit",
|
||||
"/tasks/status",
|
||||
"/messages/send",
|
||||
"/load-balancer/stats",
|
||||
"/registry/stats"
|
||||
]
|
||||
}
|
||||
185
apps/agent-coordinator/src/app/routers/messages.py
Normal file
185
apps/agent-coordinator/src/app/routers/messages.py
Normal file
@@ -0,0 +1,185 @@
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from .. import state
|
||||
from ..auth.jwt_handler import api_key_manager, jwt_handler
|
||||
from ..auth.middleware import get_current_user, require_role
|
||||
from ..auth.permissions import Permission, Role, permission_manager
|
||||
from ..ai.advanced_ai import ai_integration
|
||||
from ..ai.realtime_learning import learning_system
|
||||
from ..consensus.distributed_consensus import distributed_consensus
|
||||
from ..models import AgentRegistrationRequest, AgentStatusUpdate, MessageRequest, TaskSubmission
|
||||
from ..monitoring.alerting import alert_manager
|
||||
from ..monitoring.prometheus_metrics import metrics_registry, performance_monitor
|
||||
from ..protocols.communication import MessageType, create_protocol
|
||||
from ..protocols.message_types import create_task_message
|
||||
from ..routing.agent_discovery import create_agent_info
|
||||
from ..routing.load_balancer import LoadBalancingStrategy, TaskPriority
|
||||
|
||||
logger = get_logger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
# Send message
|
||||
@router.post("/messages/send")
|
||||
async def send_message(request: MessageRequest):
|
||||
"""Send message to agent"""
|
||||
try:
|
||||
if not state.communication_manager:
|
||||
raise HTTPException(status_code=503, detail="Communication manager not available")
|
||||
|
||||
from ..protocols.communication import AgentMessage, Priority
|
||||
|
||||
# Convert message type
|
||||
try:
|
||||
message_type = MessageType(request.message_type)
|
||||
except ValueError:
|
||||
raise HTTPException(status_code=400, detail=f"Invalid message type: {request.message_type}")
|
||||
|
||||
# Convert priority
|
||||
try:
|
||||
priority = Priority(request.priority.lower())
|
||||
except ValueError:
|
||||
raise HTTPException(status_code=400, detail=f"Invalid priority: {request.priority}")
|
||||
|
||||
# Create message
|
||||
message = AgentMessage(
|
||||
sender_id="agent-coordinator",
|
||||
receiver_id=request.receiver_id,
|
||||
message_type=message_type,
|
||||
priority=priority,
|
||||
payload=request.payload
|
||||
)
|
||||
|
||||
# Send message
|
||||
success = await state.communication_manager.send_message("hierarchical", message)
|
||||
|
||||
if success:
|
||||
return {
|
||||
"status": "success",
|
||||
"message": "Message sent successfully",
|
||||
"message_id": message.id,
|
||||
"receiver_id": request.receiver_id,
|
||||
"sent_at": datetime.utcnow().isoformat()
|
||||
}
|
||||
else:
|
||||
raise HTTPException(status_code=500, detail="Failed to send message")
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error sending message: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Load balancer statistics
|
||||
@router.get("/load-balancer/stats")
|
||||
async def get_load_balancer_stats():
|
||||
"""Get load balancer statistics"""
|
||||
try:
|
||||
if not state.load_balancer:
|
||||
raise HTTPException(status_code=503, detail="Load balancer not available")
|
||||
|
||||
stats = state.load_balancer.get_load_balancing_stats()
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"stats": stats,
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting load balancer stats: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Registry statistics
|
||||
@router.get("/registry/stats")
|
||||
async def get_registry_stats():
|
||||
"""Get agent registry statistics"""
|
||||
try:
|
||||
if not state.agent_registry:
|
||||
raise HTTPException(status_code=503, detail="Agent registry not available")
|
||||
|
||||
stats = await state.agent_registry.get_registry_stats()
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"stats": stats,
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting registry stats: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Get agents by service
|
||||
@router.get("/agents/service/{service}")
|
||||
async def get_agents_by_service(service: str):
|
||||
"""Get agents that provide a specific service"""
|
||||
try:
|
||||
if not state.agent_registry:
|
||||
raise HTTPException(status_code=503, detail="Agent registry not available")
|
||||
|
||||
agents = await state.agent_registry.get_agents_by_service(service)
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"service": service,
|
||||
"agents": [agent.to_dict() for agent in agents],
|
||||
"count": len(agents),
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting agents by service: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Get agents by capability
|
||||
@router.get("/agents/capability/{capability}")
|
||||
async def get_agents_by_capability(capability: str):
|
||||
"""Get agents that have a specific capability"""
|
||||
try:
|
||||
if not state.agent_registry:
|
||||
raise HTTPException(status_code=503, detail="Agent registry not available")
|
||||
|
||||
agents = await state.agent_registry.get_agents_by_capability(capability)
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"capability": capability,
|
||||
"agents": [agent.to_dict() for agent in agents],
|
||||
"count": len(agents),
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting agents by capability: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Set load balancing strategy
|
||||
@router.put("/load-balancer/strategy")
|
||||
async def set_load_balancing_strategy(strategy: str = Query(..., description="Load balancing strategy")):
|
||||
"""Set load balancing strategy"""
|
||||
try:
|
||||
if not state.load_balancer:
|
||||
raise HTTPException(status_code=503, detail="Load balancer not available")
|
||||
|
||||
try:
|
||||
load_balancing_strategy = LoadBalancingStrategy(strategy.lower())
|
||||
except ValueError:
|
||||
raise HTTPException(status_code=400, detail=f"Invalid strategy: {strategy}")
|
||||
|
||||
state.load_balancer.set_strategy(load_balancing_strategy)
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"message": f"Load balancing strategy set to {strategy}",
|
||||
"strategy": strategy,
|
||||
"updated_at": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error setting load balancing strategy: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
129
apps/agent-coordinator/src/app/routers/monitoring.py
Normal file
129
apps/agent-coordinator/src/app/routers/monitoring.py
Normal file
@@ -0,0 +1,129 @@
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from .. import state
|
||||
from ..auth.jwt_handler import api_key_manager, jwt_handler
|
||||
from ..auth.middleware import get_current_user, require_role
|
||||
from ..auth.permissions import Permission, Role, permission_manager
|
||||
from ..ai.advanced_ai import ai_integration
|
||||
from ..ai.realtime_learning import learning_system
|
||||
from ..consensus.distributed_consensus import distributed_consensus
|
||||
from ..models import AgentRegistrationRequest, AgentStatusUpdate, MessageRequest, TaskSubmission
|
||||
from ..monitoring.alerting import alert_manager
|
||||
from ..monitoring.prometheus_metrics import metrics_registry, performance_monitor
|
||||
from ..protocols.communication import MessageType, create_protocol
|
||||
from ..protocols.message_types import create_task_message
|
||||
from ..routing.agent_discovery import create_agent_info
|
||||
from ..routing.load_balancer import LoadBalancingStrategy, TaskPriority
|
||||
|
||||
logger = get_logger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
# Monitoring and metrics endpoints
|
||||
@router.get("/metrics")
|
||||
async def get_prometheus_metrics():
|
||||
"""Get metrics in Prometheus format"""
|
||||
try:
|
||||
metrics = metrics_registry.get_all_metrics()
|
||||
|
||||
# Convert to Prometheus text format
|
||||
prometheus_output = []
|
||||
|
||||
for name, metric_data in metrics.items():
|
||||
prometheus_output.append(f"# HELP {name} {metric_data['description']}")
|
||||
prometheus_output.append(f"# TYPE {name} {metric_data['type']}")
|
||||
|
||||
if metric_data['type'] == 'counter':
|
||||
for labels, value in metric_data['values'].items():
|
||||
if labels != '_default':
|
||||
prometheus_output.append(f"{name}{{{labels}}} {value}")
|
||||
else:
|
||||
prometheus_output.append(f"{name} {value}")
|
||||
|
||||
elif metric_data['type'] == 'gauge':
|
||||
for labels, value in metric_data['values'].items():
|
||||
if labels != '_default':
|
||||
prometheus_output.append(f"{name}{{{labels}}} {value}")
|
||||
else:
|
||||
prometheus_output.append(f"{name} {value}")
|
||||
|
||||
elif metric_data['type'] == 'histogram':
|
||||
for key, count in metric_data['counts'].items():
|
||||
prometheus_output.append(f"{name}_count{{{key}}} {count}")
|
||||
for key, sum_val in metric_data['sums'].items():
|
||||
prometheus_output.append(f"{name}_sum{{{key}}} {sum_val}")
|
||||
|
||||
return Response(
|
||||
content="\n".join(prometheus_output),
|
||||
media_type="text/plain"
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting metrics: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.get("/metrics/summary")
|
||||
async def get_metrics_summary():
|
||||
"""Get metrics summary for dashboard"""
|
||||
try:
|
||||
summary = performance_monitor.get_performance_summary()
|
||||
|
||||
# Add additional system metrics
|
||||
system_metrics = {
|
||||
"total_agents": len(state.agent_registry.agents) if state.agent_registry else 0,
|
||||
"active_agents": len([a for a in state.agent_registry.agents.values() if getattr(a, 'is_active', True)]) if state.agent_registry else 0,
|
||||
"total_tasks": len(state.task_distributor.task_queue._queue) if state.task_distributor and hasattr(state.task_distributor, 'task_queue') else 0,
|
||||
"load_balancer_strategy": state.load_balancer.strategy.value if state.load_balancer else "unknown"
|
||||
}
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"performance": summary,
|
||||
"system": system_metrics,
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting metrics summary: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.get("/metrics/health")
|
||||
async def get_health_metrics():
|
||||
"""Get health metrics for monitoring"""
|
||||
try:
|
||||
# Get system health metrics
|
||||
import psutil
|
||||
|
||||
memory = psutil.virtual_memory()
|
||||
cpu = psutil.cpu_percent(interval=1)
|
||||
|
||||
# Update performance monitor with system metrics
|
||||
performance_monitor.update_system_metrics(memory.used, cpu)
|
||||
|
||||
health_metrics = {
|
||||
"memory": {
|
||||
"total": memory.total,
|
||||
"available": memory.available,
|
||||
"used": memory.used,
|
||||
"percentage": memory.percent
|
||||
},
|
||||
"cpu": {
|
||||
"percentage": cpu,
|
||||
"count": psutil.cpu_count()
|
||||
},
|
||||
"uptime": performance_monitor.get_performance_summary()["uptime_seconds"],
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"health": health_metrics
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting health metrics: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
80
apps/agent-coordinator/src/app/routers/tasks.py
Normal file
80
apps/agent-coordinator/src/app/routers/tasks.py
Normal file
@@ -0,0 +1,80 @@
|
||||
from datetime import datetime
|
||||
import uuid
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from .. import state
|
||||
from ..auth.jwt_handler import api_key_manager, jwt_handler
|
||||
from ..auth.middleware import get_current_user, require_role
|
||||
from ..auth.permissions import Permission, Role, permission_manager
|
||||
from ..ai.advanced_ai import ai_integration
|
||||
from ..ai.realtime_learning import learning_system
|
||||
from ..consensus.distributed_consensus import distributed_consensus
|
||||
from ..models import AgentRegistrationRequest, AgentStatusUpdate, MessageRequest, TaskSubmission
|
||||
from ..monitoring.alerting import alert_manager
|
||||
from ..monitoring.prometheus_metrics import metrics_registry, performance_monitor
|
||||
from ..protocols.communication import MessageType, create_protocol
|
||||
from ..protocols.message_types import create_task_message
|
||||
from ..routing.agent_discovery import create_agent_info
|
||||
from ..routing.load_balancer import LoadBalancingStrategy, TaskPriority
|
||||
|
||||
logger = get_logger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
# Submit task
|
||||
@router.post("/tasks/submit")
|
||||
async def submit_task(request: TaskSubmission, background_tasks: BackgroundTasks):
|
||||
"""Submit a task for distribution"""
|
||||
try:
|
||||
if not state.task_distributor:
|
||||
raise HTTPException(status_code=503, detail="Task distributor not available")
|
||||
|
||||
# Convert priority string to enum
|
||||
try:
|
||||
priority = TaskPriority(request.priority.lower())
|
||||
except ValueError:
|
||||
raise HTTPException(status_code=400, detail=f"Invalid priority: {request.priority}")
|
||||
|
||||
# Submit task
|
||||
await state.task_distributor.submit_task(
|
||||
request.task_data,
|
||||
priority,
|
||||
request.requirements
|
||||
)
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"message": "Task submitted successfully",
|
||||
"task_id": request.task_data.get("task_id", str(uuid.uuid4())),
|
||||
"priority": request.priority,
|
||||
"submitted_at": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error submitting task: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Get task status
|
||||
@router.get("/tasks/status")
|
||||
async def get_task_status():
|
||||
"""Get task distribution statistics"""
|
||||
try:
|
||||
if not state.task_distributor:
|
||||
raise HTTPException(status_code=503, detail="Task distributor not available")
|
||||
|
||||
stats = state.task_distributor.get_distribution_stats()
|
||||
|
||||
return {
|
||||
"status": "success",
|
||||
"stats": stats,
|
||||
"timestamp": datetime.utcnow().isoformat()
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting task status: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
244
apps/agent-coordinator/src/app/routers/users.py
Normal file
244
apps/agent-coordinator/src/app/routers/users.py
Normal file
@@ -0,0 +1,244 @@
|
||||
from datetime import datetime
|
||||
from typing import Any, Dict, List, Optional
|
||||
|
||||
from aitbc import get_logger
|
||||
from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, Query, Response
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from .. import state
|
||||
from ..auth.jwt_handler import api_key_manager, jwt_handler
|
||||
from ..auth.middleware import get_current_user, require_role
|
||||
from ..auth.permissions import Permission, Role, permission_manager
|
||||
from ..ai.advanced_ai import ai_integration
|
||||
from ..ai.realtime_learning import learning_system
|
||||
from ..consensus.distributed_consensus import distributed_consensus
|
||||
from ..models import AgentRegistrationRequest, AgentStatusUpdate, MessageRequest, TaskSubmission
|
||||
from ..monitoring.alerting import alert_manager
|
||||
from ..monitoring.prometheus_metrics import metrics_registry, performance_monitor
|
||||
from ..protocols.communication import MessageType, create_protocol
|
||||
from ..protocols.message_types import create_task_message
|
||||
from ..routing.agent_discovery import create_agent_info
|
||||
from ..routing.load_balancer import LoadBalancingStrategy, TaskPriority
|
||||
|
||||
logger = get_logger(__name__)
|
||||
router = APIRouter()
|
||||
|
||||
# User management endpoints
|
||||
@router.post("/users/{user_id}/role")
|
||||
async def assign_user_role(
|
||||
user_id: str,
|
||||
role: str,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Assign role to user"""
|
||||
try:
|
||||
# Check if user has permission to manage roles
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.USER_MANAGE_ROLES):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
try:
|
||||
role_enum = Role(role.lower())
|
||||
except ValueError:
|
||||
raise HTTPException(status_code=400, detail=f"Invalid role: {role}")
|
||||
|
||||
result = permission_manager.assign_role(user_id, role_enum)
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error assigning user role: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.get("/users/{user_id}/role")
|
||||
async def get_user_role(
|
||||
user_id: str,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Get user's role"""
|
||||
try:
|
||||
# Check if user has permission to view users
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.USER_VIEW):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
result = permission_manager.get_user_role(user_id)
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting user role: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.get("/users/{user_id}/permissions")
|
||||
async def get_user_permissions(
|
||||
user_id: str,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Get user's permissions"""
|
||||
try:
|
||||
# Users can view their own permissions, admins can view any
|
||||
if user_id != current_user["user_id"] and not permission_manager.has_permission(current_user["user_id"], Permission.USER_VIEW):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
result = permission_manager.get_user_permissions(user_id)
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting user permissions: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.post("/users/{user_id}/permissions/grant")
|
||||
async def grant_user_permission(
|
||||
user_id: str,
|
||||
permission: str,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Grant custom permission to user"""
|
||||
try:
|
||||
# Check if user has permission to manage permissions
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.USER_MANAGE_ROLES):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
try:
|
||||
permission_enum = Permission(permission)
|
||||
except ValueError:
|
||||
raise HTTPException(status_code=400, detail=f"Invalid permission: {permission}")
|
||||
|
||||
result = permission_manager.grant_custom_permission(user_id, permission_enum)
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error granting user permission: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.delete("/users/{user_id}/permissions/{permission}")
|
||||
async def revoke_user_permission(
|
||||
user_id: str,
|
||||
permission: str,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Revoke custom permission from user"""
|
||||
try:
|
||||
# Check if user has permission to manage permissions
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.USER_MANAGE_ROLES):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
try:
|
||||
permission_enum = Permission(permission)
|
||||
except ValueError:
|
||||
raise HTTPException(status_code=400, detail=f"Invalid permission: {permission}")
|
||||
|
||||
result = permission_manager.revoke_custom_permission(user_id, permission_enum)
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error revoking user permission: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Role and permission management endpoints
|
||||
@router.get("/roles")
|
||||
async def list_all_roles(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
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.USER_VIEW):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
result = permission_manager.list_all_roles()
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error listing roles: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.get("/roles/{role}")
|
||||
async def get_role_permissions(
|
||||
role: str,
|
||||
current_user: Dict[str, Any] = Depends(get_current_user)
|
||||
):
|
||||
"""Get all permissions for a specific role"""
|
||||
try:
|
||||
# Check if user has permission to view roles
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.USER_VIEW):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
try:
|
||||
role_enum = Role(role.lower())
|
||||
except ValueError:
|
||||
raise HTTPException(status_code=400, detail=f"Invalid role: {role}")
|
||||
|
||||
result = permission_manager.get_role_permissions(role_enum)
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting role permissions: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
@router.get("/auth/stats")
|
||||
async def get_permission_stats(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
|
||||
if not permission_manager.has_permission(current_user["user_id"], Permission.SECURITY_VIEW):
|
||||
raise HTTPException(status_code=403, detail="Insufficient permissions")
|
||||
|
||||
result = permission_manager.get_permission_stats()
|
||||
|
||||
return result
|
||||
|
||||
except HTTPException:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting permission stats: {e}")
|
||||
raise HTTPException(status_code=500, detail=str(e))
|
||||
|
||||
# Protected endpoint example
|
||||
@router.get("/protected/admin")
|
||||
@require_role([Role.ADMIN])
|
||||
async def admin_only_endpoint(current_user: Dict[str, Any] = Depends(get_current_user)):
|
||||
"""Admin-only endpoint example"""
|
||||
return {
|
||||
"status": "success",
|
||||
"message": "Welcome admin!",
|
||||
"user": {
|
||||
"user_id": current_user.get("user_id"),
|
||||
"username": current_user.get("username"),
|
||||
"role": str(current_user.get("role")),
|
||||
"permissions": current_user.get("permissions", []),
|
||||
"auth_type": current_user.get("auth_type")
|
||||
}
|
||||
}
|
||||
|
||||
@router.get("/protected/operator")
|
||||
@require_role([Role.ADMIN, Role.OPERATOR])
|
||||
async def operator_endpoint(current_user: Dict[str, Any] = Depends(get_current_user)):
|
||||
"""Operator and admin endpoint example"""
|
||||
return {
|
||||
"status": "success",
|
||||
"message": "Welcome operator!",
|
||||
"user": {
|
||||
"user_id": current_user.get("user_id"),
|
||||
"username": current_user.get("username"),
|
||||
"role": str(current_user.get("role")),
|
||||
"permissions": current_user.get("permissions", []),
|
||||
"auth_type": current_user.get("auth_type")
|
||||
}
|
||||
}
|
||||
15
apps/agent-coordinator/src/app/state.py
Normal file
15
apps/agent-coordinator/src/app/state.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Optional
|
||||
|
||||
from .protocols.communication import CommunicationManager
|
||||
from .protocols.message_types import MessageProcessor
|
||||
from .routing.agent_discovery import AgentDiscoveryService, AgentRegistry
|
||||
from .routing.load_balancer import LoadBalancer, TaskDistributor
|
||||
|
||||
agent_registry: Optional[AgentRegistry] = None
|
||||
discovery_service: Optional[AgentDiscoveryService] = None
|
||||
load_balancer: Optional[LoadBalancer] = None
|
||||
task_distributor: Optional[TaskDistributor] = None
|
||||
communication_manager: Optional[CommunicationManager] = None
|
||||
message_processor: Optional[MessageProcessor] = None
|
||||
28
cli/parser_context.py
Normal file
28
cli/parser_context.py
Normal file
@@ -0,0 +1,28 @@
|
||||
"""Shared parser context for unified CLI command registration."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import Any, Callable, Mapping
|
||||
|
||||
|
||||
@dataclass(slots=True)
|
||||
class ParserContext:
|
||||
default_rpc_url: str
|
||||
default_coordinator_url: str
|
||||
cli_version: str
|
||||
first: Callable[..., Any]
|
||||
read_password: Callable[..., Any]
|
||||
output_format: Callable[..., Any]
|
||||
render_mapping: Callable[..., Any]
|
||||
read_blockchain_env: Callable[..., Any]
|
||||
normalize_rpc_url: Callable[..., Any]
|
||||
probe_rpc_node: Callable[..., Any]
|
||||
get_network_snapshot: Callable[..., Any]
|
||||
handlers: Mapping[str, Callable[..., Any]]
|
||||
|
||||
def __getattr__(self, name: str):
|
||||
try:
|
||||
return self.handlers[name]
|
||||
except KeyError as exc:
|
||||
raise AttributeError(name) from exc
|
||||
19
cli/parsers/__init__.py
Normal file
19
cli/parsers/__init__.py
Normal file
@@ -0,0 +1,19 @@
|
||||
"""Parser registration modules for the unified CLI."""
|
||||
|
||||
from . import ai, agent, blockchain, bridge, genesis, market, messaging, network, openclaw, pool_hub, resource, system, wallet, workflow
|
||||
|
||||
def register_all(subparsers, ctx):
|
||||
wallet.register(subparsers, ctx)
|
||||
blockchain.register(subparsers, ctx)
|
||||
messaging.register(subparsers, ctx)
|
||||
network.register(subparsers, ctx)
|
||||
market.register(subparsers, ctx)
|
||||
ai.register(subparsers, ctx)
|
||||
system.register(subparsers, ctx)
|
||||
agent.register(subparsers, ctx)
|
||||
openclaw.register(subparsers, ctx)
|
||||
workflow.register(subparsers, ctx)
|
||||
resource.register(subparsers, ctx)
|
||||
genesis.register(subparsers, ctx)
|
||||
pool_hub.register(subparsers, ctx)
|
||||
bridge.register(subparsers, ctx)
|
||||
51
cli/parsers/agent.py
Normal file
51
cli/parsers/agent.py
Normal file
@@ -0,0 +1,51 @@
|
||||
"""Agent command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
agent_parser = subparsers.add_parser("agent", help="AI agent workflow orchestration")
|
||||
agent_parser.set_defaults(handler=lambda parsed, parser=agent_parser: parser.print_help())
|
||||
agent_subparsers = agent_parser.add_subparsers(dest="agent_action")
|
||||
|
||||
agent_create_parser = agent_subparsers.add_parser("create", help="Create an agent workflow")
|
||||
agent_create_parser.add_argument("--name", required=True)
|
||||
agent_create_parser.add_argument("--description")
|
||||
agent_create_parser.add_argument("--workflow-file")
|
||||
agent_create_parser.add_argument("--verification", choices=["basic", "full", "zero-knowledge"], default="basic")
|
||||
agent_create_parser.add_argument("--max-execution-time", type=int, default=3600)
|
||||
agent_create_parser.add_argument("--max-cost-budget", type=float, default=0.0)
|
||||
agent_create_parser.set_defaults(handler=ctx.handle_agent_action)
|
||||
|
||||
agent_execute_parser = agent_subparsers.add_parser("execute", help="Execute an agent workflow")
|
||||
agent_execute_parser.add_argument("--name", required=True)
|
||||
agent_execute_parser.add_argument("--input-data")
|
||||
agent_execute_parser.add_argument("--wallet")
|
||||
agent_execute_parser.add_argument("--priority", choices=["low", "medium", "high"], default="medium")
|
||||
agent_execute_parser.set_defaults(handler=ctx.handle_agent_action)
|
||||
|
||||
agent_status_parser = agent_subparsers.add_parser("status", help="Show agent status")
|
||||
agent_status_parser.add_argument("--name")
|
||||
agent_status_parser.add_argument("--execution-id")
|
||||
agent_status_parser.set_defaults(handler=ctx.handle_agent_action)
|
||||
|
||||
agent_list_parser = agent_subparsers.add_parser("list", help="List agents")
|
||||
agent_list_parser.add_argument("--status", choices=["active", "completed", "failed"])
|
||||
agent_list_parser.set_defaults(handler=ctx.handle_agent_action)
|
||||
|
||||
agent_message_parser = agent_subparsers.add_parser("message", help="Send message to agent")
|
||||
agent_message_parser.add_argument("--agent", required=True)
|
||||
agent_message_parser.add_argument("--message", required=True)
|
||||
agent_message_parser.add_argument("--wallet", required=True)
|
||||
agent_message_parser.add_argument("--password")
|
||||
agent_message_parser.add_argument("--password-file")
|
||||
agent_message_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
agent_message_parser.set_defaults(handler=ctx.handle_agent_action, agent_action="message")
|
||||
|
||||
agent_messages_parser = agent_subparsers.add_parser("messages", help="List agent messages")
|
||||
agent_messages_parser.add_argument("--agent", required=True)
|
||||
agent_messages_parser.add_argument("--wallet")
|
||||
agent_messages_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
agent_messages_parser.set_defaults(handler=ctx.handle_agent_action, agent_action="messages")
|
||||
77
cli/parsers/ai.py
Normal file
77
cli/parsers/ai.py
Normal file
@@ -0,0 +1,77 @@
|
||||
"""AI command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
ai_parser = subparsers.add_parser("ai", help="AI job submission and inspection")
|
||||
ai_parser.set_defaults(handler=lambda parsed, parser=ai_parser: parser.print_help())
|
||||
ai_subparsers = ai_parser.add_subparsers(dest="ai_action")
|
||||
|
||||
ai_submit_parser = ai_subparsers.add_parser("submit", help="Submit an AI job")
|
||||
ai_submit_parser.add_argument("wallet_name", nargs="?")
|
||||
ai_submit_parser.add_argument("job_type_arg", nargs="?")
|
||||
ai_submit_parser.add_argument("prompt_arg", nargs="?")
|
||||
ai_submit_parser.add_argument("payment_arg", nargs="?")
|
||||
ai_submit_parser.add_argument("--wallet")
|
||||
ai_submit_parser.add_argument("--type", dest="job_type")
|
||||
ai_submit_parser.add_argument("--prompt")
|
||||
ai_submit_parser.add_argument("--payment", type=float)
|
||||
ai_submit_parser.add_argument("--password")
|
||||
ai_submit_parser.add_argument("--password-file")
|
||||
ai_submit_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_submit_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
ai_submit_parser.set_defaults(handler=ctx.handle_ai_submit)
|
||||
|
||||
ai_jobs_parser = ai_subparsers.add_parser("jobs", help="List AI jobs")
|
||||
ai_jobs_parser.add_argument("--limit", type=int, default=10)
|
||||
ai_jobs_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_jobs_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
ai_jobs_parser.set_defaults(handler=ctx.handle_ai_jobs)
|
||||
|
||||
ai_status_parser = ai_subparsers.add_parser("status", help="Show AI job status")
|
||||
ai_status_parser.add_argument("job_id_arg", nargs="?")
|
||||
ai_status_parser.add_argument("--job-id", dest="job_id")
|
||||
ai_status_parser.add_argument("--wallet")
|
||||
ai_status_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_status_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
ai_status_parser.set_defaults(handler=ctx.handle_ai_job)
|
||||
|
||||
ai_service_parser = ai_subparsers.add_parser("service", help="AI service management")
|
||||
ai_service_subparsers = ai_service_parser.add_subparsers(dest="ai_service_action")
|
||||
|
||||
ai_service_list_parser = ai_service_subparsers.add_parser("list", help="List available AI services")
|
||||
ai_service_list_parser.set_defaults(handler=ctx.handle_ai_service_list)
|
||||
|
||||
ai_service_status_parser = ai_service_subparsers.add_parser("status", help="Check AI service status")
|
||||
ai_service_status_parser.add_argument("--name", help="Service name to check")
|
||||
ai_service_status_parser.set_defaults(handler=ctx.handle_ai_service_status)
|
||||
|
||||
ai_service_test_parser = ai_service_subparsers.add_parser("test", help="Test AI service endpoint")
|
||||
ai_service_test_parser.add_argument("--name", help="Service name to test")
|
||||
ai_service_test_parser.set_defaults(handler=ctx.handle_ai_service_test)
|
||||
|
||||
ai_results_parser = ai_subparsers.add_parser("results", help="Show AI job results")
|
||||
ai_results_parser.add_argument("job_id_arg", nargs="?")
|
||||
ai_results_parser.add_argument("--job-id", dest="job_id")
|
||||
ai_results_parser.add_argument("--wallet")
|
||||
ai_results_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_results_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
ai_results_parser.set_defaults(handler=ctx.handle_ai_job) # Reuse job handler
|
||||
|
||||
ai_cancel_parser = ai_subparsers.add_parser("cancel", help="Cancel AI job")
|
||||
ai_cancel_parser.add_argument("job_id_arg", nargs="?")
|
||||
ai_cancel_parser.add_argument("--job-id", dest="job_id")
|
||||
ai_cancel_parser.add_argument("--wallet", required=True)
|
||||
ai_cancel_parser.add_argument("--password")
|
||||
ai_cancel_parser.add_argument("--password-file")
|
||||
ai_cancel_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_cancel_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
ai_cancel_parser.set_defaults(handler=ctx.handle_ai_cancel)
|
||||
|
||||
ai_stats_parser = ai_subparsers.add_parser("stats", help="AI service statistics")
|
||||
ai_stats_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_stats_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
ai_stats_parser.set_defaults(handler=ctx.handle_ai_stats)
|
||||
83
cli/parsers/blockchain.py
Normal file
83
cli/parsers/blockchain.py
Normal file
@@ -0,0 +1,83 @@
|
||||
"""Blockchain command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
blockchain_parser = subparsers.add_parser("blockchain", help="Blockchain state and block inspection")
|
||||
blockchain_parser.set_defaults(handler=ctx.handle_blockchain_info, rpc_url=ctx.default_rpc_url)
|
||||
blockchain_subparsers = blockchain_parser.add_subparsers(dest="blockchain_action")
|
||||
|
||||
blockchain_info_parser = blockchain_subparsers.add_parser("info", help="Show chain information")
|
||||
blockchain_info_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
blockchain_info_parser.set_defaults(handler=ctx.handle_blockchain_info)
|
||||
|
||||
blockchain_height_parser = blockchain_subparsers.add_parser("height", help="Show current height")
|
||||
blockchain_height_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
blockchain_height_parser.set_defaults(handler=ctx.handle_blockchain_height)
|
||||
|
||||
blockchain_block_parser = blockchain_subparsers.add_parser("block", help="Inspect a block")
|
||||
blockchain_block_parser.add_argument("number", nargs="?", type=int)
|
||||
blockchain_block_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
blockchain_block_parser.set_defaults(handler=ctx.handle_blockchain_block)
|
||||
|
||||
blockchain_init_parser = blockchain_subparsers.add_parser("init", help="Initialize blockchain with genesis block")
|
||||
blockchain_init_parser.add_argument("--force", action="store_true", help="Force reinitialization")
|
||||
blockchain_init_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
blockchain_init_parser.set_defaults(handler=ctx.handle_blockchain_init)
|
||||
|
||||
blockchain_genesis_parser = blockchain_subparsers.add_parser("genesis", help="Create or inspect genesis block")
|
||||
blockchain_genesis_parser.add_argument("--create", action="store_true", help="Create new genesis block")
|
||||
blockchain_genesis_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
blockchain_genesis_parser.set_defaults(handler=ctx.handle_blockchain_genesis)
|
||||
|
||||
blockchain_import_parser = blockchain_subparsers.add_parser("import", help="Import a block")
|
||||
blockchain_import_parser.add_argument("--file", help="Block data file")
|
||||
blockchain_import_parser.add_argument("--json", help="Block data as JSON string")
|
||||
blockchain_import_parser.add_argument("--chain-id", help="Chain ID for the block")
|
||||
blockchain_import_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
blockchain_import_parser.set_defaults(handler=ctx.handle_blockchain_import)
|
||||
|
||||
blockchain_export_parser = blockchain_subparsers.add_parser("export", help="Export full chain")
|
||||
blockchain_export_parser.add_argument("--output", help="Output file")
|
||||
blockchain_export_parser.add_argument("--chain-id", help="Chain ID to export")
|
||||
blockchain_export_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
blockchain_export_parser.set_defaults(handler=ctx.handle_blockchain_export)
|
||||
|
||||
blockchain_import_chain_parser = blockchain_subparsers.add_parser("import-chain", help="Import chain state")
|
||||
blockchain_import_chain_parser.add_argument("--file", required=True, help="Chain state file")
|
||||
blockchain_import_chain_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
blockchain_import_chain_parser.set_defaults(handler=ctx.handle_blockchain_import_chain)
|
||||
|
||||
blockchain_blocks_range_parser = blockchain_subparsers.add_parser("blocks-range", help="Get blocks in height range")
|
||||
blockchain_blocks_range_parser.add_argument("--start", type=int, help="Start height")
|
||||
blockchain_blocks_range_parser.add_argument("--end", type=int, help="End height")
|
||||
blockchain_blocks_range_parser.add_argument("--limit", type=int, default=10, help="Limit number of blocks")
|
||||
blockchain_blocks_range_parser.add_argument("--chain-id", help="Chain ID")
|
||||
blockchain_blocks_range_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
blockchain_blocks_range_parser.set_defaults(handler=ctx.handle_blockchain_blocks_range)
|
||||
|
||||
account_parser = subparsers.add_parser("account", help="Account information")
|
||||
account_parser.set_defaults(handler=lambda parsed, parser=account_parser: parser.print_help())
|
||||
account_subparsers = account_parser.add_subparsers(dest="account_action")
|
||||
|
||||
account_get_parser = account_subparsers.add_parser("get", help="Get account information")
|
||||
account_get_parser.add_argument("--address", required=True, help="Account address")
|
||||
account_get_parser.add_argument("--chain-id", help="Chain ID")
|
||||
account_get_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
account_get_parser.set_defaults(handler=ctx.handle_account_get)
|
||||
|
||||
blockchain_transactions_parser = blockchain_subparsers.add_parser("transactions", help="Query transactions")
|
||||
blockchain_transactions_parser.add_argument("--address", help="Filter by address")
|
||||
blockchain_transactions_parser.add_argument("--limit", type=int, default=10)
|
||||
blockchain_transactions_parser.add_argument("--offset", type=int, default=0)
|
||||
blockchain_transactions_parser.add_argument("--chain-id", help="Chain ID")
|
||||
blockchain_transactions_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
blockchain_transactions_parser.set_defaults(handler=ctx.handle_blockchain_transactions)
|
||||
|
||||
blockchain_mempool_parser = blockchain_subparsers.add_parser("mempool", help="Get pending transactions")
|
||||
blockchain_mempool_parser.add_argument("--chain-id", help="Chain ID")
|
||||
blockchain_mempool_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
blockchain_mempool_parser.set_defaults(handler=ctx.handle_blockchain_mempool)
|
||||
31
cli/parsers/bridge.py
Normal file
31
cli/parsers/bridge.py
Normal file
@@ -0,0 +1,31 @@
|
||||
"""Blockchain event bridge command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
bridge_parser = subparsers.add_parser("bridge", help="Blockchain event bridge management")
|
||||
bridge_parser.set_defaults(handler=lambda parsed, parser=bridge_parser: parser.print_help())
|
||||
bridge_subparsers = bridge_parser.add_subparsers(dest="bridge_action")
|
||||
|
||||
bridge_health_parser = bridge_subparsers.add_parser("health", help="Health check for blockchain event bridge service")
|
||||
bridge_health_parser.add_argument("--test-mode", action="store_true")
|
||||
bridge_health_parser.set_defaults(handler=ctx.handle_bridge_health)
|
||||
|
||||
bridge_metrics_parser = bridge_subparsers.add_parser("metrics", help="Get Prometheus metrics from blockchain event bridge service")
|
||||
bridge_metrics_parser.add_argument("--test-mode", action="store_true")
|
||||
bridge_metrics_parser.set_defaults(handler=ctx.handle_bridge_metrics)
|
||||
|
||||
bridge_status_parser = bridge_subparsers.add_parser("status", help="Get detailed status of blockchain event bridge service")
|
||||
bridge_status_parser.add_argument("--test-mode", action="store_true")
|
||||
bridge_status_parser.set_defaults(handler=ctx.handle_bridge_status)
|
||||
|
||||
bridge_config_parser = bridge_subparsers.add_parser("config", help="Show current configuration of blockchain event bridge service")
|
||||
bridge_config_parser.add_argument("--test-mode", action="store_true")
|
||||
bridge_config_parser.set_defaults(handler=ctx.handle_bridge_config)
|
||||
|
||||
bridge_restart_parser = bridge_subparsers.add_parser("restart", help="Restart blockchain event bridge service (via systemd)")
|
||||
bridge_restart_parser.add_argument("--test-mode", action="store_true")
|
||||
bridge_restart_parser.set_defaults(handler=ctx.handle_bridge_restart)
|
||||
29
cli/parsers/genesis.py
Normal file
29
cli/parsers/genesis.py
Normal file
@@ -0,0 +1,29 @@
|
||||
"""Genesis command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
genesis_parser = subparsers.add_parser("genesis", help="Genesis block and wallet generation")
|
||||
genesis_parser.set_defaults(handler=lambda parsed, parser=genesis_parser: parser.print_help())
|
||||
genesis_subparsers = genesis_parser.add_subparsers(dest="genesis_action")
|
||||
|
||||
genesis_init_parser = genesis_subparsers.add_parser("init", help="Initialize genesis block and wallet")
|
||||
genesis_init_parser.add_argument("--chain-id", default="ait-mainnet", help="Chain ID for genesis")
|
||||
genesis_init_parser.add_argument("--create-wallet", action="store_true", help="Create genesis wallet with secure random key")
|
||||
genesis_init_parser.add_argument("--password", help="Wallet password (auto-generated if not provided)")
|
||||
genesis_init_parser.add_argument("--proposer", help="Proposer address (defaults to genesis wallet)")
|
||||
genesis_init_parser.add_argument("--force", action="store_true", help="Force overwrite existing genesis")
|
||||
genesis_init_parser.add_argument("--register-service", action="store_true", help="Register genesis wallet with wallet service")
|
||||
genesis_init_parser.add_argument("--service-url", default="http://localhost:8003", help="Wallet service URL")
|
||||
genesis_init_parser.set_defaults(handler=ctx.handle_genesis_init)
|
||||
|
||||
genesis_verify_parser = genesis_subparsers.add_parser("verify", help="Verify genesis block and wallet configuration")
|
||||
genesis_verify_parser.add_argument("--chain-id", default="ait-mainnet", help="Chain ID to verify")
|
||||
genesis_verify_parser.set_defaults(handler=ctx.handle_genesis_verify)
|
||||
|
||||
genesis_info_parser = genesis_subparsers.add_parser("info", help="Show genesis block information")
|
||||
genesis_info_parser.add_argument("--chain-id", default="ait-mainnet", help="Chain ID to show info for")
|
||||
genesis_info_parser.set_defaults(handler=ctx.handle_genesis_info)
|
||||
97
cli/parsers/market.py
Normal file
97
cli/parsers/market.py
Normal file
@@ -0,0 +1,97 @@
|
||||
"""Marketplace command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
market_parser = subparsers.add_parser("market", help="Marketplace listings and offers")
|
||||
market_parser.set_defaults(handler=lambda parsed, parser=market_parser: parser.print_help())
|
||||
market_subparsers = market_parser.add_subparsers(dest="market_action")
|
||||
|
||||
# GPU marketplace subcommands
|
||||
market_gpu_parser = market_subparsers.add_parser("gpu", help="GPU marketplace operations")
|
||||
market_gpu_parser.set_defaults(handler=lambda parsed, parser=market_gpu_parser: parser.print_help())
|
||||
market_gpu_subparsers = market_gpu_parser.add_subparsers(dest="gpu_action")
|
||||
|
||||
market_gpu_register_parser = market_gpu_subparsers.add_parser("register", help="Register GPU on marketplace")
|
||||
market_gpu_register_parser.add_argument("--name", help="GPU name/model")
|
||||
market_gpu_register_parser.add_argument("--memory", type=int, help="GPU memory in GB")
|
||||
market_gpu_register_parser.add_argument("--cuda-cores", type=int, help="Number of CUDA cores")
|
||||
market_gpu_register_parser.add_argument("--compute-capability", help="Compute capability (e.g., 8.9)")
|
||||
market_gpu_register_parser.add_argument("--price-per-hour", type=float, required=True, help="Price per hour in AIT")
|
||||
market_gpu_register_parser.add_argument("--description", help="GPU description")
|
||||
market_gpu_register_parser.add_argument("--miner-id", help="Miner ID")
|
||||
market_gpu_register_parser.add_argument("--force", action="store_true", help="Force registration without hardware validation")
|
||||
market_gpu_register_parser.add_argument("--coordinator-url", default=ctx.default_coordinator_url)
|
||||
market_gpu_register_parser.set_defaults(handler=ctx.handle_market_gpu_register)
|
||||
|
||||
market_gpu_list_parser = market_gpu_subparsers.add_parser("list", help="List available GPUs")
|
||||
market_gpu_list_parser.add_argument("--available", action="store_true", help="Show only available GPUs")
|
||||
market_gpu_list_parser.add_argument("--price-max", type=float, help="Maximum price per hour")
|
||||
market_gpu_list_parser.add_argument("--region", help="Filter by region")
|
||||
market_gpu_list_parser.add_argument("--model", help="Filter by GPU model")
|
||||
market_gpu_list_parser.add_argument("--limit", type=int, default=100, help="Maximum number of results")
|
||||
market_gpu_list_parser.add_argument("--coordinator-url", default=ctx.default_coordinator_url)
|
||||
market_gpu_list_parser.set_defaults(handler=ctx.handle_market_gpu_list)
|
||||
|
||||
market_list_parser = market_subparsers.add_parser("list", help="List marketplace items")
|
||||
market_list_parser.add_argument("--chain-id", help="Chain ID")
|
||||
market_list_parser.add_argument("--coordinator-url", default=ctx.default_coordinator_url)
|
||||
market_list_parser.set_defaults(handler=ctx.handle_market_listings)
|
||||
|
||||
market_create_parser = market_subparsers.add_parser("create", help="Create a marketplace listing")
|
||||
market_create_parser.add_argument("--wallet", required=True)
|
||||
market_create_parser.add_argument("--type", dest="item_type", required=True)
|
||||
market_create_parser.add_argument("--price", type=float, required=True)
|
||||
market_create_parser.add_argument("--description")
|
||||
market_create_parser.add_argument("--password")
|
||||
market_create_parser.add_argument("--password-file")
|
||||
market_create_parser.add_argument("--chain-id", help="Chain ID")
|
||||
market_create_parser.add_argument("--coordinator-url", default=ctx.default_coordinator_url)
|
||||
market_create_parser.set_defaults(handler=ctx.handle_market_create)
|
||||
|
||||
market_search_parser = market_subparsers.add_parser("search", help="Search marketplace items")
|
||||
market_search_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
market_search_parser.set_defaults(handler=ctx.handle_market_listings) # Reuse listings for now
|
||||
|
||||
market_mine_parser = market_subparsers.add_parser("my-listings", help="Show your marketplace listings")
|
||||
market_mine_parser.add_argument("--wallet")
|
||||
market_mine_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
market_mine_parser.set_defaults(handler=ctx.handle_market_listings) # Reuse listings for now
|
||||
|
||||
market_get_parser = market_subparsers.add_parser("get", help="Get listing by ID")
|
||||
market_get_parser.add_argument("--listing-id", required=True)
|
||||
market_get_parser.add_argument("--chain-id", help="Chain ID")
|
||||
market_get_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
market_get_parser.set_defaults(handler=ctx.handle_market_get)
|
||||
|
||||
market_delete_parser = market_subparsers.add_parser("delete", help="Delete listing")
|
||||
market_delete_parser.add_argument("--listing-id", required=True)
|
||||
market_delete_parser.add_argument("--wallet", required=True)
|
||||
market_delete_parser.add_argument("--password")
|
||||
market_delete_parser.add_argument("--password-file")
|
||||
market_delete_parser.add_argument("--chain-id", help="Chain ID")
|
||||
market_delete_parser.add_argument("--coordinator-url", default=ctx.default_coordinator_url)
|
||||
market_delete_parser.set_defaults(handler=ctx.handle_market_delete)
|
||||
|
||||
market_buy_parser = market_subparsers.add_parser("buy", help="Buy from marketplace")
|
||||
market_buy_parser.add_argument("--item", required=True)
|
||||
market_buy_parser.add_argument("--wallet", required=True)
|
||||
market_buy_parser.add_argument("--password")
|
||||
market_buy_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
market_buy_parser.set_defaults(handler=ctx.handle_market_listings) # Placeholder
|
||||
|
||||
market_sell_parser = market_subparsers.add_parser("sell", help="Sell on marketplace")
|
||||
market_sell_parser.add_argument("--item", required=True)
|
||||
market_sell_parser.add_argument("--price", type=float, required=True)
|
||||
market_sell_parser.add_argument("--wallet", required=True)
|
||||
market_sell_parser.add_argument("--password")
|
||||
market_sell_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
market_sell_parser.set_defaults(handler=ctx.handle_market_create) # Reuse create
|
||||
|
||||
market_orders_parser = market_subparsers.add_parser("orders", help="Show marketplace orders")
|
||||
market_orders_parser.add_argument("--wallet")
|
||||
market_orders_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
market_orders_parser.set_defaults(handler=ctx.handle_market_listings) # Reuse listings for now
|
||||
84
cli/parsers/messaging.py
Normal file
84
cli/parsers/messaging.py
Normal file
@@ -0,0 +1,84 @@
|
||||
"""Messaging command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
messaging_parser = subparsers.add_parser("messaging", help="Messaging system and forum")
|
||||
messaging_parser.set_defaults(handler=lambda parsed, parser=messaging_parser: parser.print_help())
|
||||
messaging_subparsers = messaging_parser.add_subparsers(dest="messaging_action")
|
||||
|
||||
messaging_deploy_parser = messaging_subparsers.add_parser("deploy", help="Deploy messaging contract")
|
||||
messaging_deploy_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_deploy_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
messaging_deploy_parser.set_defaults(handler=ctx.handle_messaging_deploy)
|
||||
|
||||
messaging_state_parser = messaging_subparsers.add_parser("state", help="Get contract state")
|
||||
messaging_state_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_state_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
messaging_state_parser.set_defaults(handler=ctx.handle_messaging_state)
|
||||
|
||||
messaging_topics_parser = messaging_subparsers.add_parser("topics", help="List forum topics")
|
||||
messaging_topics_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_topics_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
messaging_topics_parser.set_defaults(handler=ctx.handle_messaging_topics)
|
||||
|
||||
messaging_create_topic_parser = messaging_subparsers.add_parser("create-topic", help="Create forum topic")
|
||||
messaging_create_topic_parser.add_argument("--title", required=True, help="Topic title")
|
||||
messaging_create_topic_parser.add_argument("--content", required=True, help="Topic content")
|
||||
messaging_create_topic_parser.add_argument("--wallet", help="Wallet address for authentication")
|
||||
messaging_create_topic_parser.add_argument("--password")
|
||||
messaging_create_topic_parser.add_argument("--password-file")
|
||||
messaging_create_topic_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_create_topic_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
messaging_create_topic_parser.set_defaults(handler=ctx.handle_messaging_create_topic)
|
||||
|
||||
messaging_messages_parser = messaging_subparsers.add_parser("messages", help="Get topic messages")
|
||||
messaging_messages_parser.add_argument("--topic-id", required=True, help="Topic ID")
|
||||
messaging_messages_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_messages_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
messaging_messages_parser.set_defaults(handler=ctx.handle_messaging_messages)
|
||||
|
||||
messaging_post_parser = messaging_subparsers.add_parser("post", help="Post message")
|
||||
messaging_post_parser.add_argument("--topic-id", required=True, help="Topic ID")
|
||||
messaging_post_parser.add_argument("--content", required=True, help="Message content")
|
||||
messaging_post_parser.add_argument("--wallet", help="Wallet address for authentication")
|
||||
messaging_post_parser.add_argument("--password")
|
||||
messaging_post_parser.add_argument("--password-file")
|
||||
messaging_post_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_post_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
messaging_post_parser.set_defaults(handler=ctx.handle_messaging_post)
|
||||
|
||||
messaging_vote_parser = messaging_subparsers.add_parser("vote", help="Vote on message")
|
||||
messaging_vote_parser.add_argument("--message-id", required=True, help="Message ID")
|
||||
messaging_vote_parser.add_argument("--vote", required=True, help="Vote (up/down)")
|
||||
messaging_vote_parser.add_argument("--wallet", help="Wallet address for authentication")
|
||||
messaging_vote_parser.add_argument("--password")
|
||||
messaging_vote_parser.add_argument("--password-file")
|
||||
messaging_vote_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_vote_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
messaging_vote_parser.set_defaults(handler=ctx.handle_messaging_vote)
|
||||
|
||||
messaging_search_parser = messaging_subparsers.add_parser("search", help="Search messages")
|
||||
messaging_search_parser.add_argument("--query", required=True, help="Search query")
|
||||
messaging_search_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_search_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
messaging_search_parser.set_defaults(handler=ctx.handle_messaging_search)
|
||||
|
||||
messaging_reputation_parser = messaging_subparsers.add_parser("reputation", help="Get agent reputation")
|
||||
messaging_reputation_parser.add_argument("--agent-id", required=True, help="Agent ID")
|
||||
messaging_reputation_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_reputation_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
messaging_reputation_parser.set_defaults(handler=ctx.handle_messaging_reputation)
|
||||
|
||||
messaging_moderate_parser = messaging_subparsers.add_parser("moderate", help="Moderate message")
|
||||
messaging_moderate_parser.add_argument("--message-id", required=True, help="Message ID")
|
||||
messaging_moderate_parser.add_argument("--action", required=True, help="Action (approve/reject)")
|
||||
messaging_moderate_parser.add_argument("--wallet", help="Wallet address for authentication")
|
||||
messaging_moderate_parser.add_argument("--password")
|
||||
messaging_moderate_parser.add_argument("--password-file")
|
||||
messaging_moderate_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_moderate_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
messaging_moderate_parser.set_defaults(handler=ctx.handle_messaging_moderate)
|
||||
41
cli/parsers/network.py
Normal file
41
cli/parsers/network.py
Normal file
@@ -0,0 +1,41 @@
|
||||
"""Network command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
network_parser = subparsers.add_parser("network", help="Peer connectivity and sync")
|
||||
network_parser.set_defaults(handler=ctx.handle_network_status)
|
||||
network_subparsers = network_parser.add_subparsers(dest="network_action")
|
||||
|
||||
network_status_parser = network_subparsers.add_parser("status", help="Show network status")
|
||||
network_status_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
network_status_parser.set_defaults(handler=ctx.handle_network_status)
|
||||
|
||||
network_peers_parser = network_subparsers.add_parser("peers", help="List peers")
|
||||
network_peers_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
network_peers_parser.set_defaults(handler=ctx.handle_network_peers)
|
||||
|
||||
network_sync_parser = network_subparsers.add_parser("sync", help="Show sync status")
|
||||
network_sync_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
network_sync_parser.set_defaults(handler=ctx.handle_network_sync)
|
||||
|
||||
network_ping_parser = network_subparsers.add_parser("ping", help="Ping a node")
|
||||
network_ping_parser.add_argument("node", nargs="?")
|
||||
network_ping_parser.add_argument("--node", dest="node_opt", help=argparse.SUPPRESS)
|
||||
network_ping_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
network_ping_parser.set_defaults(handler=ctx.handle_network_ping)
|
||||
|
||||
network_propagate_parser = network_subparsers.add_parser("propagate", help="Propagate test data")
|
||||
network_propagate_parser.add_argument("data", nargs="?")
|
||||
network_propagate_parser.add_argument("--data", dest="data_opt", help=argparse.SUPPRESS)
|
||||
network_propagate_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
network_propagate_parser.set_defaults(handler=ctx.handle_network_propagate)
|
||||
|
||||
network_force_sync_parser = network_subparsers.add_parser("force-sync", help="Force reorg to specified peer")
|
||||
network_force_sync_parser.add_argument("--peer", required=True, help="Peer to sync from")
|
||||
network_force_sync_parser.add_argument("--chain-id", help="Chain ID")
|
||||
network_force_sync_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
network_force_sync_parser.set_defaults(handler=ctx.handle_network_force_sync)
|
||||
29
cli/parsers/openclaw.py
Normal file
29
cli/parsers/openclaw.py
Normal file
@@ -0,0 +1,29 @@
|
||||
"""OpenClaw command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
openclaw_parser = subparsers.add_parser("openclaw", help="OpenClaw ecosystem operations")
|
||||
openclaw_parser.set_defaults(handler=lambda parsed, parser=openclaw_parser: parser.print_help())
|
||||
openclaw_subparsers = openclaw_parser.add_subparsers(dest="openclaw_action")
|
||||
|
||||
openclaw_deploy_parser = openclaw_subparsers.add_parser("deploy", help="Deploy an OpenClaw agent")
|
||||
openclaw_deploy_parser.add_argument("--agent-file", required=True)
|
||||
openclaw_deploy_parser.add_argument("--wallet", required=True)
|
||||
openclaw_deploy_parser.add_argument("--environment", choices=["dev", "staging", "prod"], default="dev")
|
||||
openclaw_deploy_parser.set_defaults(handler=ctx.handle_openclaw_action)
|
||||
|
||||
openclaw_monitor_parser = openclaw_subparsers.add_parser("monitor", help="Monitor OpenClaw performance")
|
||||
openclaw_monitor_parser.add_argument("--agent-id")
|
||||
openclaw_monitor_parser.add_argument("--metrics", choices=["performance", "cost", "errors", "all"], default="all")
|
||||
openclaw_monitor_parser.set_defaults(handler=ctx.handle_openclaw_action)
|
||||
|
||||
openclaw_market_parser = openclaw_subparsers.add_parser("market", help="Manage OpenClaw marketplace activity")
|
||||
openclaw_market_parser.add_argument("market_action", nargs="?", choices=["list", "publish", "purchase", "evaluate"])
|
||||
openclaw_market_parser.add_argument("--action", dest="market_action_opt", choices=["list", "publish", "purchase", "evaluate"], help=argparse.SUPPRESS)
|
||||
openclaw_market_parser.add_argument("--agent-id")
|
||||
openclaw_market_parser.add_argument("--price", type=float)
|
||||
openclaw_market_parser.set_defaults(handler=ctx.handle_openclaw_action, openclaw_action="market")
|
||||
44
cli/parsers/pool_hub.py
Normal file
44
cli/parsers/pool_hub.py
Normal file
@@ -0,0 +1,44 @@
|
||||
"""Pool hub command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
pool_hub_parser = subparsers.add_parser("pool-hub", help="Pool hub management for SLA monitoring and billing")
|
||||
pool_hub_parser.set_defaults(handler=lambda parsed, parser=pool_hub_parser: parser.print_help())
|
||||
pool_hub_subparsers = pool_hub_parser.add_subparsers(dest="pool_hub_action")
|
||||
|
||||
pool_hub_sla_metrics_parser = pool_hub_subparsers.add_parser("sla-metrics", help="Get SLA metrics for miner or all miners")
|
||||
pool_hub_sla_metrics_parser.add_argument("miner_id", nargs="?")
|
||||
pool_hub_sla_metrics_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_sla_metrics_parser.set_defaults(handler=ctx.handle_pool_hub_sla_metrics)
|
||||
|
||||
pool_hub_sla_violations_parser = pool_hub_subparsers.add_parser("sla-violations", help="Get SLA violations")
|
||||
pool_hub_sla_violations_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_sla_violations_parser.set_defaults(handler=ctx.handle_pool_hub_sla_violations)
|
||||
|
||||
pool_hub_capacity_snapshots_parser = pool_hub_subparsers.add_parser("capacity-snapshots", help="Get capacity planning snapshots")
|
||||
pool_hub_capacity_snapshots_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_capacity_snapshots_parser.set_defaults(handler=ctx.handle_pool_hub_capacity_snapshots)
|
||||
|
||||
pool_hub_capacity_forecast_parser = pool_hub_subparsers.add_parser("capacity-forecast", help="Get capacity forecast")
|
||||
pool_hub_capacity_forecast_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_capacity_forecast_parser.set_defaults(handler=ctx.handle_pool_hub_capacity_forecast)
|
||||
|
||||
pool_hub_capacity_recommendations_parser = pool_hub_subparsers.add_parser("capacity-recommendations", help="Get scaling recommendations")
|
||||
pool_hub_capacity_recommendations_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_capacity_recommendations_parser.set_defaults(handler=ctx.handle_pool_hub_capacity_recommendations)
|
||||
|
||||
pool_hub_billing_usage_parser = pool_hub_subparsers.add_parser("billing-usage", help="Get billing usage data")
|
||||
pool_hub_billing_usage_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_billing_usage_parser.set_defaults(handler=ctx.handle_pool_hub_billing_usage)
|
||||
|
||||
pool_hub_billing_sync_parser = pool_hub_subparsers.add_parser("billing-sync", help="Trigger billing sync with coordinator-api")
|
||||
pool_hub_billing_sync_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_billing_sync_parser.set_defaults(handler=ctx.handle_pool_hub_billing_sync)
|
||||
|
||||
pool_hub_collect_metrics_parser = pool_hub_subparsers.add_parser("collect-metrics", help="Trigger SLA metrics collection")
|
||||
pool_hub_collect_metrics_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_collect_metrics_parser.set_defaults(handler=ctx.handle_pool_hub_collect_metrics)
|
||||
36
cli/parsers/resource.py
Normal file
36
cli/parsers/resource.py
Normal file
@@ -0,0 +1,36 @@
|
||||
"""Resource command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
resource_parser = subparsers.add_parser("resource", help="Resource utilization and allocation")
|
||||
resource_parser.set_defaults(handler=lambda parsed, parser=resource_parser: parser.print_help())
|
||||
resource_subparsers = resource_parser.add_subparsers(dest="resource_action")
|
||||
|
||||
resource_status_parser = resource_subparsers.add_parser("status", help="Show resource status")
|
||||
resource_status_parser.add_argument("--type", choices=["cpu", "memory", "storage", "network", "all"], default="all")
|
||||
resource_status_parser.set_defaults(handler=ctx.handle_resource_action)
|
||||
|
||||
resource_allocate_parser = resource_subparsers.add_parser("allocate", help="Allocate resources")
|
||||
resource_allocate_parser.add_argument("--agent-id", required=True)
|
||||
resource_allocate_parser.add_argument("--cpu", type=float)
|
||||
resource_allocate_parser.add_argument("--memory", type=int)
|
||||
resource_allocate_parser.add_argument("--duration", type=int)
|
||||
resource_allocate_parser.set_defaults(handler=ctx.handle_resource_action)
|
||||
|
||||
resource_optimize_parser = resource_subparsers.add_parser("optimize", help="Optimize resource usage")
|
||||
resource_optimize_parser.add_argument("--agent-id")
|
||||
resource_optimize_parser.add_argument("--target", choices=["cpu", "memory", "all"], default="all")
|
||||
resource_optimize_parser.set_defaults(handler=ctx.handle_resource_action, resource_action="optimize")
|
||||
|
||||
resource_benchmark_parser = resource_subparsers.add_parser("benchmark", help="Run resource benchmark")
|
||||
resource_benchmark_parser.add_argument("--type", choices=["cpu", "memory", "io", "all"], default="all")
|
||||
resource_benchmark_parser.set_defaults(handler=ctx.handle_resource_action, resource_action="benchmark")
|
||||
|
||||
resource_monitor_parser = resource_subparsers.add_parser("monitor", help="Monitor resource utilization")
|
||||
resource_monitor_parser.add_argument("--interval", type=int, default=5, help="Monitoring interval in seconds")
|
||||
resource_monitor_parser.add_argument("--duration", type=int, default=60, help="Monitoring duration in seconds")
|
||||
resource_monitor_parser.set_defaults(handler=ctx.handle_resource_action, resource_action="monitor")
|
||||
178
cli/parsers/system.py
Normal file
178
cli/parsers/system.py
Normal file
@@ -0,0 +1,178 @@
|
||||
"""System, analytics, security, compliance, simulation, and cluster command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
mining_parser = subparsers.add_parser("mining", help="Mining lifecycle and rewards")
|
||||
mining_parser.set_defaults(handler=ctx.handle_mining_action, mining_action="status")
|
||||
mining_subparsers = mining_parser.add_subparsers(dest="mining_action")
|
||||
|
||||
mining_status_parser = mining_subparsers.add_parser("status", help="Show mining status")
|
||||
mining_status_parser.add_argument("--wallet")
|
||||
mining_status_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
mining_status_parser.set_defaults(handler=ctx.handle_mining_action, mining_action="status")
|
||||
|
||||
mining_start_parser = mining_subparsers.add_parser("start", help="Start mining")
|
||||
mining_start_parser.add_argument("--wallet")
|
||||
mining_start_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
mining_start_parser.set_defaults(handler=ctx.handle_mining_action, mining_action="start")
|
||||
|
||||
mining_stop_parser = mining_subparsers.add_parser("stop", help="Stop mining")
|
||||
mining_stop_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
mining_stop_parser.set_defaults(handler=ctx.handle_mining_action, mining_action="stop")
|
||||
|
||||
mining_rewards_parser = mining_subparsers.add_parser("rewards", help="Show mining rewards")
|
||||
mining_rewards_parser.add_argument("--wallet")
|
||||
mining_rewards_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
mining_rewards_parser.set_defaults(handler=ctx.handle_mining_action, mining_action="rewards")
|
||||
|
||||
analytics_parser = subparsers.add_parser("analytics", help="Blockchain analytics and statistics")
|
||||
analytics_parser.set_defaults(handler=lambda parsed, parser=analytics_parser: parser.print_help())
|
||||
analytics_subparsers = analytics_parser.add_subparsers(dest="analytics_action")
|
||||
|
||||
analytics_blocks_parser = analytics_subparsers.add_parser("blocks", help="Block analytics")
|
||||
analytics_blocks_parser.add_argument("--limit", type=int, default=10)
|
||||
analytics_blocks_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
analytics_blocks_parser.set_defaults(handler=ctx.handle_analytics, type="blocks")
|
||||
|
||||
analytics_report_parser = analytics_subparsers.add_parser("report", help="Generate analytics report")
|
||||
analytics_report_parser.add_argument("--type", choices=["performance", "transactions", "all"], default="all")
|
||||
analytics_report_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
analytics_report_parser.set_defaults(handler=ctx.handle_analytics, type="report")
|
||||
|
||||
analytics_metrics_parser = analytics_subparsers.add_parser("metrics", help="Show performance metrics")
|
||||
analytics_metrics_parser.add_argument("--limit", type=int, default=10)
|
||||
analytics_metrics_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
analytics_metrics_parser.set_defaults(handler=ctx.handle_analytics, type="metrics")
|
||||
|
||||
analytics_export_parser = analytics_subparsers.add_parser("export", help="Export analytics data")
|
||||
analytics_export_parser.add_argument("--format", choices=["json", "csv"], default="json")
|
||||
analytics_export_parser.add_argument("--output")
|
||||
analytics_export_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
analytics_export_parser.set_defaults(handler=ctx.handle_analytics, type="export")
|
||||
|
||||
system_parser = subparsers.add_parser("system", help="System health and overview")
|
||||
system_parser.set_defaults(handler=ctx.handle_system_status)
|
||||
system_subparsers = system_parser.add_subparsers(dest="system_action")
|
||||
|
||||
system_status_parser = system_subparsers.add_parser("status", help="Show system status")
|
||||
system_status_parser.set_defaults(handler=ctx.handle_system_status)
|
||||
|
||||
economics_parser = subparsers.add_parser("economics", help="Economic intelligence and modeling")
|
||||
economics_parser.set_defaults(handler=lambda parsed, parser=economics_parser: parser.print_help())
|
||||
economics_subparsers = economics_parser.add_subparsers(dest="economics_action")
|
||||
|
||||
economics_distributed_parser = economics_subparsers.add_parser("distributed", help="Distributed cost optimization")
|
||||
economics_distributed_parser.add_argument("--cost-optimize", action="store_true")
|
||||
economics_distributed_parser.set_defaults(handler=ctx.handle_economics_action)
|
||||
|
||||
economics_market_parser = economics_subparsers.add_parser("market", help="Market analysis")
|
||||
economics_market_parser.add_argument("--analyze", action="store_true")
|
||||
economics_market_parser.set_defaults(handler=ctx.handle_economics_action)
|
||||
|
||||
economics_trends_parser = economics_subparsers.add_parser("trends", help="Economic trends analysis")
|
||||
economics_trends_parser.add_argument("--period")
|
||||
economics_trends_parser.set_defaults(handler=ctx.handle_economics_action)
|
||||
|
||||
economics_optimize_parser = economics_subparsers.add_parser("optimize", help="Optimize economic strategy")
|
||||
economics_optimize_parser.add_argument("--target", choices=["revenue", "cost", "all"], default="all")
|
||||
economics_optimize_parser.set_defaults(handler=ctx.handle_economics_action)
|
||||
cluster_parser = subparsers.add_parser("cluster", help="Cluster management")
|
||||
cluster_parser.set_defaults(handler=lambda parsed, parser=cluster_parser: parser.print_help())
|
||||
cluster_subparsers = cluster_parser.add_subparsers(dest="cluster_action")
|
||||
|
||||
cluster_status_parser = cluster_subparsers.add_parser("status", help="Show cluster status")
|
||||
cluster_status_parser.add_argument("--nodes", nargs="*", default=["aitbc", "aitbc1"])
|
||||
cluster_status_parser.set_defaults(handler=ctx.handle_network_status)
|
||||
|
||||
cluster_sync_parser = cluster_subparsers.add_parser("sync", help="Sync cluster nodes")
|
||||
cluster_sync_parser.add_argument("--all", action="store_true")
|
||||
cluster_sync_parser.set_defaults(handler=ctx.handle_cluster_action)
|
||||
|
||||
cluster_balance_parser = cluster_subparsers.add_parser("balance", help="Balance workload across nodes")
|
||||
cluster_balance_parser.add_argument("--workload", action="store_true")
|
||||
cluster_balance_parser.set_defaults(handler=ctx.handle_cluster_action)
|
||||
|
||||
performance_parser = subparsers.add_parser("performance", help="Performance optimization")
|
||||
performance_parser.set_defaults(handler=lambda parsed, parser=performance_parser: parser.print_help())
|
||||
performance_subparsers = performance_parser.add_subparsers(dest="performance_action")
|
||||
|
||||
performance_benchmark_parser = performance_subparsers.add_parser("benchmark", help="Run performance benchmark")
|
||||
performance_benchmark_parser.add_argument("--suite", choices=["comprehensive", "quick", "custom"], default="comprehensive")
|
||||
performance_benchmark_parser.set_defaults(handler=ctx.handle_performance_action)
|
||||
|
||||
performance_optimize_parser = performance_subparsers.add_parser("optimize", help="Optimize performance")
|
||||
performance_optimize_parser.add_argument("--target", choices=["latency", "throughput", "all"], default="all")
|
||||
performance_optimize_parser.set_defaults(handler=ctx.handle_performance_action)
|
||||
|
||||
performance_tune_parser = performance_subparsers.add_parser("tune", help="Tune system parameters")
|
||||
performance_tune_parser.add_argument("--parameters", action="store_true")
|
||||
performance_tune_parser.add_argument("--aggressive", action="store_true")
|
||||
performance_tune_parser.set_defaults(handler=ctx.handle_performance_action)
|
||||
|
||||
security_parser = subparsers.add_parser("security", help="Security audit and scanning")
|
||||
security_parser.set_defaults(handler=lambda parsed, parser=security_parser: parser.print_help())
|
||||
security_subparsers = security_parser.add_subparsers(dest="security_action")
|
||||
|
||||
security_audit_parser = security_subparsers.add_parser("audit", help="Run security audit")
|
||||
security_audit_parser.add_argument("--comprehensive", action="store_true")
|
||||
security_audit_parser.set_defaults(handler=ctx.handle_security_action)
|
||||
|
||||
security_scan_parser = security_subparsers.add_parser("scan", help="Scan for vulnerabilities")
|
||||
security_scan_parser.add_argument("--vulnerabilities", action="store_true")
|
||||
security_scan_parser.set_defaults(handler=ctx.handle_security_action)
|
||||
|
||||
security_patch_parser = security_subparsers.add_parser("patch", help="Check for security patches")
|
||||
security_patch_parser.add_argument("--critical", action="store_true")
|
||||
security_patch_parser.set_defaults(handler=ctx.handle_security_action)
|
||||
|
||||
compliance_parser = subparsers.add_parser("compliance", help="Compliance checking and reporting")
|
||||
compliance_parser.set_defaults(handler=lambda parsed, parser=compliance_parser: parser.print_help())
|
||||
compliance_subparsers = compliance_parser.add_subparsers(dest="compliance_action")
|
||||
|
||||
compliance_check_parser = compliance_subparsers.add_parser("check", help="Check compliance status")
|
||||
compliance_check_parser.add_argument("--standard", choices=["gdpr", "hipaa", "soc2", "all"], default="gdpr")
|
||||
compliance_check_parser.set_defaults(handler=ctx.handle_system_status)
|
||||
|
||||
compliance_report_parser = compliance_subparsers.add_parser("report", help="Generate compliance report")
|
||||
compliance_report_parser.add_argument("--format", choices=["detailed", "summary", "json"], default="detailed")
|
||||
compliance_report_parser.set_defaults(handler=ctx.handle_system_status)
|
||||
|
||||
simulate_parser = subparsers.add_parser("simulate", help="Simulation utilities")
|
||||
simulate_parser.set_defaults(handler=lambda parsed, parser=simulate_parser: parser.print_help())
|
||||
simulate_subparsers = simulate_parser.add_subparsers(dest="simulate_command")
|
||||
|
||||
simulate_blockchain_parser = simulate_subparsers.add_parser("blockchain", help="Simulate blockchain activity")
|
||||
simulate_blockchain_parser.add_argument("--blocks", type=int, default=10)
|
||||
simulate_blockchain_parser.add_argument("--transactions", type=int, default=50)
|
||||
simulate_blockchain_parser.add_argument("--delay", type=float, default=1.0)
|
||||
simulate_blockchain_parser.set_defaults(handler=ctx.handle_simulate_action)
|
||||
|
||||
simulate_wallets_parser = simulate_subparsers.add_parser("wallets", help="Simulate wallet activity")
|
||||
simulate_wallets_parser.add_argument("--wallets", type=int, default=5)
|
||||
simulate_wallets_parser.add_argument("--balance", type=float, default=1000.0)
|
||||
simulate_wallets_parser.add_argument("--transactions", type=int, default=20)
|
||||
simulate_wallets_parser.add_argument("--amount-range", default="1.0-100.0")
|
||||
simulate_wallets_parser.set_defaults(handler=ctx.handle_simulate_action)
|
||||
|
||||
simulate_price_parser = simulate_subparsers.add_parser("price", help="Simulate price movement")
|
||||
simulate_price_parser.add_argument("--price", type=float, default=100.0)
|
||||
simulate_price_parser.add_argument("--volatility", type=float, default=0.05)
|
||||
simulate_price_parser.add_argument("--timesteps", type=int, default=100)
|
||||
simulate_price_parser.add_argument("--delay", type=float, default=0.1)
|
||||
simulate_price_parser.set_defaults(handler=ctx.handle_simulate_action)
|
||||
|
||||
simulate_network_parser = simulate_subparsers.add_parser("network", help="Simulate network topology")
|
||||
simulate_network_parser.add_argument("--nodes", type=int, default=3)
|
||||
simulate_network_parser.add_argument("--network-delay", type=float, default=0.1)
|
||||
simulate_network_parser.add_argument("--failure-rate", type=float, default=0.05)
|
||||
simulate_network_parser.set_defaults(handler=ctx.handle_simulate_action)
|
||||
|
||||
simulate_ai_jobs_parser = simulate_subparsers.add_parser("ai-jobs", help="Simulate AI job traffic")
|
||||
simulate_ai_jobs_parser.add_argument("--jobs", type=int, default=10)
|
||||
simulate_ai_jobs_parser.add_argument("--models", default="text-generation")
|
||||
simulate_ai_jobs_parser.add_argument("--duration-range", default="30-300")
|
||||
simulate_ai_jobs_parser.set_defaults(handler=ctx.handle_simulate_action)
|
||||
102
cli/parsers/wallet.py
Normal file
102
cli/parsers/wallet.py
Normal file
@@ -0,0 +1,102 @@
|
||||
"""Wallet command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
wallet_parser = subparsers.add_parser("wallet", help="Wallet lifecycle, balances, and transactions")
|
||||
wallet_parser.set_defaults(handler=lambda parsed, parser=wallet_parser: parser.print_help())
|
||||
wallet_subparsers = wallet_parser.add_subparsers(dest="wallet_action")
|
||||
|
||||
wallet_create_parser = wallet_subparsers.add_parser("create", help="Create a wallet")
|
||||
wallet_create_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_create_parser.add_argument("wallet_password", nargs="?")
|
||||
wallet_create_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_create_parser.add_argument("--password")
|
||||
wallet_create_parser.add_argument("--password-file")
|
||||
wallet_create_parser.set_defaults(handler=ctx.handle_wallet_create)
|
||||
|
||||
wallet_list_parser = wallet_subparsers.add_parser("list", help="List wallets")
|
||||
wallet_list_parser.add_argument("--format", choices=["table", "json"], default="table")
|
||||
wallet_list_parser.set_defaults(handler=ctx.handle_wallet_list)
|
||||
|
||||
wallet_balance_parser = wallet_subparsers.add_parser("balance", help="Show wallet balance")
|
||||
wallet_balance_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_balance_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_balance_parser.add_argument("--all", action="store_true")
|
||||
wallet_balance_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
wallet_balance_parser.add_argument("--chain-id", help="Chain ID for multichain operations (e.g., ait-mainnet, ait-devnet)")
|
||||
wallet_balance_parser.set_defaults(handler=ctx.handle_wallet_balance)
|
||||
|
||||
wallet_transactions_parser = wallet_subparsers.add_parser("transactions", help="Show wallet transactions")
|
||||
wallet_transactions_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_transactions_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_transactions_parser.add_argument("--limit", type=int, default=10)
|
||||
wallet_transactions_parser.add_argument("--format", choices=["table", "json"], default="table")
|
||||
wallet_transactions_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
wallet_transactions_parser.set_defaults(handler=ctx.handle_wallet_transactions)
|
||||
|
||||
wallet_send_parser = wallet_subparsers.add_parser("send", help="Send AIT")
|
||||
wallet_send_parser.add_argument("from_wallet_arg", nargs="?")
|
||||
wallet_send_parser.add_argument("to_address_arg", nargs="?")
|
||||
wallet_send_parser.add_argument("amount_arg", nargs="?")
|
||||
wallet_send_parser.add_argument("wallet_password", nargs="?")
|
||||
wallet_send_parser.add_argument("--from", dest="from_wallet", help=argparse.SUPPRESS)
|
||||
wallet_send_parser.add_argument("--to", dest="to_address", help=argparse.SUPPRESS)
|
||||
wallet_send_parser.add_argument("--amount", type=float)
|
||||
wallet_send_parser.add_argument("--fee", type=float, default=10.0)
|
||||
wallet_send_parser.add_argument("--password")
|
||||
wallet_send_parser.add_argument("--password-file")
|
||||
wallet_send_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
wallet_send_parser.set_defaults(handler=ctx.handle_wallet_send)
|
||||
|
||||
wallet_import_parser = wallet_subparsers.add_parser("import", help="Import a wallet")
|
||||
wallet_import_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_import_parser.add_argument("private_key_arg", nargs="?")
|
||||
wallet_import_parser.add_argument("wallet_password", nargs="?")
|
||||
wallet_import_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_import_parser.add_argument("--private-key", dest="private_key_opt")
|
||||
wallet_import_parser.add_argument("--password")
|
||||
wallet_import_parser.add_argument("--password-file")
|
||||
wallet_import_parser.set_defaults(handler=ctx.handle_wallet_import)
|
||||
|
||||
wallet_export_parser = wallet_subparsers.add_parser("export", help="Export a wallet")
|
||||
wallet_export_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_export_parser.add_argument("wallet_password", nargs="?")
|
||||
wallet_export_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_export_parser.add_argument("--password")
|
||||
wallet_export_parser.add_argument("--password-file")
|
||||
wallet_export_parser.set_defaults(handler=ctx.handle_wallet_export)
|
||||
|
||||
wallet_delete_parser = wallet_subparsers.add_parser("delete", help="Delete a wallet")
|
||||
wallet_delete_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_delete_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_delete_parser.add_argument("--confirm", action="store_true")
|
||||
wallet_delete_parser.set_defaults(handler=ctx.handle_wallet_delete)
|
||||
|
||||
wallet_rename_parser = wallet_subparsers.add_parser("rename", help="Rename a wallet")
|
||||
wallet_rename_parser.add_argument("old_name_arg", nargs="?")
|
||||
wallet_rename_parser.add_argument("new_name_arg", nargs="?")
|
||||
wallet_rename_parser.add_argument("--old", dest="old_name", help=argparse.SUPPRESS)
|
||||
wallet_rename_parser.add_argument("--new", dest="new_name", help=argparse.SUPPRESS)
|
||||
wallet_rename_parser.set_defaults(handler=ctx.handle_wallet_rename)
|
||||
|
||||
wallet_backup_parser = wallet_subparsers.add_parser("backup", help="Backup a wallet")
|
||||
wallet_backup_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_backup_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_backup_parser.set_defaults(handler=ctx.handle_wallet_backup)
|
||||
|
||||
wallet_sync_parser = wallet_subparsers.add_parser("sync", help="Sync wallets")
|
||||
wallet_sync_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_sync_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_sync_parser.add_argument("--all", action="store_true")
|
||||
wallet_sync_parser.set_defaults(handler=ctx.handle_wallet_sync)
|
||||
|
||||
wallet_batch_parser = wallet_subparsers.add_parser("batch", help="Send multiple transactions")
|
||||
wallet_batch_parser.add_argument("--file", required=True)
|
||||
wallet_batch_parser.add_argument("--password")
|
||||
wallet_batch_parser.add_argument("--password-file")
|
||||
wallet_batch_parser.add_argument("--rpc-url", default=ctx.default_rpc_url)
|
||||
wallet_batch_parser.set_defaults(handler=ctx.handle_wallet_batch)
|
||||
34
cli/parsers/workflow.py
Normal file
34
cli/parsers/workflow.py
Normal file
@@ -0,0 +1,34 @@
|
||||
"""Workflow command registration for the unified CLI."""
|
||||
|
||||
import argparse
|
||||
|
||||
from parser_context import ParserContext
|
||||
|
||||
|
||||
def register(subparsers: argparse._SubParsersAction, ctx: ParserContext) -> None:
|
||||
workflow_parser = subparsers.add_parser("workflow", help="Workflow templates and execution")
|
||||
workflow_parser.set_defaults(handler=lambda parsed, parser=workflow_parser: parser.print_help())
|
||||
workflow_subparsers = workflow_parser.add_subparsers(dest="workflow_action")
|
||||
|
||||
workflow_create_parser = workflow_subparsers.add_parser("create", help="Create a workflow")
|
||||
workflow_create_parser.add_argument("--name", required=True)
|
||||
workflow_create_parser.add_argument("--template")
|
||||
workflow_create_parser.add_argument("--config-file")
|
||||
workflow_create_parser.set_defaults(handler=ctx.handle_workflow_action)
|
||||
|
||||
workflow_run_parser = workflow_subparsers.add_parser("run", help="Run a workflow")
|
||||
workflow_run_parser.add_argument("--name", required=True)
|
||||
workflow_run_parser.add_argument("--params")
|
||||
workflow_run_parser.add_argument("--async-exec", action="store_true")
|
||||
workflow_run_parser.set_defaults(handler=ctx.handle_workflow_action)
|
||||
|
||||
workflow_schedule_parser = workflow_subparsers.add_parser("schedule", help="Schedule a workflow")
|
||||
workflow_schedule_parser.add_argument("--name", required=True)
|
||||
workflow_schedule_parser.add_argument("--cron", required=True)
|
||||
workflow_schedule_parser.add_argument("--params")
|
||||
workflow_schedule_parser.set_defaults(handler=ctx.handle_workflow_action, workflow_action="schedule")
|
||||
|
||||
workflow_monitor_parser = workflow_subparsers.add_parser("monitor", help="Monitor workflow execution")
|
||||
workflow_monitor_parser.add_argument("--name")
|
||||
workflow_monitor_parser.add_argument("--execution-id")
|
||||
workflow_monitor_parser.set_defaults(handler=ctx.handle_workflow_action, workflow_action="monitor")
|
||||
@@ -2,10 +2,13 @@ import argparse
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from urllib.parse import urlparse
|
||||
|
||||
import requests
|
||||
|
||||
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
|
||||
|
||||
# Import command handlers
|
||||
from handlers import market as market_handlers
|
||||
from handlers import wallet as wallet_handlers
|
||||
@@ -17,6 +20,8 @@ from handlers import system as system_handlers
|
||||
from handlers import pool_hub as pool_hub_handlers
|
||||
from handlers import bridge as bridge_handlers
|
||||
from handlers import account as account_handlers
|
||||
from parser_context import ParserContext
|
||||
from parsers import register_all
|
||||
|
||||
|
||||
def run_cli(argv, core):
|
||||
@@ -511,6 +516,129 @@ def run_cli(argv, core):
|
||||
except Exception as e:
|
||||
print(f"❌ Error restarting blockchain event bridge service: {e}")
|
||||
|
||||
handlers = {
|
||||
"handle_wallet_create": handle_wallet_create,
|
||||
"handle_wallet_list": handle_wallet_list,
|
||||
"handle_wallet_balance": handle_wallet_balance,
|
||||
"handle_wallet_transactions": handle_wallet_transactions,
|
||||
"handle_wallet_send": handle_wallet_send,
|
||||
"handle_wallet_import": handle_wallet_import,
|
||||
"handle_wallet_export": handle_wallet_export,
|
||||
"handle_wallet_delete": handle_wallet_delete,
|
||||
"handle_wallet_rename": handle_wallet_rename,
|
||||
"handle_wallet_backup": handle_wallet_backup,
|
||||
"handle_wallet_sync": handle_wallet_sync,
|
||||
"handle_wallet_batch": handle_wallet_batch,
|
||||
"handle_blockchain_info": handle_blockchain_info,
|
||||
"handle_blockchain_height": handle_blockchain_height,
|
||||
"handle_blockchain_block": handle_blockchain_block,
|
||||
"handle_blockchain_init": handle_blockchain_init,
|
||||
"handle_blockchain_genesis": handle_blockchain_genesis,
|
||||
"handle_blockchain_import": handle_blockchain_import,
|
||||
"handle_blockchain_export": handle_blockchain_export,
|
||||
"handle_blockchain_import_chain": handle_blockchain_import_chain,
|
||||
"handle_blockchain_blocks_range": handle_blockchain_blocks_range,
|
||||
"handle_blockchain_transactions": handle_blockchain_transactions,
|
||||
"handle_blockchain_mempool": handle_blockchain_mempool,
|
||||
"handle_account_get": handle_account_get,
|
||||
"handle_messaging_deploy": handle_messaging_deploy,
|
||||
"handle_messaging_state": handle_messaging_state,
|
||||
"handle_messaging_topics": handle_messaging_topics,
|
||||
"handle_messaging_create_topic": handle_messaging_create_topic,
|
||||
"handle_messaging_messages": handle_messaging_messages,
|
||||
"handle_messaging_post": handle_messaging_post,
|
||||
"handle_messaging_vote": handle_messaging_vote,
|
||||
"handle_messaging_search": handle_messaging_search,
|
||||
"handle_messaging_reputation": handle_messaging_reputation,
|
||||
"handle_messaging_moderate": handle_messaging_moderate,
|
||||
"handle_network_status": handle_network_status,
|
||||
"handle_network_peers": handle_network_peers,
|
||||
"handle_network_sync": handle_network_sync,
|
||||
"handle_network_ping": handle_network_ping,
|
||||
"handle_network_propagate": handle_network_propagate,
|
||||
"handle_network_force_sync": handle_network_force_sync,
|
||||
"handle_market_listings": handle_market_listings,
|
||||
"handle_market_create": handle_market_create,
|
||||
"handle_market_get": handle_market_get,
|
||||
"handle_market_delete": handle_market_delete,
|
||||
"handle_market_gpu_register": handle_market_gpu_register,
|
||||
"handle_market_gpu_list": handle_market_gpu_list,
|
||||
"handle_ai_submit": handle_ai_submit,
|
||||
"handle_ai_jobs": handle_ai_jobs,
|
||||
"handle_ai_job": handle_ai_job,
|
||||
"handle_ai_cancel": handle_ai_cancel,
|
||||
"handle_ai_stats": handle_ai_stats,
|
||||
"handle_ai_service_list": handle_ai_service_list,
|
||||
"handle_ai_service_status": handle_ai_service_status,
|
||||
"handle_ai_service_test": handle_ai_service_test,
|
||||
"handle_mining_action": handle_mining_action,
|
||||
"handle_system_status": handle_system_status,
|
||||
"handle_analytics": handle_analytics,
|
||||
"handle_economics_action": handle_economics_action,
|
||||
"handle_cluster_action": handle_cluster_action,
|
||||
"handle_performance_action": handle_performance_action,
|
||||
"handle_security_action": handle_security_action,
|
||||
"handle_simulate_action": handle_simulate_action,
|
||||
"handle_agent_action": handle_agent_action,
|
||||
"handle_openclaw_action": handle_openclaw_action,
|
||||
"handle_workflow_action": handle_workflow_action,
|
||||
"handle_resource_action": handle_resource_action,
|
||||
"handle_pool_hub_sla_metrics": handle_pool_hub_sla_metrics,
|
||||
"handle_pool_hub_sla_violations": handle_pool_hub_sla_violations,
|
||||
"handle_pool_hub_capacity_snapshots": handle_pool_hub_capacity_snapshots,
|
||||
"handle_pool_hub_capacity_forecast": handle_pool_hub_capacity_forecast,
|
||||
"handle_pool_hub_capacity_recommendations": handle_pool_hub_capacity_recommendations,
|
||||
"handle_pool_hub_billing_usage": handle_pool_hub_billing_usage,
|
||||
"handle_pool_hub_billing_sync": handle_pool_hub_billing_sync,
|
||||
"handle_pool_hub_collect_metrics": handle_pool_hub_collect_metrics,
|
||||
"handle_bridge_health": handle_bridge_health,
|
||||
"handle_bridge_metrics": handle_bridge_metrics,
|
||||
"handle_bridge_status": handle_bridge_status,
|
||||
"handle_bridge_config": globals()["handle_bridge_config"],
|
||||
"handle_bridge_restart": globals()["handle_bridge_restart"],
|
||||
"handle_genesis_init": globals()["handle_genesis_init"],
|
||||
"handle_genesis_verify": globals()["handle_genesis_verify"],
|
||||
"handle_genesis_info": globals()["handle_genesis_info"],
|
||||
}
|
||||
|
||||
ctx = ParserContext(
|
||||
default_rpc_url=default_rpc_url,
|
||||
default_coordinator_url=default_coordinator_url,
|
||||
cli_version=cli_version,
|
||||
first=first,
|
||||
read_password=read_password,
|
||||
output_format=output_format,
|
||||
render_mapping=render_mapping,
|
||||
read_blockchain_env=read_blockchain_env,
|
||||
normalize_rpc_url=normalize_rpc_url,
|
||||
probe_rpc_node=probe_rpc_node,
|
||||
get_network_snapshot=get_network_snapshot,
|
||||
handlers=handlers,
|
||||
)
|
||||
|
||||
parser = argparse.ArgumentParser(
|
||||
description="AITBC CLI - Comprehensive Blockchain Management Tool",
|
||||
epilog="Examples: aitbc wallet create demo secret | aitbc wallet balance demo | aitbc ai submit --wallet demo --type text-generation --prompt 'hello' --payment 1",
|
||||
)
|
||||
parser.add_argument("--version", action="version", version=f"aitbc-cli {cli_version}")
|
||||
parser.add_argument("--output", choices=["table", "json", "yaml"], default="table")
|
||||
parser.add_argument("--verbose", action="store_true")
|
||||
parser.add_argument("--debug", action="store_true")
|
||||
subparsers = parser.add_subparsers(dest="command")
|
||||
|
||||
register_all(subparsers, ctx)
|
||||
|
||||
parsed_args = parser.parse_args(normalize_legacy_args(list(raw_args)))
|
||||
if not getattr(parsed_args, "command", None):
|
||||
parser.print_help()
|
||||
return 0
|
||||
handler = getattr(parsed_args, "handler", None)
|
||||
if handler is None:
|
||||
parser.print_help()
|
||||
return 0
|
||||
handler(parsed_args)
|
||||
return 0
|
||||
|
||||
def handle_genesis_init(args):
|
||||
"""Initialize genesis block and wallet"""
|
||||
import subprocess
|
||||
@@ -661,842 +789,11 @@ def handle_bridge_config(args):
|
||||
def handle_bridge_restart(args):
|
||||
bridge_handlers.handle_bridge_restart(args)
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="AITBC CLI - Comprehensive Blockchain Management Tool",
|
||||
epilog="Examples: aitbc wallet create demo secret | aitbc wallet balance demo | aitbc ai submit --wallet demo --type text-generation --prompt 'hello' --payment 1",
|
||||
)
|
||||
parser.add_argument("--version", action="version", version=f"aitbc-cli {cli_version}")
|
||||
parser.add_argument("--output", choices=["table", "json", "yaml"], default="table")
|
||||
parser.add_argument("--verbose", action="store_true")
|
||||
parser.add_argument("--debug", action="store_true")
|
||||
subparsers = parser.add_subparsers(dest="command")
|
||||
def main(argv=None):
|
||||
from aitbc_cli import main as cli_main
|
||||
|
||||
wallet_parser = subparsers.add_parser("wallet", help="Wallet lifecycle, balances, and transactions")
|
||||
wallet_parser.set_defaults(handler=lambda parsed, parser=wallet_parser: parser.print_help())
|
||||
wallet_subparsers = wallet_parser.add_subparsers(dest="wallet_action")
|
||||
return cli_main(argv)
|
||||
|
||||
wallet_create_parser = wallet_subparsers.add_parser("create", help="Create a wallet")
|
||||
wallet_create_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_create_parser.add_argument("wallet_password", nargs="?")
|
||||
wallet_create_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_create_parser.add_argument("--password")
|
||||
wallet_create_parser.add_argument("--password-file")
|
||||
wallet_create_parser.set_defaults(handler=handle_wallet_create)
|
||||
|
||||
wallet_list_parser = wallet_subparsers.add_parser("list", help="List wallets")
|
||||
wallet_list_parser.add_argument("--format", choices=["table", "json"], default="table")
|
||||
wallet_list_parser.set_defaults(handler=handle_wallet_list)
|
||||
|
||||
wallet_balance_parser = wallet_subparsers.add_parser("balance", help="Show wallet balance")
|
||||
wallet_balance_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_balance_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_balance_parser.add_argument("--all", action="store_true")
|
||||
wallet_balance_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
wallet_balance_parser.add_argument("--chain-id", help="Chain ID for multichain operations (e.g., ait-mainnet, ait-devnet)")
|
||||
wallet_balance_parser.set_defaults(handler=handle_wallet_balance)
|
||||
|
||||
wallet_transactions_parser = wallet_subparsers.add_parser("transactions", help="Show wallet transactions")
|
||||
wallet_transactions_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_transactions_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_transactions_parser.add_argument("--limit", type=int, default=10)
|
||||
wallet_transactions_parser.add_argument("--format", choices=["table", "json"], default="table")
|
||||
wallet_transactions_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
wallet_transactions_parser.set_defaults(handler=handle_wallet_transactions)
|
||||
|
||||
wallet_send_parser = wallet_subparsers.add_parser("send", help="Send AIT")
|
||||
wallet_send_parser.add_argument("from_wallet_arg", nargs="?")
|
||||
wallet_send_parser.add_argument("to_address_arg", nargs="?")
|
||||
wallet_send_parser.add_argument("amount_arg", nargs="?")
|
||||
wallet_send_parser.add_argument("wallet_password", nargs="?")
|
||||
wallet_send_parser.add_argument("--from", dest="from_wallet", help=argparse.SUPPRESS)
|
||||
wallet_send_parser.add_argument("--to", dest="to_address", help=argparse.SUPPRESS)
|
||||
wallet_send_parser.add_argument("--amount", type=float)
|
||||
wallet_send_parser.add_argument("--fee", type=float, default=10.0)
|
||||
wallet_send_parser.add_argument("--password")
|
||||
wallet_send_parser.add_argument("--password-file")
|
||||
wallet_send_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
wallet_send_parser.set_defaults(handler=handle_wallet_send)
|
||||
|
||||
wallet_import_parser = wallet_subparsers.add_parser("import", help="Import a wallet")
|
||||
wallet_import_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_import_parser.add_argument("private_key_arg", nargs="?")
|
||||
wallet_import_parser.add_argument("wallet_password", nargs="?")
|
||||
wallet_import_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_import_parser.add_argument("--private-key", dest="private_key_opt")
|
||||
wallet_import_parser.add_argument("--password")
|
||||
wallet_import_parser.add_argument("--password-file")
|
||||
wallet_import_parser.set_defaults(handler=handle_wallet_import)
|
||||
|
||||
wallet_export_parser = wallet_subparsers.add_parser("export", help="Export a wallet")
|
||||
wallet_export_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_export_parser.add_argument("wallet_password", nargs="?")
|
||||
wallet_export_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_export_parser.add_argument("--password")
|
||||
wallet_export_parser.add_argument("--password-file")
|
||||
wallet_export_parser.set_defaults(handler=handle_wallet_export)
|
||||
|
||||
wallet_delete_parser = wallet_subparsers.add_parser("delete", help="Delete a wallet")
|
||||
wallet_delete_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_delete_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_delete_parser.add_argument("--confirm", action="store_true")
|
||||
wallet_delete_parser.set_defaults(handler=handle_wallet_delete)
|
||||
|
||||
wallet_rename_parser = wallet_subparsers.add_parser("rename", help="Rename a wallet")
|
||||
wallet_rename_parser.add_argument("old_name_arg", nargs="?")
|
||||
wallet_rename_parser.add_argument("new_name_arg", nargs="?")
|
||||
wallet_rename_parser.add_argument("--old", dest="old_name", help=argparse.SUPPRESS)
|
||||
wallet_rename_parser.add_argument("--new", dest="new_name", help=argparse.SUPPRESS)
|
||||
wallet_rename_parser.set_defaults(handler=handle_wallet_rename)
|
||||
|
||||
wallet_backup_parser = wallet_subparsers.add_parser("backup", help="Backup a wallet")
|
||||
wallet_backup_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_backup_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_backup_parser.set_defaults(handler=handle_wallet_backup)
|
||||
|
||||
wallet_sync_parser = wallet_subparsers.add_parser("sync", help="Sync wallets")
|
||||
wallet_sync_parser.add_argument("wallet_name", nargs="?")
|
||||
wallet_sync_parser.add_argument("--name", dest="wallet_name_opt", help=argparse.SUPPRESS)
|
||||
wallet_sync_parser.add_argument("--all", action="store_true")
|
||||
wallet_sync_parser.set_defaults(handler=handle_wallet_sync)
|
||||
|
||||
wallet_batch_parser = wallet_subparsers.add_parser("batch", help="Send multiple transactions")
|
||||
wallet_batch_parser.add_argument("--file", required=True)
|
||||
wallet_batch_parser.add_argument("--password")
|
||||
wallet_batch_parser.add_argument("--password-file")
|
||||
wallet_batch_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
wallet_batch_parser.set_defaults(handler=handle_wallet_batch)
|
||||
|
||||
blockchain_parser = subparsers.add_parser("blockchain", help="Blockchain state and block inspection")
|
||||
blockchain_parser.set_defaults(handler=handle_blockchain_info, rpc_url=default_rpc_url)
|
||||
blockchain_subparsers = blockchain_parser.add_subparsers(dest="blockchain_action")
|
||||
|
||||
blockchain_info_parser = blockchain_subparsers.add_parser("info", help="Show chain information")
|
||||
blockchain_info_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
blockchain_info_parser.set_defaults(handler=handle_blockchain_info)
|
||||
|
||||
blockchain_height_parser = blockchain_subparsers.add_parser("height", help="Show current height")
|
||||
blockchain_height_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
blockchain_height_parser.set_defaults(handler=handle_blockchain_height)
|
||||
|
||||
blockchain_block_parser = blockchain_subparsers.add_parser("block", help="Inspect a block")
|
||||
blockchain_block_parser.add_argument("number", nargs="?", type=int)
|
||||
blockchain_block_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
blockchain_block_parser.set_defaults(handler=handle_blockchain_block)
|
||||
|
||||
blockchain_init_parser = blockchain_subparsers.add_parser("init", help="Initialize blockchain with genesis block")
|
||||
blockchain_init_parser.add_argument("--force", action="store_true", help="Force reinitialization")
|
||||
blockchain_init_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
blockchain_init_parser.set_defaults(handler=handle_blockchain_init)
|
||||
|
||||
blockchain_genesis_parser = blockchain_subparsers.add_parser("genesis", help="Create or inspect genesis block")
|
||||
blockchain_genesis_parser.add_argument("--create", action="store_true", help="Create new genesis block")
|
||||
blockchain_genesis_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
blockchain_genesis_parser.set_defaults(handler=handle_blockchain_genesis)
|
||||
|
||||
blockchain_import_parser = blockchain_subparsers.add_parser("import", help="Import a block")
|
||||
blockchain_import_parser.add_argument("--file", help="Block data file")
|
||||
blockchain_import_parser.add_argument("--json", help="Block data as JSON string")
|
||||
blockchain_import_parser.add_argument("--chain-id", help="Chain ID for the block")
|
||||
blockchain_import_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
blockchain_import_parser.set_defaults(handler=handle_blockchain_import)
|
||||
|
||||
blockchain_export_parser = blockchain_subparsers.add_parser("export", help="Export full chain")
|
||||
blockchain_export_parser.add_argument("--output", help="Output file")
|
||||
blockchain_export_parser.add_argument("--chain-id", help="Chain ID to export")
|
||||
blockchain_export_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
blockchain_export_parser.set_defaults(handler=handle_blockchain_export)
|
||||
|
||||
blockchain_import_chain_parser = blockchain_subparsers.add_parser("import-chain", help="Import chain state")
|
||||
blockchain_import_chain_parser.add_argument("--file", required=True, help="Chain state file")
|
||||
blockchain_import_chain_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
blockchain_import_chain_parser.set_defaults(handler=handle_blockchain_import_chain)
|
||||
|
||||
blockchain_blocks_range_parser = blockchain_subparsers.add_parser("blocks-range", help="Get blocks in height range")
|
||||
blockchain_blocks_range_parser.add_argument("--start", type=int, help="Start height")
|
||||
blockchain_blocks_range_parser.add_argument("--end", type=int, help="End height")
|
||||
blockchain_blocks_range_parser.add_argument("--limit", type=int, default=10, help="Limit number of blocks")
|
||||
blockchain_blocks_range_parser.add_argument("--chain-id", help="Chain ID")
|
||||
blockchain_blocks_range_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
blockchain_blocks_range_parser.set_defaults(handler=handle_blockchain_blocks_range)
|
||||
|
||||
account_parser = subparsers.add_parser("account", help="Account information")
|
||||
account_parser.set_defaults(handler=lambda parsed, parser=account_parser: parser.print_help())
|
||||
account_subparsers = account_parser.add_subparsers(dest="account_action")
|
||||
|
||||
account_get_parser = account_subparsers.add_parser("get", help="Get account information")
|
||||
account_get_parser.add_argument("--address", required=True, help="Account address")
|
||||
account_get_parser.add_argument("--chain-id", help="Chain ID")
|
||||
account_get_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
account_get_parser.set_defaults(handler=handle_account_get)
|
||||
|
||||
blockchain_transactions_parser = blockchain_subparsers.add_parser("transactions", help="Query transactions")
|
||||
blockchain_transactions_parser.add_argument("--address", help="Filter by address")
|
||||
blockchain_transactions_parser.add_argument("--limit", type=int, default=10)
|
||||
blockchain_transactions_parser.add_argument("--offset", type=int, default=0)
|
||||
blockchain_transactions_parser.add_argument("--chain-id", help="Chain ID")
|
||||
blockchain_transactions_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
blockchain_transactions_parser.set_defaults(handler=handle_blockchain_transactions)
|
||||
|
||||
blockchain_mempool_parser = blockchain_subparsers.add_parser("mempool", help="Get pending transactions")
|
||||
blockchain_mempool_parser.add_argument("--chain-id", help="Chain ID")
|
||||
blockchain_mempool_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
blockchain_mempool_parser.set_defaults(handler=handle_blockchain_mempool)
|
||||
|
||||
messaging_parser = subparsers.add_parser("messaging", help="Messaging system and forum")
|
||||
messaging_parser.set_defaults(handler=lambda parsed, parser=messaging_parser: parser.print_help())
|
||||
messaging_subparsers = messaging_parser.add_subparsers(dest="messaging_action")
|
||||
|
||||
messaging_deploy_parser = messaging_subparsers.add_parser("deploy", help="Deploy messaging contract")
|
||||
messaging_deploy_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_deploy_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
messaging_deploy_parser.set_defaults(handler=handle_messaging_deploy)
|
||||
|
||||
messaging_state_parser = messaging_subparsers.add_parser("state", help="Get contract state")
|
||||
messaging_state_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_state_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
messaging_state_parser.set_defaults(handler=handle_messaging_state)
|
||||
|
||||
messaging_topics_parser = messaging_subparsers.add_parser("topics", help="List forum topics")
|
||||
messaging_topics_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_topics_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
messaging_topics_parser.set_defaults(handler=handle_messaging_topics)
|
||||
|
||||
messaging_create_topic_parser = messaging_subparsers.add_parser("create-topic", help="Create forum topic")
|
||||
messaging_create_topic_parser.add_argument("--title", required=True, help="Topic title")
|
||||
messaging_create_topic_parser.add_argument("--content", required=True, help="Topic content")
|
||||
messaging_create_topic_parser.add_argument("--wallet", help="Wallet address for authentication")
|
||||
messaging_create_topic_parser.add_argument("--password")
|
||||
messaging_create_topic_parser.add_argument("--password-file")
|
||||
messaging_create_topic_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_create_topic_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
messaging_create_topic_parser.set_defaults(handler=handle_messaging_create_topic)
|
||||
|
||||
messaging_messages_parser = messaging_subparsers.add_parser("messages", help="Get topic messages")
|
||||
messaging_messages_parser.add_argument("--topic-id", required=True, help="Topic ID")
|
||||
messaging_messages_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_messages_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
messaging_messages_parser.set_defaults(handler=handle_messaging_messages)
|
||||
|
||||
messaging_post_parser = messaging_subparsers.add_parser("post", help="Post message")
|
||||
messaging_post_parser.add_argument("--topic-id", required=True, help="Topic ID")
|
||||
messaging_post_parser.add_argument("--content", required=True, help="Message content")
|
||||
messaging_post_parser.add_argument("--wallet", help="Wallet address for authentication")
|
||||
messaging_post_parser.add_argument("--password")
|
||||
messaging_post_parser.add_argument("--password-file")
|
||||
messaging_post_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_post_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
messaging_post_parser.set_defaults(handler=handle_messaging_post)
|
||||
|
||||
messaging_vote_parser = messaging_subparsers.add_parser("vote", help="Vote on message")
|
||||
messaging_vote_parser.add_argument("--message-id", required=True, help="Message ID")
|
||||
messaging_vote_parser.add_argument("--vote", required=True, help="Vote (up/down)")
|
||||
messaging_vote_parser.add_argument("--wallet", help="Wallet address for authentication")
|
||||
messaging_vote_parser.add_argument("--password")
|
||||
messaging_vote_parser.add_argument("--password-file")
|
||||
messaging_vote_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_vote_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
messaging_vote_parser.set_defaults(handler=handle_messaging_vote)
|
||||
|
||||
messaging_search_parser = messaging_subparsers.add_parser("search", help="Search messages")
|
||||
messaging_search_parser.add_argument("--query", required=True, help="Search query")
|
||||
messaging_search_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_search_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
messaging_search_parser.set_defaults(handler=handle_messaging_search)
|
||||
|
||||
messaging_reputation_parser = messaging_subparsers.add_parser("reputation", help="Get agent reputation")
|
||||
messaging_reputation_parser.add_argument("--agent-id", required=True, help="Agent ID")
|
||||
messaging_reputation_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_reputation_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
messaging_reputation_parser.set_defaults(handler=handle_messaging_reputation)
|
||||
|
||||
messaging_moderate_parser = messaging_subparsers.add_parser("moderate", help="Moderate message")
|
||||
messaging_moderate_parser.add_argument("--message-id", required=True, help="Message ID")
|
||||
messaging_moderate_parser.add_argument("--action", required=True, help="Action (approve/reject)")
|
||||
messaging_moderate_parser.add_argument("--wallet", help="Wallet address for authentication")
|
||||
messaging_moderate_parser.add_argument("--password")
|
||||
messaging_moderate_parser.add_argument("--password-file")
|
||||
messaging_moderate_parser.add_argument("--chain-id", help="Chain ID")
|
||||
messaging_moderate_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
messaging_moderate_parser.set_defaults(handler=handle_messaging_moderate)
|
||||
|
||||
network_parser = subparsers.add_parser("network", help="Peer connectivity and sync")
|
||||
network_parser.set_defaults(handler=handle_network_status)
|
||||
network_subparsers = network_parser.add_subparsers(dest="network_action")
|
||||
|
||||
network_status_parser = network_subparsers.add_parser("status", help="Show network status")
|
||||
network_status_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
network_status_parser.set_defaults(handler=handle_network_status)
|
||||
|
||||
network_peers_parser = network_subparsers.add_parser("peers", help="List peers")
|
||||
network_peers_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
network_peers_parser.set_defaults(handler=handle_network_peers)
|
||||
|
||||
network_sync_parser = network_subparsers.add_parser("sync", help="Show sync status")
|
||||
network_sync_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
network_sync_parser.set_defaults(handler=handle_network_sync)
|
||||
|
||||
network_ping_parser = network_subparsers.add_parser("ping", help="Ping a node")
|
||||
network_ping_parser.add_argument("node", nargs="?")
|
||||
network_ping_parser.add_argument("--node", dest="node_opt", help=argparse.SUPPRESS)
|
||||
network_ping_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
network_ping_parser.set_defaults(handler=handle_network_ping)
|
||||
|
||||
network_propagate_parser = network_subparsers.add_parser("propagate", help="Propagate test data")
|
||||
network_propagate_parser.add_argument("data", nargs="?")
|
||||
network_propagate_parser.add_argument("--data", dest="data_opt", help=argparse.SUPPRESS)
|
||||
network_propagate_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
network_propagate_parser.set_defaults(handler=handle_network_propagate)
|
||||
|
||||
network_force_sync_parser = network_subparsers.add_parser("force-sync", help="Force reorg to specified peer")
|
||||
network_force_sync_parser.add_argument("--peer", required=True, help="Peer to sync from")
|
||||
network_force_sync_parser.add_argument("--chain-id", help="Chain ID")
|
||||
network_force_sync_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
network_force_sync_parser.set_defaults(handler=handle_network_force_sync)
|
||||
|
||||
market_parser = subparsers.add_parser("market", help="Marketplace listings and offers")
|
||||
market_parser.set_defaults(handler=lambda parsed, parser=market_parser: parser.print_help())
|
||||
market_subparsers = market_parser.add_subparsers(dest="market_action")
|
||||
|
||||
# GPU marketplace subcommands
|
||||
market_gpu_parser = market_subparsers.add_parser("gpu", help="GPU marketplace operations")
|
||||
market_gpu_parser.set_defaults(handler=lambda parsed, parser=market_gpu_parser: parser.print_help())
|
||||
market_gpu_subparsers = market_gpu_parser.add_subparsers(dest="gpu_action")
|
||||
|
||||
market_gpu_register_parser = market_gpu_subparsers.add_parser("register", help="Register GPU on marketplace")
|
||||
market_gpu_register_parser.add_argument("--name", help="GPU name/model")
|
||||
market_gpu_register_parser.add_argument("--memory", type=int, help="GPU memory in GB")
|
||||
market_gpu_register_parser.add_argument("--cuda-cores", type=int, help="Number of CUDA cores")
|
||||
market_gpu_register_parser.add_argument("--compute-capability", help="Compute capability (e.g., 8.9)")
|
||||
market_gpu_register_parser.add_argument("--price-per-hour", type=float, required=True, help="Price per hour in AIT")
|
||||
market_gpu_register_parser.add_argument("--description", help="GPU description")
|
||||
market_gpu_register_parser.add_argument("--miner-id", help="Miner ID")
|
||||
market_gpu_register_parser.add_argument("--force", action="store_true", help="Force registration without hardware validation")
|
||||
market_gpu_register_parser.add_argument("--coordinator-url", default=default_coordinator_url)
|
||||
market_gpu_register_parser.set_defaults(handler=handle_market_gpu_register)
|
||||
|
||||
market_gpu_list_parser = market_gpu_subparsers.add_parser("list", help="List available GPUs")
|
||||
market_gpu_list_parser.add_argument("--available", action="store_true", help="Show only available GPUs")
|
||||
market_gpu_list_parser.add_argument("--price-max", type=float, help="Maximum price per hour")
|
||||
market_gpu_list_parser.add_argument("--region", help="Filter by region")
|
||||
market_gpu_list_parser.add_argument("--model", help="Filter by GPU model")
|
||||
market_gpu_list_parser.add_argument("--limit", type=int, default=100, help="Maximum number of results")
|
||||
market_gpu_list_parser.add_argument("--coordinator-url", default=default_coordinator_url)
|
||||
market_gpu_list_parser.set_defaults(handler=handle_market_gpu_list)
|
||||
|
||||
market_list_parser = market_subparsers.add_parser("list", help="List marketplace items")
|
||||
market_list_parser.add_argument("--chain-id", help="Chain ID")
|
||||
market_list_parser.add_argument("--coordinator-url", default=default_coordinator_url)
|
||||
market_list_parser.set_defaults(handler=handle_market_listings)
|
||||
|
||||
market_create_parser = market_subparsers.add_parser("create", help="Create a marketplace listing")
|
||||
market_create_parser.add_argument("--wallet", required=True)
|
||||
market_create_parser.add_argument("--type", dest="item_type", required=True)
|
||||
market_create_parser.add_argument("--price", type=float, required=True)
|
||||
market_create_parser.add_argument("--description")
|
||||
market_create_parser.add_argument("--password")
|
||||
market_create_parser.add_argument("--password-file")
|
||||
market_create_parser.add_argument("--chain-id", help="Chain ID")
|
||||
market_create_parser.add_argument("--coordinator-url", default=default_coordinator_url)
|
||||
market_create_parser.set_defaults(handler=handle_market_create)
|
||||
|
||||
market_search_parser = market_subparsers.add_parser("search", help="Search marketplace items")
|
||||
market_search_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
market_search_parser.set_defaults(handler=handle_market_listings) # Reuse listings for now
|
||||
|
||||
market_mine_parser = market_subparsers.add_parser("my-listings", help="Show your marketplace listings")
|
||||
market_mine_parser.add_argument("--wallet")
|
||||
market_mine_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
market_mine_parser.set_defaults(handler=handle_market_listings) # Reuse listings for now
|
||||
|
||||
market_get_parser = market_subparsers.add_parser("get", help="Get listing by ID")
|
||||
market_get_parser.add_argument("--listing-id", required=True)
|
||||
market_get_parser.add_argument("--chain-id", help="Chain ID")
|
||||
market_get_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
market_get_parser.set_defaults(handler=handle_market_get)
|
||||
|
||||
market_delete_parser = market_subparsers.add_parser("delete", help="Delete listing")
|
||||
market_delete_parser.add_argument("--listing-id", required=True)
|
||||
market_delete_parser.add_argument("--wallet", required=True)
|
||||
market_delete_parser.add_argument("--password")
|
||||
market_delete_parser.add_argument("--password-file")
|
||||
market_delete_parser.add_argument("--chain-id", help="Chain ID")
|
||||
market_delete_parser.add_argument("--coordinator-url", default=default_coordinator_url)
|
||||
market_delete_parser.set_defaults(handler=handle_market_delete)
|
||||
|
||||
market_buy_parser = market_subparsers.add_parser("buy", help="Buy from marketplace")
|
||||
market_buy_parser.add_argument("--item", required=True)
|
||||
market_buy_parser.add_argument("--wallet", required=True)
|
||||
market_buy_parser.add_argument("--password")
|
||||
market_buy_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
market_buy_parser.set_defaults(handler=handle_market_listings) # Placeholder
|
||||
|
||||
market_sell_parser = market_subparsers.add_parser("sell", help="Sell on marketplace")
|
||||
market_sell_parser.add_argument("--item", required=True)
|
||||
market_sell_parser.add_argument("--price", type=float, required=True)
|
||||
market_sell_parser.add_argument("--wallet", required=True)
|
||||
market_sell_parser.add_argument("--password")
|
||||
market_sell_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
market_sell_parser.set_defaults(handler=handle_market_create) # Reuse create
|
||||
|
||||
market_orders_parser = market_subparsers.add_parser("orders", help="Show marketplace orders")
|
||||
market_orders_parser.add_argument("--wallet")
|
||||
market_orders_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
market_orders_parser.set_defaults(handler=handle_market_listings) # Reuse listings for now
|
||||
|
||||
ai_parser = subparsers.add_parser("ai", help="AI job submission and inspection")
|
||||
ai_parser.set_defaults(handler=lambda parsed, parser=ai_parser: parser.print_help())
|
||||
ai_subparsers = ai_parser.add_subparsers(dest="ai_action")
|
||||
|
||||
ai_submit_parser = ai_subparsers.add_parser("submit", help="Submit an AI job")
|
||||
ai_submit_parser.add_argument("wallet_name", nargs="?")
|
||||
ai_submit_parser.add_argument("job_type_arg", nargs="?")
|
||||
ai_submit_parser.add_argument("prompt_arg", nargs="?")
|
||||
ai_submit_parser.add_argument("payment_arg", nargs="?")
|
||||
ai_submit_parser.add_argument("--wallet")
|
||||
ai_submit_parser.add_argument("--type", dest="job_type")
|
||||
ai_submit_parser.add_argument("--prompt")
|
||||
ai_submit_parser.add_argument("--payment", type=float)
|
||||
ai_submit_parser.add_argument("--password")
|
||||
ai_submit_parser.add_argument("--password-file")
|
||||
ai_submit_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_submit_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
ai_submit_parser.set_defaults(handler=handle_ai_submit)
|
||||
|
||||
ai_jobs_parser = ai_subparsers.add_parser("jobs", help="List AI jobs")
|
||||
ai_jobs_parser.add_argument("--limit", type=int, default=10)
|
||||
ai_jobs_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_jobs_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
ai_jobs_parser.set_defaults(handler=handle_ai_jobs)
|
||||
|
||||
ai_status_parser = ai_subparsers.add_parser("status", help="Show AI job status")
|
||||
ai_status_parser.add_argument("job_id_arg", nargs="?")
|
||||
ai_status_parser.add_argument("--job-id", dest="job_id")
|
||||
ai_status_parser.add_argument("--wallet")
|
||||
ai_status_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_status_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
ai_status_parser.set_defaults(handler=handle_ai_job)
|
||||
|
||||
ai_service_parser = ai_subparsers.add_parser("service", help="AI service management")
|
||||
ai_service_subparsers = ai_service_parser.add_subparsers(dest="ai_service_action")
|
||||
|
||||
ai_service_list_parser = ai_service_subparsers.add_parser("list", help="List available AI services")
|
||||
ai_service_list_parser.set_defaults(handler=handle_ai_service_list)
|
||||
|
||||
ai_service_status_parser = ai_service_subparsers.add_parser("status", help="Check AI service status")
|
||||
ai_service_status_parser.add_argument("--name", help="Service name to check")
|
||||
ai_service_status_parser.set_defaults(handler=handle_ai_service_status)
|
||||
|
||||
ai_service_test_parser = ai_service_subparsers.add_parser("test", help="Test AI service endpoint")
|
||||
ai_service_test_parser.add_argument("--name", help="Service name to test")
|
||||
ai_service_test_parser.set_defaults(handler=handle_ai_service_test)
|
||||
|
||||
ai_results_parser = ai_subparsers.add_parser("results", help="Show AI job results")
|
||||
ai_results_parser.add_argument("job_id_arg", nargs="?")
|
||||
ai_results_parser.add_argument("--job-id", dest="job_id")
|
||||
ai_results_parser.add_argument("--wallet")
|
||||
ai_results_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_results_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
ai_results_parser.set_defaults(handler=handle_ai_job) # Reuse job handler
|
||||
|
||||
ai_cancel_parser = ai_subparsers.add_parser("cancel", help="Cancel AI job")
|
||||
ai_cancel_parser.add_argument("job_id_arg", nargs="?")
|
||||
ai_cancel_parser.add_argument("--job-id", dest="job_id")
|
||||
ai_cancel_parser.add_argument("--wallet", required=True)
|
||||
ai_cancel_parser.add_argument("--password")
|
||||
ai_cancel_parser.add_argument("--password-file")
|
||||
ai_cancel_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_cancel_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
ai_cancel_parser.set_defaults(handler=handle_ai_cancel)
|
||||
|
||||
ai_stats_parser = ai_subparsers.add_parser("stats", help="AI service statistics")
|
||||
ai_stats_parser.add_argument("--chain-id", help="Chain ID")
|
||||
ai_stats_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
ai_stats_parser.set_defaults(handler=handle_ai_stats)
|
||||
|
||||
mining_parser = subparsers.add_parser("mining", help="Mining lifecycle and rewards")
|
||||
mining_parser.set_defaults(handler=handle_mining_action, mining_action="status")
|
||||
mining_subparsers = mining_parser.add_subparsers(dest="mining_action")
|
||||
|
||||
mining_status_parser = mining_subparsers.add_parser("status", help="Show mining status")
|
||||
mining_status_parser.add_argument("--wallet")
|
||||
mining_status_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
mining_status_parser.set_defaults(handler=handle_mining_action, mining_action="status")
|
||||
|
||||
mining_start_parser = mining_subparsers.add_parser("start", help="Start mining")
|
||||
mining_start_parser.add_argument("--wallet")
|
||||
mining_start_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
mining_start_parser.set_defaults(handler=handle_mining_action, mining_action="start")
|
||||
|
||||
mining_stop_parser = mining_subparsers.add_parser("stop", help="Stop mining")
|
||||
mining_stop_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
mining_stop_parser.set_defaults(handler=handle_mining_action, mining_action="stop")
|
||||
|
||||
mining_rewards_parser = mining_subparsers.add_parser("rewards", help="Show mining rewards")
|
||||
mining_rewards_parser.add_argument("--wallet")
|
||||
mining_rewards_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
mining_rewards_parser.set_defaults(handler=handle_mining_action, mining_action="rewards")
|
||||
|
||||
analytics_parser = subparsers.add_parser("analytics", help="Blockchain analytics and statistics")
|
||||
analytics_parser.set_defaults(handler=lambda parsed, parser=analytics_parser: parser.print_help())
|
||||
analytics_subparsers = analytics_parser.add_subparsers(dest="analytics_action")
|
||||
|
||||
analytics_blocks_parser = analytics_subparsers.add_parser("blocks", help="Block analytics")
|
||||
analytics_blocks_parser.add_argument("--limit", type=int, default=10)
|
||||
analytics_blocks_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
analytics_blocks_parser.set_defaults(handler=handle_analytics, type="blocks")
|
||||
|
||||
analytics_report_parser = analytics_subparsers.add_parser("report", help="Generate analytics report")
|
||||
analytics_report_parser.add_argument("--type", choices=["performance", "transactions", "all"], default="all")
|
||||
analytics_report_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
analytics_report_parser.set_defaults(handler=handle_analytics, type="report")
|
||||
|
||||
analytics_metrics_parser = analytics_subparsers.add_parser("metrics", help="Show performance metrics")
|
||||
analytics_metrics_parser.add_argument("--limit", type=int, default=10)
|
||||
analytics_metrics_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
analytics_metrics_parser.set_defaults(handler=handle_analytics, type="metrics")
|
||||
|
||||
analytics_export_parser = analytics_subparsers.add_parser("export", help="Export analytics data")
|
||||
analytics_export_parser.add_argument("--format", choices=["json", "csv"], default="json")
|
||||
analytics_export_parser.add_argument("--output")
|
||||
analytics_export_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
analytics_export_parser.set_defaults(handler=handle_analytics, type="export")
|
||||
|
||||
system_parser = subparsers.add_parser("system", help="System health and overview")
|
||||
system_parser.set_defaults(handler=handle_system_status)
|
||||
system_subparsers = system_parser.add_subparsers(dest="system_action")
|
||||
|
||||
system_status_parser = system_subparsers.add_parser("status", help="Show system status")
|
||||
system_status_parser.set_defaults(handler=handle_system_status)
|
||||
|
||||
agent_parser = subparsers.add_parser("agent", help="AI agent workflow orchestration")
|
||||
agent_parser.set_defaults(handler=lambda parsed, parser=agent_parser: parser.print_help())
|
||||
agent_subparsers = agent_parser.add_subparsers(dest="agent_action")
|
||||
|
||||
agent_create_parser = agent_subparsers.add_parser("create", help="Create an agent workflow")
|
||||
agent_create_parser.add_argument("--name", required=True)
|
||||
agent_create_parser.add_argument("--description")
|
||||
agent_create_parser.add_argument("--workflow-file")
|
||||
agent_create_parser.add_argument("--verification", choices=["basic", "full", "zero-knowledge"], default="basic")
|
||||
agent_create_parser.add_argument("--max-execution-time", type=int, default=3600)
|
||||
agent_create_parser.add_argument("--max-cost-budget", type=float, default=0.0)
|
||||
agent_create_parser.set_defaults(handler=handle_agent_action)
|
||||
|
||||
agent_execute_parser = agent_subparsers.add_parser("execute", help="Execute an agent workflow")
|
||||
agent_execute_parser.add_argument("--name", required=True)
|
||||
agent_execute_parser.add_argument("--input-data")
|
||||
agent_execute_parser.add_argument("--wallet")
|
||||
agent_execute_parser.add_argument("--priority", choices=["low", "medium", "high"], default="medium")
|
||||
agent_execute_parser.set_defaults(handler=handle_agent_action)
|
||||
|
||||
agent_status_parser = agent_subparsers.add_parser("status", help="Show agent status")
|
||||
agent_status_parser.add_argument("--name")
|
||||
agent_status_parser.add_argument("--execution-id")
|
||||
agent_status_parser.set_defaults(handler=handle_agent_action)
|
||||
|
||||
agent_list_parser = agent_subparsers.add_parser("list", help="List agents")
|
||||
agent_list_parser.add_argument("--status", choices=["active", "completed", "failed"])
|
||||
agent_list_parser.set_defaults(handler=handle_agent_action)
|
||||
|
||||
agent_message_parser = agent_subparsers.add_parser("message", help="Send message to agent")
|
||||
agent_message_parser.add_argument("--agent", required=True)
|
||||
agent_message_parser.add_argument("--message", required=True)
|
||||
agent_message_parser.add_argument("--wallet", required=True)
|
||||
agent_message_parser.add_argument("--password")
|
||||
agent_message_parser.add_argument("--password-file")
|
||||
agent_message_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
agent_message_parser.set_defaults(handler=handle_agent_action, agent_action="message")
|
||||
|
||||
agent_messages_parser = agent_subparsers.add_parser("messages", help="List agent messages")
|
||||
agent_messages_parser.add_argument("--agent", required=True)
|
||||
agent_messages_parser.add_argument("--wallet")
|
||||
agent_messages_parser.add_argument("--rpc-url", default=default_rpc_url)
|
||||
agent_messages_parser.set_defaults(handler=handle_agent_action, agent_action="messages")
|
||||
|
||||
openclaw_parser = subparsers.add_parser("openclaw", help="OpenClaw ecosystem operations")
|
||||
openclaw_parser.set_defaults(handler=lambda parsed, parser=openclaw_parser: parser.print_help())
|
||||
openclaw_subparsers = openclaw_parser.add_subparsers(dest="openclaw_action")
|
||||
|
||||
openclaw_deploy_parser = openclaw_subparsers.add_parser("deploy", help="Deploy an OpenClaw agent")
|
||||
openclaw_deploy_parser.add_argument("--agent-file", required=True)
|
||||
openclaw_deploy_parser.add_argument("--wallet", required=True)
|
||||
openclaw_deploy_parser.add_argument("--environment", choices=["dev", "staging", "prod"], default="dev")
|
||||
openclaw_deploy_parser.set_defaults(handler=handle_openclaw_action)
|
||||
|
||||
openclaw_monitor_parser = openclaw_subparsers.add_parser("monitor", help="Monitor OpenClaw performance")
|
||||
openclaw_monitor_parser.add_argument("--agent-id")
|
||||
openclaw_monitor_parser.add_argument("--metrics", choices=["performance", "cost", "errors", "all"], default="all")
|
||||
openclaw_monitor_parser.set_defaults(handler=handle_openclaw_action)
|
||||
|
||||
openclaw_market_parser = openclaw_subparsers.add_parser("market", help="Manage OpenClaw marketplace activity")
|
||||
openclaw_market_parser.add_argument("market_action", nargs="?", choices=["list", "publish", "purchase", "evaluate"])
|
||||
openclaw_market_parser.add_argument("--action", dest="market_action_opt", choices=["list", "publish", "purchase", "evaluate"], help=argparse.SUPPRESS)
|
||||
openclaw_market_parser.add_argument("--agent-id")
|
||||
openclaw_market_parser.add_argument("--price", type=float)
|
||||
openclaw_market_parser.set_defaults(handler=handle_openclaw_action, openclaw_action="market")
|
||||
|
||||
workflow_parser = subparsers.add_parser("workflow", help="Workflow templates and execution")
|
||||
workflow_parser.set_defaults(handler=lambda parsed, parser=workflow_parser: parser.print_help())
|
||||
workflow_subparsers = workflow_parser.add_subparsers(dest="workflow_action")
|
||||
|
||||
workflow_create_parser = workflow_subparsers.add_parser("create", help="Create a workflow")
|
||||
workflow_create_parser.add_argument("--name", required=True)
|
||||
workflow_create_parser.add_argument("--template")
|
||||
workflow_create_parser.add_argument("--config-file")
|
||||
workflow_create_parser.set_defaults(handler=handle_workflow_action)
|
||||
|
||||
workflow_run_parser = workflow_subparsers.add_parser("run", help="Run a workflow")
|
||||
workflow_run_parser.add_argument("--name", required=True)
|
||||
workflow_run_parser.add_argument("--params")
|
||||
workflow_run_parser.add_argument("--async-exec", action="store_true")
|
||||
workflow_run_parser.set_defaults(handler=handle_workflow_action)
|
||||
|
||||
workflow_schedule_parser = workflow_subparsers.add_parser("schedule", help="Schedule a workflow")
|
||||
workflow_schedule_parser.add_argument("--name", required=True)
|
||||
workflow_schedule_parser.add_argument("--cron", required=True)
|
||||
workflow_schedule_parser.add_argument("--params")
|
||||
workflow_schedule_parser.set_defaults(handler=handle_workflow_action, workflow_action="schedule")
|
||||
|
||||
workflow_monitor_parser = workflow_subparsers.add_parser("monitor", help="Monitor workflow execution")
|
||||
workflow_monitor_parser.add_argument("--name")
|
||||
workflow_monitor_parser.add_argument("--execution-id")
|
||||
workflow_monitor_parser.set_defaults(handler=handle_workflow_action, workflow_action="monitor")
|
||||
|
||||
resource_parser = subparsers.add_parser("resource", help="Resource utilization and allocation")
|
||||
resource_parser.set_defaults(handler=lambda parsed, parser=resource_parser: parser.print_help())
|
||||
resource_subparsers = resource_parser.add_subparsers(dest="resource_action")
|
||||
|
||||
resource_status_parser = resource_subparsers.add_parser("status", help="Show resource status")
|
||||
resource_status_parser.add_argument("--type", choices=["cpu", "memory", "storage", "network", "all"], default="all")
|
||||
resource_status_parser.set_defaults(handler=handle_resource_action)
|
||||
|
||||
resource_allocate_parser = resource_subparsers.add_parser("allocate", help="Allocate resources")
|
||||
resource_allocate_parser.add_argument("--agent-id", required=True)
|
||||
resource_allocate_parser.add_argument("--cpu", type=float)
|
||||
resource_allocate_parser.add_argument("--memory", type=int)
|
||||
resource_allocate_parser.add_argument("--duration", type=int)
|
||||
resource_allocate_parser.set_defaults(handler=handle_resource_action)
|
||||
|
||||
resource_optimize_parser = resource_subparsers.add_parser("optimize", help="Optimize resource usage")
|
||||
resource_optimize_parser.add_argument("--agent-id")
|
||||
resource_optimize_parser.add_argument("--target", choices=["cpu", "memory", "all"], default="all")
|
||||
resource_optimize_parser.set_defaults(handler=handle_resource_action, resource_action="optimize")
|
||||
|
||||
resource_benchmark_parser = resource_subparsers.add_parser("benchmark", help="Run resource benchmark")
|
||||
resource_benchmark_parser.add_argument("--type", choices=["cpu", "memory", "io", "all"], default="all")
|
||||
resource_benchmark_parser.set_defaults(handler=handle_resource_action, resource_action="benchmark")
|
||||
|
||||
resource_monitor_parser = resource_subparsers.add_parser("monitor", help="Monitor resource utilization")
|
||||
resource_monitor_parser.add_argument("--interval", type=int, default=5, help="Monitoring interval in seconds")
|
||||
resource_monitor_parser.add_argument("--duration", type=int, default=60, help="Monitoring duration in seconds")
|
||||
resource_monitor_parser.set_defaults(handler=handle_resource_action, resource_action="monitor")
|
||||
|
||||
economics_parser = subparsers.add_parser("economics", help="Economic intelligence and modeling")
|
||||
economics_parser.set_defaults(handler=lambda parsed, parser=economics_parser: parser.print_help())
|
||||
economics_subparsers = economics_parser.add_subparsers(dest="economics_action")
|
||||
|
||||
economics_distributed_parser = economics_subparsers.add_parser("distributed", help="Distributed cost optimization")
|
||||
economics_distributed_parser.add_argument("--cost-optimize", action="store_true")
|
||||
economics_distributed_parser.set_defaults(handler=handle_economics_action)
|
||||
|
||||
economics_market_parser = economics_subparsers.add_parser("market", help="Market analysis")
|
||||
economics_market_parser.add_argument("--analyze", action="store_true")
|
||||
economics_market_parser.set_defaults(handler=handle_economics_action)
|
||||
|
||||
economics_trends_parser = economics_subparsers.add_parser("trends", help="Economic trends analysis")
|
||||
economics_trends_parser.add_argument("--period")
|
||||
economics_trends_parser.set_defaults(handler=handle_economics_action)
|
||||
|
||||
economics_optimize_parser = economics_subparsers.add_parser("optimize", help="Optimize economic strategy")
|
||||
economics_optimize_parser.add_argument("--target", choices=["revenue", "cost", "all"], default="all")
|
||||
economics_optimize_parser.set_defaults(handler=handle_economics_action)
|
||||
|
||||
genesis_parser = subparsers.add_parser("genesis", help="Genesis block and wallet generation")
|
||||
genesis_parser.set_defaults(handler=lambda parsed, parser=genesis_parser: parser.print_help())
|
||||
genesis_subparsers = genesis_parser.add_subparsers(dest="genesis_action")
|
||||
|
||||
genesis_init_parser = genesis_subparsers.add_parser("init", help="Initialize genesis block and wallet")
|
||||
genesis_init_parser.add_argument("--chain-id", default="ait-mainnet", help="Chain ID for genesis")
|
||||
genesis_init_parser.add_argument("--create-wallet", action="store_true", help="Create genesis wallet with secure random key")
|
||||
genesis_init_parser.add_argument("--password", help="Wallet password (auto-generated if not provided)")
|
||||
genesis_init_parser.add_argument("--proposer", help="Proposer address (defaults to genesis wallet)")
|
||||
genesis_init_parser.add_argument("--force", action="store_true", help="Force overwrite existing genesis")
|
||||
genesis_init_parser.add_argument("--register-service", action="store_true", help="Register genesis wallet with wallet service")
|
||||
genesis_init_parser.add_argument("--service-url", default="http://localhost:8003", help="Wallet service URL")
|
||||
genesis_init_parser.set_defaults(handler=handle_genesis_init)
|
||||
|
||||
genesis_verify_parser = genesis_subparsers.add_parser("verify", help="Verify genesis block and wallet configuration")
|
||||
genesis_verify_parser.add_argument("--chain-id", default="ait-mainnet", help="Chain ID to verify")
|
||||
genesis_verify_parser.set_defaults(handler=handle_genesis_verify)
|
||||
|
||||
genesis_info_parser = genesis_subparsers.add_parser("info", help="Show genesis block information")
|
||||
genesis_info_parser.add_argument("--chain-id", default="ait-mainnet", help="Chain ID to show info for")
|
||||
genesis_info_parser.set_defaults(handler=handle_genesis_info)
|
||||
|
||||
cluster_parser = subparsers.add_parser("cluster", help="Cluster management")
|
||||
cluster_parser.set_defaults(handler=lambda parsed, parser=cluster_parser: parser.print_help())
|
||||
cluster_subparsers = cluster_parser.add_subparsers(dest="cluster_action")
|
||||
|
||||
cluster_status_parser = cluster_subparsers.add_parser("status", help="Show cluster status")
|
||||
cluster_status_parser.add_argument("--nodes", nargs="*", default=["aitbc", "aitbc1"])
|
||||
cluster_status_parser.set_defaults(handler=handle_network_status)
|
||||
|
||||
cluster_sync_parser = cluster_subparsers.add_parser("sync", help="Sync cluster nodes")
|
||||
cluster_sync_parser.add_argument("--all", action="store_true")
|
||||
cluster_sync_parser.set_defaults(handler=handle_cluster_action)
|
||||
|
||||
cluster_balance_parser = cluster_subparsers.add_parser("balance", help="Balance workload across nodes")
|
||||
cluster_balance_parser.add_argument("--workload", action="store_true")
|
||||
cluster_balance_parser.set_defaults(handler=handle_cluster_action)
|
||||
|
||||
performance_parser = subparsers.add_parser("performance", help="Performance optimization")
|
||||
performance_parser.set_defaults(handler=lambda parsed, parser=performance_parser: parser.print_help())
|
||||
performance_subparsers = performance_parser.add_subparsers(dest="performance_action")
|
||||
|
||||
performance_benchmark_parser = performance_subparsers.add_parser("benchmark", help="Run performance benchmark")
|
||||
performance_benchmark_parser.add_argument("--suite", choices=["comprehensive", "quick", "custom"], default="comprehensive")
|
||||
performance_benchmark_parser.set_defaults(handler=handle_performance_action)
|
||||
|
||||
performance_optimize_parser = performance_subparsers.add_parser("optimize", help="Optimize performance")
|
||||
performance_optimize_parser.add_argument("--target", choices=["latency", "throughput", "all"], default="all")
|
||||
performance_optimize_parser.set_defaults(handler=handle_performance_action)
|
||||
|
||||
performance_tune_parser = performance_subparsers.add_parser("tune", help="Tune system parameters")
|
||||
performance_tune_parser.add_argument("--parameters", action="store_true")
|
||||
performance_tune_parser.add_argument("--aggressive", action="store_true")
|
||||
performance_tune_parser.set_defaults(handler=handle_performance_action)
|
||||
|
||||
security_parser = subparsers.add_parser("security", help="Security audit and scanning")
|
||||
security_parser.set_defaults(handler=lambda parsed, parser=security_parser: parser.print_help())
|
||||
security_subparsers = security_parser.add_subparsers(dest="security_action")
|
||||
|
||||
security_audit_parser = security_subparsers.add_parser("audit", help="Run security audit")
|
||||
security_audit_parser.add_argument("--comprehensive", action="store_true")
|
||||
security_audit_parser.set_defaults(handler=handle_security_action)
|
||||
|
||||
security_scan_parser = security_subparsers.add_parser("scan", help="Scan for vulnerabilities")
|
||||
security_scan_parser.add_argument("--vulnerabilities", action="store_true")
|
||||
security_scan_parser.set_defaults(handler=handle_security_action)
|
||||
|
||||
security_patch_parser = security_subparsers.add_parser("patch", help="Check for security patches")
|
||||
security_patch_parser.add_argument("--critical", action="store_true")
|
||||
security_patch_parser.set_defaults(handler=handle_security_action)
|
||||
|
||||
compliance_parser = subparsers.add_parser("compliance", help="Compliance checking and reporting")
|
||||
compliance_parser.set_defaults(handler=lambda parsed, parser=compliance_parser: parser.print_help())
|
||||
compliance_subparsers = compliance_parser.add_subparsers(dest="compliance_action")
|
||||
|
||||
compliance_check_parser = compliance_subparsers.add_parser("check", help="Check compliance status")
|
||||
compliance_check_parser.add_argument("--standard", choices=["gdpr", "hipaa", "soc2", "all"], default="gdpr")
|
||||
compliance_check_parser.set_defaults(handler=handle_system_status)
|
||||
|
||||
compliance_report_parser = compliance_subparsers.add_parser("report", help="Generate compliance report")
|
||||
compliance_report_parser.add_argument("--format", choices=["detailed", "summary", "json"], default="detailed")
|
||||
compliance_report_parser.set_defaults(handler=handle_system_status)
|
||||
|
||||
simulate_parser = subparsers.add_parser("simulate", help="Simulation utilities")
|
||||
simulate_parser.set_defaults(handler=lambda parsed, parser=simulate_parser: parser.print_help())
|
||||
simulate_subparsers = simulate_parser.add_subparsers(dest="simulate_command")
|
||||
|
||||
simulate_blockchain_parser = simulate_subparsers.add_parser("blockchain", help="Simulate blockchain activity")
|
||||
simulate_blockchain_parser.add_argument("--blocks", type=int, default=10)
|
||||
simulate_blockchain_parser.add_argument("--transactions", type=int, default=50)
|
||||
simulate_blockchain_parser.add_argument("--delay", type=float, default=1.0)
|
||||
simulate_blockchain_parser.set_defaults(handler=handle_simulate_action)
|
||||
|
||||
simulate_wallets_parser = simulate_subparsers.add_parser("wallets", help="Simulate wallet activity")
|
||||
simulate_wallets_parser.add_argument("--wallets", type=int, default=5)
|
||||
simulate_wallets_parser.add_argument("--balance", type=float, default=1000.0)
|
||||
simulate_wallets_parser.add_argument("--transactions", type=int, default=20)
|
||||
simulate_wallets_parser.add_argument("--amount-range", default="1.0-100.0")
|
||||
simulate_wallets_parser.set_defaults(handler=handle_simulate_action)
|
||||
|
||||
simulate_price_parser = simulate_subparsers.add_parser("price", help="Simulate price movement")
|
||||
simulate_price_parser.add_argument("--price", type=float, default=100.0)
|
||||
simulate_price_parser.add_argument("--volatility", type=float, default=0.05)
|
||||
simulate_price_parser.add_argument("--timesteps", type=int, default=100)
|
||||
simulate_price_parser.add_argument("--delay", type=float, default=0.1)
|
||||
simulate_price_parser.set_defaults(handler=handle_simulate_action)
|
||||
|
||||
simulate_network_parser = simulate_subparsers.add_parser("network", help="Simulate network topology")
|
||||
simulate_network_parser.add_argument("--nodes", type=int, default=3)
|
||||
simulate_network_parser.add_argument("--network-delay", type=float, default=0.1)
|
||||
simulate_network_parser.add_argument("--failure-rate", type=float, default=0.05)
|
||||
simulate_network_parser.set_defaults(handler=handle_simulate_action)
|
||||
|
||||
simulate_ai_jobs_parser = simulate_subparsers.add_parser("ai-jobs", help="Simulate AI job traffic")
|
||||
simulate_ai_jobs_parser.add_argument("--jobs", type=int, default=10)
|
||||
simulate_ai_jobs_parser.add_argument("--models", default="text-generation")
|
||||
simulate_ai_jobs_parser.add_argument("--duration-range", default="30-300")
|
||||
simulate_ai_jobs_parser.set_defaults(handler=handle_simulate_action)
|
||||
|
||||
pool_hub_parser = subparsers.add_parser("pool-hub", help="Pool hub management for SLA monitoring and billing")
|
||||
pool_hub_parser.set_defaults(handler=lambda parsed, parser=pool_hub_parser: parser.print_help())
|
||||
pool_hub_subparsers = pool_hub_parser.add_subparsers(dest="pool_hub_action")
|
||||
|
||||
pool_hub_sla_metrics_parser = pool_hub_subparsers.add_parser("sla-metrics", help="Get SLA metrics for miner or all miners")
|
||||
pool_hub_sla_metrics_parser.add_argument("miner_id", nargs="?")
|
||||
pool_hub_sla_metrics_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_sla_metrics_parser.set_defaults(handler=handle_pool_hub_sla_metrics)
|
||||
|
||||
pool_hub_sla_violations_parser = pool_hub_subparsers.add_parser("sla-violations", help="Get SLA violations")
|
||||
pool_hub_sla_violations_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_sla_violations_parser.set_defaults(handler=handle_pool_hub_sla_violations)
|
||||
|
||||
pool_hub_capacity_snapshots_parser = pool_hub_subparsers.add_parser("capacity-snapshots", help="Get capacity planning snapshots")
|
||||
pool_hub_capacity_snapshots_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_capacity_snapshots_parser.set_defaults(handler=handle_pool_hub_capacity_snapshots)
|
||||
|
||||
pool_hub_capacity_forecast_parser = pool_hub_subparsers.add_parser("capacity-forecast", help="Get capacity forecast")
|
||||
pool_hub_capacity_forecast_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_capacity_forecast_parser.set_defaults(handler=handle_pool_hub_capacity_forecast)
|
||||
|
||||
pool_hub_capacity_recommendations_parser = pool_hub_subparsers.add_parser("capacity-recommendations", help="Get scaling recommendations")
|
||||
pool_hub_capacity_recommendations_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_capacity_recommendations_parser.set_defaults(handler=handle_pool_hub_capacity_recommendations)
|
||||
|
||||
pool_hub_billing_usage_parser = pool_hub_subparsers.add_parser("billing-usage", help="Get billing usage data")
|
||||
pool_hub_billing_usage_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_billing_usage_parser.set_defaults(handler=handle_pool_hub_billing_usage)
|
||||
|
||||
pool_hub_billing_sync_parser = pool_hub_subparsers.add_parser("billing-sync", help="Trigger billing sync with coordinator-api")
|
||||
pool_hub_billing_sync_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_billing_sync_parser.set_defaults(handler=handle_pool_hub_billing_sync)
|
||||
|
||||
pool_hub_collect_metrics_parser = pool_hub_subparsers.add_parser("collect-metrics", help="Trigger SLA metrics collection")
|
||||
pool_hub_collect_metrics_parser.add_argument("--test-mode", action="store_true")
|
||||
pool_hub_collect_metrics_parser.set_defaults(handler=handle_pool_hub_collect_metrics)
|
||||
|
||||
bridge_parser = subparsers.add_parser("bridge", help="Blockchain event bridge management")
|
||||
bridge_parser.set_defaults(handler=lambda parsed, parser=bridge_parser: parser.print_help())
|
||||
bridge_subparsers = bridge_parser.add_subparsers(dest="bridge_action")
|
||||
|
||||
bridge_health_parser = bridge_subparsers.add_parser("health", help="Health check for blockchain event bridge service")
|
||||
bridge_health_parser.add_argument("--test-mode", action="store_true")
|
||||
bridge_health_parser.set_defaults(handler=handle_bridge_health)
|
||||
|
||||
bridge_metrics_parser = bridge_subparsers.add_parser("metrics", help="Get Prometheus metrics from blockchain event bridge service")
|
||||
bridge_metrics_parser.add_argument("--test-mode", action="store_true")
|
||||
bridge_metrics_parser.set_defaults(handler=handle_bridge_metrics)
|
||||
|
||||
bridge_status_parser = bridge_subparsers.add_parser("status", help="Get detailed status of blockchain event bridge service")
|
||||
bridge_status_parser.add_argument("--test-mode", action="store_true")
|
||||
bridge_status_parser.set_defaults(handler=handle_bridge_status)
|
||||
|
||||
bridge_config_parser = bridge_subparsers.add_parser("config", help="Show current configuration of blockchain event bridge service")
|
||||
bridge_config_parser.add_argument("--test-mode", action="store_true")
|
||||
bridge_config_parser.set_defaults(handler=handle_bridge_config)
|
||||
|
||||
bridge_restart_parser = bridge_subparsers.add_parser("restart", help="Restart blockchain event bridge service (via systemd)")
|
||||
bridge_restart_parser.add_argument("--test-mode", action="store_true")
|
||||
bridge_restart_parser.set_defaults(handler=handle_bridge_restart)
|
||||
|
||||
parsed_args = parser.parse_args(normalize_legacy_args(list(sys.argv[1:] if argv is None else argv)))
|
||||
if not getattr(parsed_args, "command", None):
|
||||
parser.print_help()
|
||||
return
|
||||
handler = getattr(parsed_args, "handler", None)
|
||||
if handler is None:
|
||||
parser.print_help()
|
||||
return
|
||||
handler(parsed_args)
|
||||
if __name__ == "__main__":
|
||||
raise SystemExit(main())
|
||||
|
||||
Reference in New Issue
Block a user