kailash 0.9.14__tar.gz → 0.9.15__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {kailash-0.9.14/src/kailash.egg-info → kailash-0.9.15}/PKG-INFO +1 -1
- {kailash-0.9.14 → kailash-0.9.15}/pyproject.toml +1 -1
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/__init__.py +1 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/cli/validate_imports.py +1 -1
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/ml/query_patterns.py +2 -2
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/resource/platform_integration.py +1 -4
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/integrations/dataflow_edge.py +2 -2
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/database/base_models.py +1 -7
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/monitoring/alerts.py +2 -2
- kailash-0.9.15/src/kailash/nodes/__init__.py +229 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/iterative_llm_agent.py +2 -2
- kailash-0.9.15/src/kailash/utils/circular_dependency_detector.py +319 -0
- {kailash-0.9.14 → kailash-0.9.15/src/kailash.egg-info}/PKG-INFO +1 -1
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash.egg-info/SOURCES.txt +2 -0
- {kailash-0.9.14 → kailash-0.9.15}/LICENSE +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/MANIFEST.in +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/NOTICE +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/README.md +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/setup.cfg +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/setup.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/__main__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/access_control/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/access_control/managers.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/access_control/rule_evaluators.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/access_control.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/access_control_abac.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/adapters/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/adapters/mcp_platform_adapter.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/analysis/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/analysis/conditional_branch_analyzer.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/api/auth.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/api/custom_nodes.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/api/custom_nodes_secure.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/api/gateway.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/api/mcp_integration.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/api/studio.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/api/workflow_api.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/channels/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/channels/api_channel.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/channels/base.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/channels/cli_channel.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/channels/event_router.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/channels/mcp_channel.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/channels/session.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/cli/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/cli/commands.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/cli/validation_audit.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/client/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/client/enhanced_client.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/config/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/config/database_config.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/actors/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/actors/adaptive_pool_controller.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/actors/connection_actor.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/actors/supervisor.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/ml/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/monitoring/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/monitoring/connection_metrics.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/optimization/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/resilience/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/resilience/bulkhead.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/resilience/circuit_breaker.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/core/resilience/health_monitor.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/database/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/database/execution_pipeline.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/compliance.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/consistency.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/coordination/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/coordination/global_ordering.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/coordination/leader_election.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/coordination/partition_detector.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/coordination/raft.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/discovery.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/location.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/migration/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/migration/edge_migration_service.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/migration/edge_migrator.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/monitoring/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/monitoring/edge_monitor.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/prediction/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/prediction/predictive_warmer.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/resource/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/resource/cloud_integration.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/resource/cost_optimizer.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/resource/docker_integration.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/resource/kubernetes_integration.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/resource/predictive_scaler.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/resource/resource_analyzer.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/edge/resource/resource_pools.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/gateway/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/gateway/api.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/gateway/enhanced_gateway.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/gateway/resource_resolver.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/gateway/security.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/manifest.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/advanced_features.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/ai_registry_server.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/auth.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/client.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/client_new.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/discovery.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/errors.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/oauth.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/protocol.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/registry_integration.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/server.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/servers/ai_registry.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/subscriptions.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/transports.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/utils/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/utils/cache.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/utils/config.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/utils/formatters.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/mcp_server/utils/metrics.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/auth/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/auth/access_control.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/auth/auth_manager.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/auth/exceptions.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/auth/jwt_auth.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/auth/models.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/auth/utils.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/communication/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/communication/ai_chat.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/communication/api_gateway.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/communication/events.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/communication/realtime.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/core/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/core/agent_ui.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/core/schema.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/core/workflows.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/database/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/database/base.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/database/enums.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/database/migrations.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/database/models.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/database/repositories.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/database/session_manager.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/gateway/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/gateway/checkpoint_manager.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/gateway/deduplicator.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/gateway/durable_gateway.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/gateway/durable_request.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/gateway/event_store.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/gateway/storage_backends.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/mcp/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/mcp/client_integration.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/middleware/mcp/enhanced_server.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/monitoring/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/monitoring/metrics.py +0 -0
- /kailash-0.9.14/src/kailash/nodes/__init__.py → /kailash-0.9.15/src/kailash/nodes/__init___original.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/admin/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/admin/audit_log.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/admin/permission_check.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/admin/role_management.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/admin/schema.sql +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/admin/schema_manager.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/admin/security_event.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/admin/tenant_isolation.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/admin/transaction_utils.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/admin/user_management.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/a2a.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/a2a_backup.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/agents.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/ai_providers.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/embedding_generator.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/hybrid_search.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/intelligent_agent_orchestrator.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/llm_agent.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/models.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/self_organizing.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/semantic_memory.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/streaming_analytics.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ai/vision_utils.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/alerts/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/alerts/base.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/alerts/discord.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/api/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/api/auth.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/api/graphql.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/api/http.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/api/monitoring.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/api/rate_limiting.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/api/rest.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/api/security.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/auth/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/auth/directory_integration.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/auth/enterprise_auth_provider.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/auth/mfa.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/auth/risk_assessment.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/auth/session_management.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/auth/sso.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/base.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/base_async.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/base_cycle_aware.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/base_with_acl.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/cache/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/cache/cache.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/cache/cache_invalidation.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/cache/redis_pool_manager.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/code/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/code/async_python.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/code/python.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/compliance/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/compliance/data_retention.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/compliance/gdpr.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/async_connection.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/async_sql.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/async_vector.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/bulk_operations.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/directory.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/event_generation.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/file_discovery.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/optimistic_locking.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/query_builder.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/query_cache.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/query_pipeline.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/query_router.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/readers.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/redis.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/retrieval.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/sharepoint_graph.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/sources.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/sql.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/streaming.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/vector_db.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/workflow_connection_pool.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/data/writers.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/base.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/cloud_node.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/coordination.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/docker_node.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/edge_data.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/edge_migration_node.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/edge_monitoring_node.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/edge_state.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/edge_warming_node.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/kubernetes_node.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/platform_node.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/resource_analyzer_node.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/resource_optimizer_node.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/edge/resource_scaler_node.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/enterprise/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/enterprise/audit_logger.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/enterprise/batch_processor.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/enterprise/data_lineage.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/enterprise/mcp_executor.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/enterprise/service_discovery.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/enterprise/tenant_assignment.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/governance.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/logic/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/logic/async_operations.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/logic/convergence.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/logic/intelligent_merge.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/logic/loop.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/logic/operations.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/logic/workflow.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/mixins/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/mixins/event_emitter.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/mixins/mcp.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/mixins/security.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/mixins.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/monitoring/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/monitoring/connection_dashboard.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/monitoring/deadlock_detector.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/monitoring/health_check.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/monitoring/log_processor.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/monitoring/metrics_collector.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/monitoring/performance_anomaly.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/monitoring/performance_benchmark.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/monitoring/race_condition_detector.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/monitoring/transaction_metrics.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/monitoring/transaction_monitor.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/ports.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/advanced.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/agentic.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/conversational.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/evaluation.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/federated.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/graph.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/multimodal.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/optimized.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/privacy.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/query_processing.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/realtime.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/registry.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/router.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/similarity.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/strategies.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/rag/workflows.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/security/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/security/abac_evaluator.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/security/audit_log.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/security/behavior_analysis.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/security/credential_manager.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/security/rotating_credentials.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/security/security_event.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/security/threat_detection.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/system/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/system/command_parser.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/testing/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/testing/credential_testing.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/transaction/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/transaction/distributed_transaction_manager.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/transaction/saga_coordinator.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/transaction/saga_state_storage.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/transaction/saga_step.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/transaction/transaction_context.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/transaction/two_phase_commit.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/transform/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/transform/chunkers.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/transform/formatters.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/transform/processors.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/validation/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/validation/test_executor.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/validation/validation_nodes.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/nodes/validation.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/planning/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/planning/dynamic_execution_planner.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/resources/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/resources/factory.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/resources/health.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/resources/reference.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/resources/registry.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/access_controlled.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/async_local.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/compatibility_reporter.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/docker.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/hierarchical_switch_executor.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/local.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/parallel.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/parallel_cyclic.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/parameter_injection.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/parameter_injector.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/performance_monitor.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/runner.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/secret_provider.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/testing.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/validation/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/validation/connection_context.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/validation/enhanced_error_formatter.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/validation/error_categorizer.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/validation/import_validator.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/validation/metrics.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/validation/performance.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/runtime/validation/suggestion_engine.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/sdk_exceptions.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/security.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/servers/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/servers/durable_workflow_server.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/servers/enterprise_workflow_server.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/servers/gateway.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/servers/workflow_server.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/testing/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/testing/async_test_case.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/testing/async_utils.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/testing/fixtures.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/testing/mock_registry.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/tracking/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/tracking/manager.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/tracking/metrics_collector.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/tracking/models.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/tracking/storage/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/tracking/storage/base.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/tracking/storage/database.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/tracking/storage/filesystem.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/utils/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/utils/data_paths.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/utils/data_validation.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/utils/export.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/utils/migrations/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/utils/migrations/generator.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/utils/migrations/models.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/utils/migrations/runner.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/utils/resource_manager.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/utils/secure_logging.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/utils/templates.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/visualization/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/visualization/api.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/visualization/dashboard.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/visualization/performance.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/visualization/reports.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/__init__.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/async_builder.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/async_patterns.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/builder.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/contracts.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/convergence.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/cycle_analyzer.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/cycle_builder.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/cycle_config.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/cycle_debugger.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/cycle_exceptions.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/cycle_profiler.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/cycle_state.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/cyclic_runner.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/edge_infrastructure.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/graph.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/input_handling.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/mermaid_visualizer.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/migration.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/mock_registry.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/resilience.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/runner.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/safety.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/state.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/templates.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/type_inference.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/validation.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash/workflow/visualization.py +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash.egg-info/dependency_links.txt +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash.egg-info/entry_points.txt +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash.egg-info/not-zip-safe +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash.egg-info/requires.txt +0 -0
- {kailash-0.9.14 → kailash-0.9.15}/src/kailash.egg-info/top_level.txt +0 -0
@@ -6,6 +6,7 @@ that align with container-node architecture while allowing rapid prototyping.
|
|
6
6
|
New in v0.9.14: Code quality improvements and updated dependencies for DataFlow v0.4.6 compatibility.
|
7
7
|
Applied black formatting fixes and ensured CI stability. Updated dependency references to latest framework versions.
|
8
8
|
Previous v0.9.13: Fixed WorkflowBuilder parameter validation false positives (Bug 010).
|
9
|
+
Enhanced validation.py to recognize auto_map_from parameters, eliminating spurious warnings.
|
9
10
|
Previous v0.9.12: SQLite Compatibility & Code Quality improvements.
|
10
11
|
Previous v0.9.2: WebSocket Transport Support with Enterprise Connection Pooling.
|
11
12
|
Fixed "Unsupported transport: websocket" error. Added 73% performance improvement with connection pooling.
|
@@ -38,7 +38,7 @@ Examples:
|
|
38
38
|
%(prog)s src/myapp # Validate specific directory
|
39
39
|
%(prog)s src/myapp --fix # Show import fixes (dry run)
|
40
40
|
%(prog)s --file module.py # Validate single file
|
41
|
-
|
41
|
+
|
42
42
|
For more info, see: sdk-users/7-gold-standards/absolute-imports-gold-standard.md
|
43
43
|
""",
|
44
44
|
)
|
@@ -59,8 +59,8 @@ class QueryPatternTracker:
|
|
59
59
|
"""Tracks and analyzes query execution patterns."""
|
60
60
|
|
61
61
|
def __init__(
|
62
|
-
self, retention_hours: int = 168, min_pattern_frequency: int = 5
|
63
|
-
):
|
62
|
+
self, retention_hours: int = 168, min_pattern_frequency: int = 5
|
63
|
+
): # 7 days
|
64
64
|
self.retention_hours = retention_hours
|
65
65
|
self.min_pattern_frequency = min_pattern_frequency
|
66
66
|
|
@@ -14,10 +14,7 @@ from .cloud_integration import (
|
|
14
14
|
InstanceState,
|
15
15
|
)
|
16
16
|
from .cost_optimizer import CloudProvider as CostCloudProvider
|
17
|
-
from .cost_optimizer import
|
18
|
-
CostOptimizer,
|
19
|
-
OptimizationStrategy,
|
20
|
-
)
|
17
|
+
from .cost_optimizer import CostOptimizer, OptimizationStrategy
|
21
18
|
from .docker_integration import (
|
22
19
|
ContainerSpec,
|
23
20
|
ContainerState,
|
@@ -227,7 +227,7 @@ class SensitiveData:
|
|
227
227
|
user_id: int
|
228
228
|
personal_info: dict
|
229
229
|
location: str
|
230
|
-
|
230
|
+
|
231
231
|
__dataflow__ = {
|
232
232
|
'multi_tenant': True,
|
233
233
|
'soft_delete': True,
|
@@ -247,7 +247,7 @@ class SensitiveData:
|
|
247
247
|
|
248
248
|
# When using generated nodes in workflows:
|
249
249
|
workflow = WorkflowBuilder(edge_config=DataFlowEdgeIntegration.create_edge_workflow_config(
|
250
|
-
'SensitiveData',
|
250
|
+
'SensitiveData',
|
251
251
|
SensitiveData.__dataflow__['edge_config']
|
252
252
|
))
|
253
253
|
|
@@ -8,13 +8,7 @@ import uuid
|
|
8
8
|
from datetime import datetime, timezone
|
9
9
|
from typing import Any, Dict, List, Optional
|
10
10
|
|
11
|
-
from sqlalchemy import
|
12
|
-
JSON,
|
13
|
-
Boolean,
|
14
|
-
CheckConstraint,
|
15
|
-
Column,
|
16
|
-
DateTime,
|
17
|
-
)
|
11
|
+
from sqlalchemy import JSON, Boolean, CheckConstraint, Column, DateTime
|
18
12
|
from sqlalchemy import Enum as SQLEnum
|
19
13
|
from sqlalchemy import (
|
20
14
|
Float,
|
@@ -260,12 +260,12 @@ class EmailNotificationChannel(NotificationChannel):
|
|
260
260
|
<p><strong>Status:</strong> {alert.status.value}</p>
|
261
261
|
<p><strong>Description:</strong> {alert.description}</p>
|
262
262
|
<p><strong>Created:</strong> {alert.created_at.isoformat()}</p>
|
263
|
-
|
263
|
+
|
264
264
|
<h3>Labels:</h3>
|
265
265
|
<ul>
|
266
266
|
{"".join(f"<li><strong>{k}:</strong> {v}</li>" for k, v in alert.labels.items())}
|
267
267
|
</ul>
|
268
|
-
|
268
|
+
|
269
269
|
<h3>Context:</h3>
|
270
270
|
<ul>
|
271
271
|
{"".join(f"<li><strong>{k}:</strong> {v}</li>" for k, v in context.items())}
|
@@ -0,0 +1,229 @@
|
|
1
|
+
"""
|
2
|
+
Kailash SDK Nodes Module - Safe Lazy Loading Implementation
|
3
|
+
|
4
|
+
This implementation provides lazy loading with circular dependency protection
|
5
|
+
and maintains full backward compatibility.
|
6
|
+
"""
|
7
|
+
|
8
|
+
import importlib
|
9
|
+
import sys
|
10
|
+
import warnings
|
11
|
+
from typing import Any, Dict, Optional, Set
|
12
|
+
|
13
|
+
# Core imports that are always needed
|
14
|
+
from .base import Node, NodeParameter, NodeRegistry
|
15
|
+
|
16
|
+
# Track loading state to detect circular dependencies
|
17
|
+
_LOADING_STACK: Set[str] = set()
|
18
|
+
_LOADED_MODULES: Dict[str, Optional[Any]] = {}
|
19
|
+
|
20
|
+
# Define available node categories for lazy loading
|
21
|
+
_NODE_CATEGORIES = [
|
22
|
+
"ai",
|
23
|
+
"alerts",
|
24
|
+
"api",
|
25
|
+
"auth",
|
26
|
+
"cache",
|
27
|
+
"code",
|
28
|
+
"compliance",
|
29
|
+
"data",
|
30
|
+
"edge",
|
31
|
+
"enterprise",
|
32
|
+
"logic",
|
33
|
+
"mixins",
|
34
|
+
"monitoring",
|
35
|
+
"rag",
|
36
|
+
"security",
|
37
|
+
"testing",
|
38
|
+
"transaction",
|
39
|
+
"transform",
|
40
|
+
]
|
41
|
+
|
42
|
+
# Initialize lazy module cache
|
43
|
+
_LAZY_MODULES: Dict[str, Optional[Any]] = {
|
44
|
+
category: None for category in _NODE_CATEGORIES
|
45
|
+
}
|
46
|
+
|
47
|
+
|
48
|
+
def _safe_lazy_import(name: str) -> Any:
|
49
|
+
"""
|
50
|
+
Safely import a module with circular dependency detection.
|
51
|
+
|
52
|
+
Args:
|
53
|
+
name: The module name to import
|
54
|
+
|
55
|
+
Returns:
|
56
|
+
The imported module
|
57
|
+
|
58
|
+
Raises:
|
59
|
+
ImportError: If a circular dependency is detected
|
60
|
+
"""
|
61
|
+
full_module_name = f"kailash.nodes.{name}"
|
62
|
+
|
63
|
+
# Check if already loaded
|
64
|
+
if name in _LOADED_MODULES:
|
65
|
+
return _LOADED_MODULES[name]
|
66
|
+
|
67
|
+
# Check for circular dependency
|
68
|
+
if full_module_name in _LOADING_STACK:
|
69
|
+
cycle_modules = list(_LOADING_STACK) + [full_module_name]
|
70
|
+
warnings.warn(
|
71
|
+
f"Circular dependency detected: {' -> '.join(cycle_modules)}. "
|
72
|
+
f"Using partial import to break the cycle.",
|
73
|
+
ImportWarning,
|
74
|
+
stacklevel=3,
|
75
|
+
)
|
76
|
+
# Return a placeholder that will be populated after loading
|
77
|
+
module = sys.modules.get(full_module_name)
|
78
|
+
if module:
|
79
|
+
return module
|
80
|
+
# Create empty module as placeholder
|
81
|
+
module = type(sys)("placeholder")
|
82
|
+
sys.modules[full_module_name] = module
|
83
|
+
return module
|
84
|
+
|
85
|
+
# Add to loading stack
|
86
|
+
_LOADING_STACK.add(full_module_name)
|
87
|
+
|
88
|
+
try:
|
89
|
+
# Perform the actual import
|
90
|
+
module = importlib.import_module(f".{name}", package="kailash.nodes")
|
91
|
+
_LOADED_MODULES[name] = module
|
92
|
+
return module
|
93
|
+
finally:
|
94
|
+
# Remove from loading stack
|
95
|
+
_LOADING_STACK.discard(full_module_name)
|
96
|
+
|
97
|
+
|
98
|
+
def __getattr__(name: str) -> Any:
|
99
|
+
"""
|
100
|
+
Lazy loading of node category modules with circular dependency protection.
|
101
|
+
|
102
|
+
This function is called when accessing an attribute that doesn't exist
|
103
|
+
in the module's namespace. It enables lazy loading of node categories
|
104
|
+
while detecting and handling circular dependencies.
|
105
|
+
|
106
|
+
Args:
|
107
|
+
name: The attribute name being accessed
|
108
|
+
|
109
|
+
Returns:
|
110
|
+
The requested module or attribute
|
111
|
+
|
112
|
+
Raises:
|
113
|
+
AttributeError: If the attribute doesn't exist
|
114
|
+
"""
|
115
|
+
# Check if it's a known node category
|
116
|
+
if name in _LAZY_MODULES:
|
117
|
+
if _LAZY_MODULES[name] is None:
|
118
|
+
try:
|
119
|
+
# Use safe import with circular dependency detection
|
120
|
+
_LAZY_MODULES[name] = _safe_lazy_import(name)
|
121
|
+
except ImportError as e:
|
122
|
+
# Log the error and re-raise
|
123
|
+
import logging
|
124
|
+
|
125
|
+
logging.error(f"Failed to import kailash.nodes.{name}: {e}")
|
126
|
+
raise
|
127
|
+
return _LAZY_MODULES[name]
|
128
|
+
|
129
|
+
# Handle special attributes
|
130
|
+
if name == "__all__":
|
131
|
+
return ["Node", "NodeParameter", "NodeRegistry"] + _NODE_CATEGORIES
|
132
|
+
|
133
|
+
# Attribute not found
|
134
|
+
raise AttributeError(f"module 'kailash.nodes' has no attribute '{name}'")
|
135
|
+
|
136
|
+
|
137
|
+
def __dir__():
|
138
|
+
"""Return the list of available attributes for tab completion."""
|
139
|
+
return ["Node", "NodeParameter", "NodeRegistry"] + _NODE_CATEGORIES
|
140
|
+
|
141
|
+
|
142
|
+
def check_circular_dependencies() -> Dict[str, Any]:
|
143
|
+
"""
|
144
|
+
Check for circular dependencies in the nodes module.
|
145
|
+
|
146
|
+
Returns:
|
147
|
+
A dictionary containing:
|
148
|
+
- has_circular_deps: Boolean indicating if circular deps exist
|
149
|
+
- circular_chains: List of circular dependency chains found
|
150
|
+
- warnings: List of warning messages
|
151
|
+
"""
|
152
|
+
from pathlib import Path
|
153
|
+
|
154
|
+
from ..utils.circular_dependency_detector import CircularDependencyDetector
|
155
|
+
|
156
|
+
# Get the SDK root directory
|
157
|
+
sdk_root = Path(__file__).parent.parent.parent
|
158
|
+
|
159
|
+
detector = CircularDependencyDetector(sdk_root)
|
160
|
+
detector.build_import_graph("src/kailash/nodes")
|
161
|
+
cycles = detector.detect_cycles()
|
162
|
+
|
163
|
+
result = {
|
164
|
+
"has_circular_deps": bool(cycles),
|
165
|
+
"circular_chains": cycles,
|
166
|
+
"warnings": [],
|
167
|
+
}
|
168
|
+
|
169
|
+
if cycles:
|
170
|
+
for cycle in cycles:
|
171
|
+
result["warnings"].append(
|
172
|
+
f"Circular dependency detected: {' -> '.join(cycle)} -> {cycle[0]}"
|
173
|
+
)
|
174
|
+
|
175
|
+
return result
|
176
|
+
|
177
|
+
|
178
|
+
def preload_all_categories():
|
179
|
+
"""
|
180
|
+
Preload all node categories (useful for testing or warming up).
|
181
|
+
|
182
|
+
This function loads all node categories immediately rather than lazily.
|
183
|
+
It's useful for:
|
184
|
+
- Testing that all imports work correctly
|
185
|
+
- Warming up the import cache
|
186
|
+
- Detecting circular dependencies early
|
187
|
+
"""
|
188
|
+
failed_imports = []
|
189
|
+
|
190
|
+
for category in _NODE_CATEGORIES:
|
191
|
+
try:
|
192
|
+
_safe_lazy_import(category)
|
193
|
+
except ImportError as e:
|
194
|
+
failed_imports.append((category, str(e)))
|
195
|
+
|
196
|
+
if failed_imports:
|
197
|
+
warnings.warn(
|
198
|
+
f"Failed to import some categories: {failed_imports}", ImportWarning
|
199
|
+
)
|
200
|
+
|
201
|
+
return {
|
202
|
+
"loaded": [cat for cat in _NODE_CATEGORIES if cat in _LOADED_MODULES],
|
203
|
+
"failed": failed_imports,
|
204
|
+
}
|
205
|
+
|
206
|
+
|
207
|
+
# Performance monitoring
|
208
|
+
def get_import_stats() -> Dict[str, Any]:
|
209
|
+
"""
|
210
|
+
Get statistics about module imports.
|
211
|
+
|
212
|
+
Returns:
|
213
|
+
Dictionary containing import statistics
|
214
|
+
"""
|
215
|
+
return {
|
216
|
+
"loaded_modules": list(_LOADED_MODULES.keys()),
|
217
|
+
"pending_modules": [
|
218
|
+
cat for cat in _NODE_CATEGORIES if cat not in _LOADED_MODULES
|
219
|
+
],
|
220
|
+
"total_categories": len(_NODE_CATEGORIES),
|
221
|
+
"loaded_count": len(_LOADED_MODULES),
|
222
|
+
"currently_loading": list(_LOADING_STACK),
|
223
|
+
}
|
224
|
+
|
225
|
+
|
226
|
+
# Backward compatibility - ensure all existing imports work
|
227
|
+
__all__ = ["Node", "NodeParameter", "NodeRegistry"] + _NODE_CATEGORIES
|
228
|
+
|
229
|
+
# Export core components directly
|
@@ -1666,7 +1666,7 @@ class IterativeLLMAgentNode(LLMAgentNode):
|
|
1666
1666
|
synthesis_messages = [
|
1667
1667
|
{
|
1668
1668
|
"role": "system",
|
1669
|
-
"content": """You are an AI assistant synthesizing results from an iterative analysis process.
|
1669
|
+
"content": """You are an AI assistant synthesizing results from an iterative analysis process.
|
1670
1670
|
Create a comprehensive, helpful response based on the findings from multiple iterations of analysis.""",
|
1671
1671
|
},
|
1672
1672
|
{
|
@@ -1679,7 +1679,7 @@ Results from {len(iterations)} iterations:
|
|
1679
1679
|
Insights achieved:
|
1680
1680
|
{chr(10).join(all_insights[:5]) if all_insights else "No specific insights achieved"}
|
1681
1681
|
|
1682
|
-
Please provide a comprehensive response to the original query based on these findings. If the findings are limited,
|
1682
|
+
Please provide a comprehensive response to the original query based on these findings. If the findings are limited,
|
1683
1683
|
provide your best analysis of the query directly.""",
|
1684
1684
|
},
|
1685
1685
|
]
|
@@ -0,0 +1,319 @@
|
|
1
|
+
"""
|
2
|
+
Circular Dependency Detector for Kailash SDK
|
3
|
+
|
4
|
+
This module provides tools to detect and report circular dependencies in the codebase,
|
5
|
+
ensuring that lazy loading doesn't mask architectural issues.
|
6
|
+
"""
|
7
|
+
|
8
|
+
import ast
|
9
|
+
import importlib
|
10
|
+
import os
|
11
|
+
import sys
|
12
|
+
from collections import defaultdict, deque
|
13
|
+
from pathlib import Path
|
14
|
+
from typing import Dict, List, Optional, Set, Tuple
|
15
|
+
|
16
|
+
|
17
|
+
class CircularDependencyDetector:
|
18
|
+
"""Detects circular dependencies in Python modules."""
|
19
|
+
|
20
|
+
def __init__(self, root_path: str):
|
21
|
+
"""Initialize the detector with the root path of the codebase."""
|
22
|
+
self.root_path = Path(root_path)
|
23
|
+
self.import_graph: Dict[str, Set[str]] = defaultdict(set)
|
24
|
+
self.visited_files: Set[str] = set()
|
25
|
+
self.circular_deps: List[List[str]] = []
|
26
|
+
|
27
|
+
def analyze_file(self, file_path: Path) -> Set[str]:
|
28
|
+
"""Extract all imports from a Python file."""
|
29
|
+
imports = set()
|
30
|
+
|
31
|
+
try:
|
32
|
+
with open(file_path, "r", encoding="utf-8") as f:
|
33
|
+
tree = ast.parse(f.read(), str(file_path))
|
34
|
+
|
35
|
+
for node in ast.walk(tree):
|
36
|
+
if isinstance(node, ast.Import):
|
37
|
+
for alias in node.names:
|
38
|
+
imports.add(alias.name)
|
39
|
+
elif isinstance(node, ast.ImportFrom):
|
40
|
+
if node.module:
|
41
|
+
# Handle relative imports
|
42
|
+
if node.level > 0:
|
43
|
+
# Relative import
|
44
|
+
module_parts = (
|
45
|
+
str(file_path.relative_to(self.root_path))
|
46
|
+
.replace(".py", "")
|
47
|
+
.split("/")
|
48
|
+
)
|
49
|
+
parent_parts = (
|
50
|
+
module_parts[: -node.level]
|
51
|
+
if node.level < len(module_parts)
|
52
|
+
else []
|
53
|
+
)
|
54
|
+
if node.module:
|
55
|
+
full_module = ".".join(
|
56
|
+
parent_parts + node.module.split(".")
|
57
|
+
)
|
58
|
+
else:
|
59
|
+
full_module = ".".join(parent_parts)
|
60
|
+
imports.add(full_module.replace("/", "."))
|
61
|
+
else:
|
62
|
+
imports.add(node.module)
|
63
|
+
|
64
|
+
except (SyntaxError, FileNotFoundError) as e:
|
65
|
+
print(f"Error analyzing {file_path}: {e}")
|
66
|
+
|
67
|
+
return imports
|
68
|
+
|
69
|
+
def build_import_graph(self, start_dir: str = "src/kailash"):
|
70
|
+
"""Build the complete import dependency graph."""
|
71
|
+
start_path = self.root_path / start_dir
|
72
|
+
|
73
|
+
for py_file in start_path.rglob("*.py"):
|
74
|
+
# Skip test files and __pycache__
|
75
|
+
if "__pycache__" in str(py_file) or "test_" in py_file.name:
|
76
|
+
continue
|
77
|
+
|
78
|
+
module_name = self._path_to_module(py_file)
|
79
|
+
imports = self.analyze_file(py_file)
|
80
|
+
|
81
|
+
# Filter to only internal imports
|
82
|
+
internal_imports = {
|
83
|
+
imp
|
84
|
+
for imp in imports
|
85
|
+
if imp.startswith("kailash") or imp.startswith(".")
|
86
|
+
}
|
87
|
+
|
88
|
+
self.import_graph[module_name].update(internal_imports)
|
89
|
+
|
90
|
+
def _path_to_module(self, file_path: Path) -> str:
|
91
|
+
"""Convert file path to module name."""
|
92
|
+
relative = file_path.relative_to(self.root_path / "src")
|
93
|
+
module = str(relative).replace(".py", "").replace("/", ".")
|
94
|
+
return module
|
95
|
+
|
96
|
+
def detect_cycles(self) -> List[List[str]]:
|
97
|
+
"""Detect all circular dependencies using DFS."""
|
98
|
+
visited = set()
|
99
|
+
rec_stack = set()
|
100
|
+
path = []
|
101
|
+
cycles = []
|
102
|
+
|
103
|
+
def dfs(module: str) -> bool:
|
104
|
+
visited.add(module)
|
105
|
+
rec_stack.add(module)
|
106
|
+
path.append(module)
|
107
|
+
|
108
|
+
for imported in self.import_graph.get(module, set()):
|
109
|
+
if imported not in visited:
|
110
|
+
if dfs(imported):
|
111
|
+
return True
|
112
|
+
elif imported in rec_stack:
|
113
|
+
# Found a cycle
|
114
|
+
cycle_start = path.index(imported)
|
115
|
+
cycle = path[cycle_start:] + [imported]
|
116
|
+
cycles.append(cycle)
|
117
|
+
|
118
|
+
path.pop()
|
119
|
+
rec_stack.remove(module)
|
120
|
+
return False
|
121
|
+
|
122
|
+
for module in self.import_graph:
|
123
|
+
if module not in visited:
|
124
|
+
dfs(module)
|
125
|
+
|
126
|
+
# Remove duplicate cycles
|
127
|
+
unique_cycles = []
|
128
|
+
seen = set()
|
129
|
+
for cycle in cycles:
|
130
|
+
# Normalize cycle to start with smallest element
|
131
|
+
min_idx = cycle.index(min(cycle))
|
132
|
+
normalized = tuple(cycle[min_idx:] + cycle[:min_idx])
|
133
|
+
if normalized not in seen:
|
134
|
+
seen.add(normalized)
|
135
|
+
unique_cycles.append(
|
136
|
+
list(normalized)[:-1]
|
137
|
+
) # Remove duplicate last element
|
138
|
+
|
139
|
+
return unique_cycles
|
140
|
+
|
141
|
+
def check_lazy_loading_safety(self, module_path: str) -> Dict[str, any]:
|
142
|
+
"""Check if lazy loading is safe for a given module."""
|
143
|
+
result = {
|
144
|
+
"module": module_path,
|
145
|
+
"has_circular_deps": False,
|
146
|
+
"circular_chains": [],
|
147
|
+
"safe_for_lazy_loading": True,
|
148
|
+
"warnings": [],
|
149
|
+
}
|
150
|
+
|
151
|
+
# Check if module is involved in any circular dependencies
|
152
|
+
for cycle in self.circular_deps:
|
153
|
+
if module_path in cycle:
|
154
|
+
result["has_circular_deps"] = True
|
155
|
+
result["circular_chains"].append(cycle)
|
156
|
+
result["safe_for_lazy_loading"] = False
|
157
|
+
result["warnings"].append(
|
158
|
+
f"Module is part of circular dependency: {' -> '.join(cycle)}"
|
159
|
+
)
|
160
|
+
|
161
|
+
return result
|
162
|
+
|
163
|
+
def generate_report(self) -> str:
|
164
|
+
"""Generate a comprehensive circular dependency report."""
|
165
|
+
self.build_import_graph()
|
166
|
+
self.circular_deps = self.detect_cycles()
|
167
|
+
|
168
|
+
report = []
|
169
|
+
report.append("=" * 80)
|
170
|
+
report.append("CIRCULAR DEPENDENCY ANALYSIS REPORT")
|
171
|
+
report.append("=" * 80)
|
172
|
+
report.append("")
|
173
|
+
|
174
|
+
if not self.circular_deps:
|
175
|
+
report.append("✅ No circular dependencies detected!")
|
176
|
+
else:
|
177
|
+
report.append(
|
178
|
+
f"⚠️ Found {len(self.circular_deps)} circular dependency chains:"
|
179
|
+
)
|
180
|
+
report.append("")
|
181
|
+
|
182
|
+
for i, cycle in enumerate(self.circular_deps, 1):
|
183
|
+
report.append(f"{i}. Circular dependency chain:")
|
184
|
+
report.append(f" {' -> '.join(cycle)} -> {cycle[0]}")
|
185
|
+
report.append("")
|
186
|
+
|
187
|
+
# Analyze specific high-risk modules
|
188
|
+
high_risk_modules = [
|
189
|
+
"kailash.nodes.ai.a2a",
|
190
|
+
"kailash.nodes.ai.self_organizing",
|
191
|
+
"kailash.nodes.ai.intelligent_agent_orchestrator",
|
192
|
+
"kailash.nodes.__init__",
|
193
|
+
]
|
194
|
+
|
195
|
+
report.append("-" * 80)
|
196
|
+
report.append("HIGH-RISK MODULE ANALYSIS")
|
197
|
+
report.append("-" * 80)
|
198
|
+
|
199
|
+
for module in high_risk_modules:
|
200
|
+
safety = self.check_lazy_loading_safety(module)
|
201
|
+
if safety["has_circular_deps"]:
|
202
|
+
report.append(f"\n❌ {module}:")
|
203
|
+
for warning in safety["warnings"]:
|
204
|
+
report.append(f" - {warning}")
|
205
|
+
else:
|
206
|
+
report.append(f"\n✅ {module}: No circular dependencies")
|
207
|
+
|
208
|
+
report.append("")
|
209
|
+
report.append("=" * 80)
|
210
|
+
|
211
|
+
return "\n".join(report)
|
212
|
+
|
213
|
+
|
214
|
+
class CircularImportResolver:
|
215
|
+
"""Provides solutions for resolving circular dependencies."""
|
216
|
+
|
217
|
+
@staticmethod
|
218
|
+
def create_lazy_import_wrapper(
|
219
|
+
module_name: str, attribute_name: Optional[str] = None
|
220
|
+
) -> str:
|
221
|
+
"""Generate code for a lazy import wrapper."""
|
222
|
+
if attribute_name:
|
223
|
+
return f"""
|
224
|
+
def get_{attribute_name}():
|
225
|
+
\"\"\"Lazy import of {module_name}.{attribute_name}\"\"\"
|
226
|
+
from {module_name} import {attribute_name}
|
227
|
+
return {attribute_name}
|
228
|
+
"""
|
229
|
+
else:
|
230
|
+
return f"""
|
231
|
+
def get_{module_name.split('.')[-1]}():
|
232
|
+
\"\"\"Lazy import of {module_name}\"\"\"
|
233
|
+
import {module_name}
|
234
|
+
return {module_name}
|
235
|
+
"""
|
236
|
+
|
237
|
+
@staticmethod
|
238
|
+
def create_type_checking_import(module_name: str, types: List[str]) -> str:
|
239
|
+
"""Generate code for TYPE_CHECKING imports to avoid runtime circular deps."""
|
240
|
+
return f"""
|
241
|
+
from typing import TYPE_CHECKING
|
242
|
+
|
243
|
+
if TYPE_CHECKING:
|
244
|
+
from {module_name} import {', '.join(types)}
|
245
|
+
"""
|
246
|
+
|
247
|
+
@staticmethod
|
248
|
+
def suggest_refactoring(cycles: List[List[str]]) -> List[str]:
|
249
|
+
"""Suggest refactoring strategies for circular dependencies."""
|
250
|
+
suggestions = []
|
251
|
+
|
252
|
+
for cycle in cycles:
|
253
|
+
if len(cycle) == 2:
|
254
|
+
suggestions.append(
|
255
|
+
f"""
|
256
|
+
Circular dependency between {cycle[0]} and {cycle[1]}:
|
257
|
+
1. Extract shared functionality to a common base module
|
258
|
+
2. Use dependency injection instead of direct imports
|
259
|
+
3. Consider if one module should be a submodule of the other
|
260
|
+
"""
|
261
|
+
)
|
262
|
+
elif "ai" in str(cycle):
|
263
|
+
suggestions.append(
|
264
|
+
f"""
|
265
|
+
AI module circular dependency in {' -> '.join(cycle)}:
|
266
|
+
1. Create an ai.base module for shared components
|
267
|
+
2. Use factory pattern for agent creation
|
268
|
+
3. Move orchestration logic to a separate coordinator module
|
269
|
+
"""
|
270
|
+
)
|
271
|
+
else:
|
272
|
+
suggestions.append(
|
273
|
+
f"""
|
274
|
+
Complex circular dependency in {' -> '.join(cycle)}:
|
275
|
+
1. Apply Dependency Inversion Principle
|
276
|
+
2. Create interfaces/protocols for cross-module communication
|
277
|
+
3. Use event-driven architecture to decouple modules
|
278
|
+
"""
|
279
|
+
)
|
280
|
+
|
281
|
+
return suggestions
|
282
|
+
|
283
|
+
|
284
|
+
def main():
|
285
|
+
"""Run circular dependency detection on Kailash SDK."""
|
286
|
+
# Get the SDK root directory
|
287
|
+
sdk_root = Path(__file__).parent.parent.parent.parent
|
288
|
+
|
289
|
+
detector = CircularDependencyDetector(sdk_root)
|
290
|
+
report = detector.generate_report()
|
291
|
+
|
292
|
+
print(report)
|
293
|
+
|
294
|
+
if detector.circular_deps:
|
295
|
+
print("\n" + "=" * 80)
|
296
|
+
print("REFACTORING SUGGESTIONS")
|
297
|
+
print("=" * 80)
|
298
|
+
|
299
|
+
resolver = CircularImportResolver()
|
300
|
+
suggestions = resolver.suggest_refactoring(detector.circular_deps)
|
301
|
+
|
302
|
+
for i, suggestion in enumerate(suggestions, 1):
|
303
|
+
print(f"\n{i}. {suggestion}")
|
304
|
+
|
305
|
+
print("\n" + "=" * 80)
|
306
|
+
print("IMMEDIATE ACTION REQUIRED")
|
307
|
+
print("=" * 80)
|
308
|
+
print(
|
309
|
+
"""
|
310
|
+
1. Fix AI module circular dependencies (critical)
|
311
|
+
2. Clean up duplicate __init__.py files
|
312
|
+
3. Implement lazy loading WITH circular dependency checks
|
313
|
+
4. Add this detector to CI/CD pipeline
|
314
|
+
"""
|
315
|
+
)
|
316
|
+
|
317
|
+
|
318
|
+
if __name__ == "__main__":
|
319
|
+
main()
|