kailash 0.8.7__tar.gz → 0.9.1__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.8.7/src/kailash.egg-info → kailash-0.9.1}/PKG-INFO +1 -1
- {kailash-0.8.7 → kailash-0.9.1}/pyproject.toml +1 -1
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/__init__.py +4 -5
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/async_sql.py +32 -8
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/logic/operations.py +8 -4
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/local.py +102 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/cyclic_runner.py +68 -0
- {kailash-0.8.7 → kailash-0.9.1/src/kailash.egg-info}/PKG-INFO +1 -1
- {kailash-0.8.7 → kailash-0.9.1}/LICENSE +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/MANIFEST.in +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/README.md +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/setup.cfg +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/setup.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/__main__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/access_control/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/access_control/managers.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/access_control/rule_evaluators.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/access_control.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/access_control_abac.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/adapters/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/adapters/mcp_platform_adapter.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/api/auth.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/api/custom_nodes.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/api/custom_nodes_secure.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/api/gateway.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/api/mcp_integration.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/api/studio.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/api/workflow_api.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/channels/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/channels/api_channel.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/channels/base.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/channels/cli_channel.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/channels/event_router.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/channels/mcp_channel.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/channels/session.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/cli/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/cli/commands.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/cli/validate_imports.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/cli/validation_audit.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/client/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/client/enhanced_client.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/config/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/config/database_config.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/actors/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/actors/adaptive_pool_controller.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/actors/connection_actor.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/actors/supervisor.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/ml/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/ml/query_patterns.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/monitoring/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/monitoring/connection_metrics.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/optimization/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/resilience/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/resilience/bulkhead.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/resilience/circuit_breaker.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/core/resilience/health_monitor.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/database/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/database/execution_pipeline.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/compliance.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/consistency.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/coordination/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/coordination/global_ordering.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/coordination/leader_election.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/coordination/partition_detector.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/coordination/raft.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/discovery.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/location.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/migration/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/migration/edge_migration_service.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/migration/edge_migrator.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/monitoring/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/monitoring/edge_monitor.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/prediction/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/prediction/predictive_warmer.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/resource/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/resource/cloud_integration.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/resource/cost_optimizer.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/resource/docker_integration.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/resource/kubernetes_integration.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/resource/platform_integration.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/resource/predictive_scaler.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/resource/resource_analyzer.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/edge/resource/resource_pools.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/gateway/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/gateway/api.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/gateway/enhanced_gateway.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/gateway/resource_resolver.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/gateway/security.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/integrations/dataflow_edge.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/manifest.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/advanced_features.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/ai_registry_server.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/auth.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/client.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/client_new.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/discovery.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/errors.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/oauth.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/protocol.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/registry_integration.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/server.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/servers/ai_registry.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/subscriptions.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/transports.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/utils/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/utils/cache.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/utils/config.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/utils/formatters.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/mcp_server/utils/metrics.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/auth/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/auth/access_control.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/auth/auth_manager.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/auth/exceptions.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/auth/jwt_auth.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/auth/models.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/auth/utils.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/communication/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/communication/ai_chat.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/communication/api_gateway.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/communication/events.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/communication/realtime.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/core/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/core/agent_ui.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/core/schema.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/core/workflows.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/database/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/database/base.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/database/base_models.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/database/enums.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/database/migrations.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/database/models.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/database/repositories.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/database/session_manager.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/gateway/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/gateway/checkpoint_manager.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/gateway/deduplicator.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/gateway/durable_gateway.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/gateway/durable_request.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/gateway/event_store.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/gateway/storage_backends.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/mcp/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/mcp/client_integration.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/middleware/mcp/enhanced_server.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/monitoring/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/monitoring/alerts.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/monitoring/metrics.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/admin/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/admin/audit_log.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/admin/permission_check.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/admin/role_management.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/admin/schema.sql +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/admin/schema_manager.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/admin/security_event.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/admin/tenant_isolation.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/admin/transaction_utils.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/admin/user_management.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/a2a.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/a2a_backup.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/agents.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/ai_providers.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/embedding_generator.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/hybrid_search.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/intelligent_agent_orchestrator.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/iterative_llm_agent.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/llm_agent.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/models.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/self_organizing.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/semantic_memory.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/streaming_analytics.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ai/vision_utils.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/alerts/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/alerts/base.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/alerts/discord.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/api/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/api/auth.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/api/graphql.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/api/http.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/api/monitoring.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/api/rate_limiting.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/api/rest.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/api/security.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/auth/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/auth/directory_integration.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/auth/enterprise_auth_provider.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/auth/mfa.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/auth/risk_assessment.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/auth/session_management.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/auth/sso.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/base.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/base_async.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/base_cycle_aware.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/base_with_acl.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/cache/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/cache/cache.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/cache/cache_invalidation.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/cache/redis_pool_manager.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/code/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/code/async_python.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/code/python.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/compliance/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/compliance/data_retention.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/compliance/gdpr.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/async_connection.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/async_vector.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/bulk_operations.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/directory.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/event_generation.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/file_discovery.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/optimistic_locking.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/query_builder.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/query_cache.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/query_pipeline.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/query_router.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/readers.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/redis.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/retrieval.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/sharepoint_graph.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/sources.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/sql.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/streaming.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/vector_db.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/workflow_connection_pool.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/data/writers.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/base.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/cloud_node.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/coordination.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/docker_node.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/edge_data.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/edge_migration_node.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/edge_monitoring_node.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/edge_state.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/edge_warming_node.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/kubernetes_node.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/platform_node.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/resource_analyzer_node.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/resource_optimizer_node.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/edge/resource_scaler_node.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/enterprise/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/enterprise/audit_logger.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/enterprise/batch_processor.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/enterprise/data_lineage.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/enterprise/mcp_executor.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/enterprise/service_discovery.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/enterprise/tenant_assignment.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/governance.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/logic/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/logic/async_operations.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/logic/convergence.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/logic/loop.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/logic/workflow.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/mixins/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/mixins/event_emitter.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/mixins/mcp.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/mixins/security.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/mixins.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/monitoring/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/monitoring/connection_dashboard.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/monitoring/deadlock_detector.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/monitoring/health_check.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/monitoring/log_processor.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/monitoring/metrics_collector.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/monitoring/performance_anomaly.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/monitoring/performance_benchmark.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/monitoring/race_condition_detector.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/monitoring/transaction_metrics.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/monitoring/transaction_monitor.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/ports.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/advanced.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/agentic.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/conversational.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/evaluation.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/federated.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/graph.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/multimodal.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/optimized.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/privacy.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/query_processing.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/realtime.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/registry.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/router.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/similarity.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/strategies.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/rag/workflows.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/security/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/security/abac_evaluator.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/security/audit_log.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/security/behavior_analysis.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/security/credential_manager.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/security/rotating_credentials.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/security/security_event.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/security/threat_detection.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/system/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/system/command_parser.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/testing/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/testing/credential_testing.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/transaction/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/transaction/distributed_transaction_manager.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/transaction/saga_coordinator.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/transaction/saga_state_storage.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/transaction/saga_step.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/transaction/transaction_context.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/transaction/two_phase_commit.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/transform/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/transform/chunkers.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/transform/formatters.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/transform/processors.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/validation/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/validation/test_executor.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/validation/validation_nodes.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/nodes/validation.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/resources/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/resources/factory.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/resources/health.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/resources/reference.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/resources/registry.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/access_controlled.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/async_local.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/docker.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/parallel.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/parallel_cyclic.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/parameter_injection.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/parameter_injector.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/runner.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/secret_provider.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/testing.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/validation/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/validation/connection_context.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/validation/enhanced_error_formatter.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/validation/error_categorizer.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/validation/import_validator.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/validation/metrics.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/validation/performance.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/runtime/validation/suggestion_engine.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/sdk_exceptions.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/security.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/servers/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/servers/durable_workflow_server.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/servers/enterprise_workflow_server.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/servers/gateway.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/servers/workflow_server.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/testing/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/testing/async_test_case.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/testing/async_utils.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/testing/fixtures.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/testing/mock_registry.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/tracking/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/tracking/manager.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/tracking/metrics_collector.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/tracking/models.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/tracking/storage/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/tracking/storage/base.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/tracking/storage/database.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/tracking/storage/filesystem.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/utils/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/utils/data_paths.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/utils/data_validation.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/utils/export.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/utils/migrations/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/utils/migrations/generator.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/utils/migrations/models.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/utils/migrations/runner.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/utils/resource_manager.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/utils/secure_logging.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/utils/templates.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/visualization/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/visualization/api.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/visualization/dashboard.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/visualization/performance.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/visualization/reports.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/__init__.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/async_builder.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/async_patterns.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/builder.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/contracts.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/convergence.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/cycle_analyzer.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/cycle_builder.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/cycle_config.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/cycle_debugger.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/cycle_exceptions.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/cycle_profiler.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/cycle_state.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/edge_infrastructure.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/graph.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/input_handling.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/mermaid_visualizer.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/migration.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/mock_registry.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/resilience.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/runner.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/safety.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/state.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/templates.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/type_inference.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/validation.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash/workflow/visualization.py +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash.egg-info/SOURCES.txt +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash.egg-info/dependency_links.txt +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash.egg-info/entry_points.txt +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash.egg-info/not-zip-safe +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash.egg-info/requires.txt +0 -0
- {kailash-0.8.7 → kailash-0.9.1}/src/kailash.egg-info/top_level.txt +0 -0
@@ -3,10 +3,9 @@
|
|
3
3
|
The Kailash SDK provides a comprehensive framework for creating nodes and workflows
|
4
4
|
that align with container-node architecture while allowing rapid prototyping.
|
5
5
|
|
6
|
-
New in v0.
|
7
|
-
|
8
|
-
|
9
|
-
Previous v0.8.6: Enhanced parameter validation system with debugging tools.
|
6
|
+
New in v0.9.1: DataFlow PostgreSQL parameter conversion verification and comprehensive testing infrastructure.
|
7
|
+
Complete validation of parameter conversion chain from DataFlow to AsyncSQLDatabaseNode to PostgreSQL.
|
8
|
+
Previous v0.9.0: Complete migration from cycle=True to modern CycleBuilder API.
|
10
9
|
"""
|
11
10
|
|
12
11
|
from kailash.nodes.base import Node, NodeMetadata, NodeParameter
|
@@ -49,7 +48,7 @@ except ImportError:
|
|
49
48
|
# For backward compatibility
|
50
49
|
WorkflowGraph = Workflow
|
51
50
|
|
52
|
-
__version__ = "0.
|
51
|
+
__version__ = "0.9.1"
|
53
52
|
|
54
53
|
__all__ = [
|
55
54
|
# Core workflow components
|
@@ -493,7 +493,10 @@ class PostgreSQLAdapter(DatabaseAdapter):
|
|
493
493
|
and "RETURNING" not in query_upper
|
494
494
|
and fetch_mode == FetchMode.ALL
|
495
495
|
):
|
496
|
-
|
496
|
+
if isinstance(params, dict):
|
497
|
+
result = await conn.execute(query, params)
|
498
|
+
else:
|
499
|
+
result = await conn.execute(query, *params)
|
497
500
|
# asyncpg returns a string like "UPDATE 1", extract the count
|
498
501
|
if isinstance(result, str):
|
499
502
|
parts = result.split()
|
@@ -505,15 +508,24 @@ class PostgreSQLAdapter(DatabaseAdapter):
|
|
505
508
|
return []
|
506
509
|
|
507
510
|
if fetch_mode == FetchMode.ONE:
|
508
|
-
|
511
|
+
if isinstance(params, dict):
|
512
|
+
row = await conn.fetchrow(query, params)
|
513
|
+
else:
|
514
|
+
row = await conn.fetchrow(query, *params)
|
509
515
|
return self._convert_row(dict(row)) if row else None
|
510
516
|
elif fetch_mode == FetchMode.ALL:
|
511
|
-
|
517
|
+
if isinstance(params, dict):
|
518
|
+
rows = await conn.fetch(query, params)
|
519
|
+
else:
|
520
|
+
rows = await conn.fetch(query, *params)
|
512
521
|
return [self._convert_row(dict(row)) for row in rows]
|
513
522
|
elif fetch_mode == FetchMode.MANY:
|
514
523
|
if not fetch_size:
|
515
524
|
raise ValueError("fetch_size required for MANY mode")
|
516
|
-
|
525
|
+
if isinstance(params, dict):
|
526
|
+
rows = await conn.fetch(query, params)
|
527
|
+
else:
|
528
|
+
rows = await conn.fetch(query, *params)
|
517
529
|
return [self._convert_row(dict(row)) for row in rows[:fetch_size]]
|
518
530
|
elif fetch_mode == FetchMode.ITERATOR:
|
519
531
|
raise NotImplementedError("Iterator mode not yet implemented")
|
@@ -532,7 +544,10 @@ class PostgreSQLAdapter(DatabaseAdapter):
|
|
532
544
|
and "RETURNING" not in query_upper
|
533
545
|
and fetch_mode == FetchMode.ALL
|
534
546
|
):
|
535
|
-
|
547
|
+
if isinstance(params, dict):
|
548
|
+
result = await conn.execute(query, params)
|
549
|
+
else:
|
550
|
+
result = await conn.execute(query, *params)
|
536
551
|
# asyncpg returns a string like "UPDATE 1", extract the count
|
537
552
|
if isinstance(result, str):
|
538
553
|
parts = result.split()
|
@@ -544,15 +559,24 @@ class PostgreSQLAdapter(DatabaseAdapter):
|
|
544
559
|
return []
|
545
560
|
|
546
561
|
if fetch_mode == FetchMode.ONE:
|
547
|
-
|
562
|
+
if isinstance(params, dict):
|
563
|
+
row = await conn.fetchrow(query, params)
|
564
|
+
else:
|
565
|
+
row = await conn.fetchrow(query, *params)
|
548
566
|
return self._convert_row(dict(row)) if row else None
|
549
567
|
elif fetch_mode == FetchMode.ALL:
|
550
|
-
|
568
|
+
if isinstance(params, dict):
|
569
|
+
rows = await conn.fetch(query, params)
|
570
|
+
else:
|
571
|
+
rows = await conn.fetch(query, *params)
|
551
572
|
return [self._convert_row(dict(row)) for row in rows]
|
552
573
|
elif fetch_mode == FetchMode.MANY:
|
553
574
|
if not fetch_size:
|
554
575
|
raise ValueError("fetch_size required for MANY mode")
|
555
|
-
|
576
|
+
if isinstance(params, dict):
|
577
|
+
rows = await conn.fetch(query, params)
|
578
|
+
else:
|
579
|
+
rows = await conn.fetch(query, *params)
|
556
580
|
return [self._convert_row(dict(row)) for row in rows[:fetch_size]]
|
557
581
|
elif fetch_mode == FetchMode.ITERATOR:
|
558
582
|
raise NotImplementedError("Iterator mode not yet implemented")
|
@@ -85,10 +85,14 @@ class SwitchNode(Node):
|
|
85
85
|
... operator="==",
|
86
86
|
... value=True
|
87
87
|
... ))
|
88
|
-
>>> workflow.
|
89
|
-
>>>
|
90
|
-
|
91
|
-
>>>
|
88
|
+
>>> workflow.add_connection("convergence", "result", "switch", "input_data")
|
89
|
+
>>> # Use CycleBuilder for cyclic connections
|
90
|
+
>>> cycle = workflow.create_cycle("convergence_loop")
|
91
|
+
>>> cycle.connect("switch", "false_output", "processor", "input")
|
92
|
+
>>> cycle.connect("processor", "result", "convergence", "data")
|
93
|
+
>>> cycle.max_iterations(50).build()
|
94
|
+
>>> # Non-cyclic output connection
|
95
|
+
>>> workflow.add_connection("switch", "true_output", "output", "data")
|
92
96
|
"""
|
93
97
|
|
94
98
|
def get_parameters(self) -> dict[str, NodeParameter]:
|
@@ -636,6 +636,26 @@ class LocalRuntime:
|
|
636
636
|
if self.debug:
|
637
637
|
self.logger.debug(f"Node {node_id} inputs: {inputs}")
|
638
638
|
|
639
|
+
# CONDITIONAL EXECUTION: Skip nodes that only receive None inputs from conditional routing
|
640
|
+
if self._should_skip_conditional_node(workflow, node_id, inputs):
|
641
|
+
self.logger.info(
|
642
|
+
f"Skipping node {node_id} - all conditional inputs are None"
|
643
|
+
)
|
644
|
+
# Store None result to indicate the node was skipped
|
645
|
+
results[node_id] = None
|
646
|
+
node_outputs[node_id] = None
|
647
|
+
|
648
|
+
# Update task status if tracking is enabled
|
649
|
+
if task and task_manager:
|
650
|
+
task_manager.update_task_status(
|
651
|
+
task.task_id,
|
652
|
+
TaskStatus.COMPLETED,
|
653
|
+
result=None,
|
654
|
+
ended_at=datetime.now(UTC),
|
655
|
+
metadata={"skipped": True, "reason": "conditional_routing"},
|
656
|
+
)
|
657
|
+
continue
|
658
|
+
|
639
659
|
# Execute node with unified async/sync support and metrics collection
|
640
660
|
collector = MetricsCollector()
|
641
661
|
with collector.collect(node_id=node_id) as metrics_context:
|
@@ -1123,6 +1143,88 @@ class LocalRuntime:
|
|
1123
1143
|
metrics_collector = get_metrics_collector()
|
1124
1144
|
metrics_collector.reset_metrics()
|
1125
1145
|
|
1146
|
+
def _should_skip_conditional_node(
|
1147
|
+
self, workflow: Workflow, node_id: str, inputs: dict[str, Any]
|
1148
|
+
) -> bool:
|
1149
|
+
"""Determine if a node should be skipped due to conditional routing.
|
1150
|
+
|
1151
|
+
A node should be skipped if:
|
1152
|
+
1. It has incoming connections from conditional nodes (like SwitchNode)
|
1153
|
+
2. All of its connected inputs are None
|
1154
|
+
3. It has no node-level configuration parameters that would make it run independently
|
1155
|
+
|
1156
|
+
Args:
|
1157
|
+
workflow: The workflow being executed.
|
1158
|
+
node_id: Node ID to check.
|
1159
|
+
inputs: Prepared inputs for the node.
|
1160
|
+
|
1161
|
+
Returns:
|
1162
|
+
True if the node should be skipped, False otherwise.
|
1163
|
+
"""
|
1164
|
+
# Get all incoming edges for this node
|
1165
|
+
incoming_edges = list(workflow.graph.in_edges(node_id, data=True))
|
1166
|
+
|
1167
|
+
# If the node has no incoming connections, don't skip it
|
1168
|
+
# (it might be a source node or have configuration parameters)
|
1169
|
+
if not incoming_edges:
|
1170
|
+
return False
|
1171
|
+
|
1172
|
+
# Check if any incoming edges are from conditional nodes
|
1173
|
+
has_conditional_inputs = False
|
1174
|
+
for source_node_id, _, edge_data in incoming_edges:
|
1175
|
+
source_node = workflow._node_instances.get(source_node_id)
|
1176
|
+
if source_node and source_node.__class__.__name__ in ["SwitchNode"]:
|
1177
|
+
has_conditional_inputs = True
|
1178
|
+
break
|
1179
|
+
|
1180
|
+
# If no conditional inputs, don't skip
|
1181
|
+
if not has_conditional_inputs:
|
1182
|
+
return False
|
1183
|
+
|
1184
|
+
# Get the node instance to check for configuration parameters
|
1185
|
+
node_instance = workflow._node_instances.get(node_id)
|
1186
|
+
if not node_instance:
|
1187
|
+
return False
|
1188
|
+
|
1189
|
+
# Check if the node has configuration parameters that would make it run independently
|
1190
|
+
# (excluding standard parameters and None values)
|
1191
|
+
node_config = getattr(node_instance, "config", {})
|
1192
|
+
significant_config = {
|
1193
|
+
k: v
|
1194
|
+
for k, v in node_config.items()
|
1195
|
+
if k not in ["metadata", "name", "id"] and v is not None
|
1196
|
+
}
|
1197
|
+
|
1198
|
+
# If the node has significant configuration, it might still be valuable to run
|
1199
|
+
if significant_config:
|
1200
|
+
# Check if any connected inputs have actual data (not None)
|
1201
|
+
connected_inputs = {}
|
1202
|
+
for _, _, edge_data in incoming_edges:
|
1203
|
+
mapping = edge_data.get("mapping", {})
|
1204
|
+
for source_key, target_key in mapping.items():
|
1205
|
+
if target_key in inputs:
|
1206
|
+
connected_inputs[target_key] = inputs[target_key]
|
1207
|
+
|
1208
|
+
# If all connected inputs are None but node has config, still skip
|
1209
|
+
# The user can configure the node to run with default values if needed
|
1210
|
+
if all(v is None for v in connected_inputs.values()):
|
1211
|
+
return True
|
1212
|
+
|
1213
|
+
# Check if all connected inputs are None
|
1214
|
+
# This is the main condition for conditional routing
|
1215
|
+
has_non_none_input = False
|
1216
|
+
for _, _, edge_data in incoming_edges:
|
1217
|
+
mapping = edge_data.get("mapping", {})
|
1218
|
+
for source_key, target_key in mapping.items():
|
1219
|
+
if target_key in inputs and inputs[target_key] is not None:
|
1220
|
+
has_non_none_input = True
|
1221
|
+
break
|
1222
|
+
if has_non_none_input:
|
1223
|
+
break
|
1224
|
+
|
1225
|
+
# Skip the node if all connected inputs are None
|
1226
|
+
return not has_non_none_input
|
1227
|
+
|
1126
1228
|
def _should_stop_on_error(self, workflow: Workflow, node_id: str) -> bool:
|
1127
1229
|
"""Determine if execution should stop when a node fails.
|
1128
1230
|
|
@@ -220,6 +220,60 @@ class CyclicWorkflowExecutor:
|
|
220
220
|
else:
|
221
221
|
return obj
|
222
222
|
|
223
|
+
def _should_skip_conditional_node_cyclic(
|
224
|
+
self, workflow: Workflow, node_id: str, merged_inputs: dict[str, Any]
|
225
|
+
) -> bool:
|
226
|
+
"""Determine if a node should be skipped due to conditional routing in cyclic execution.
|
227
|
+
|
228
|
+
This is similar to LocalRuntime._should_skip_conditional_node but adapted for cyclic execution.
|
229
|
+
|
230
|
+
Args:
|
231
|
+
workflow: The workflow being executed.
|
232
|
+
node_id: Node ID to check.
|
233
|
+
merged_inputs: Merged inputs for the node.
|
234
|
+
|
235
|
+
Returns:
|
236
|
+
True if the node should be skipped, False otherwise.
|
237
|
+
"""
|
238
|
+
# Get all incoming edges for this node
|
239
|
+
incoming_edges = list(workflow.graph.in_edges(node_id, data=True))
|
240
|
+
|
241
|
+
# If the node has no incoming connections, don't skip it
|
242
|
+
if not incoming_edges:
|
243
|
+
return False
|
244
|
+
|
245
|
+
# Check if any incoming edges are from conditional nodes
|
246
|
+
has_conditional_inputs = False
|
247
|
+
for source_node_id, _, edge_data in incoming_edges:
|
248
|
+
try:
|
249
|
+
source_node = workflow.get_node(source_node_id)
|
250
|
+
if source_node and source_node.__class__.__name__ in ["SwitchNode"]:
|
251
|
+
has_conditional_inputs = True
|
252
|
+
break
|
253
|
+
except:
|
254
|
+
continue
|
255
|
+
|
256
|
+
# If no conditional inputs, don't skip
|
257
|
+
if not has_conditional_inputs:
|
258
|
+
return False
|
259
|
+
|
260
|
+
# Check if all connected inputs are None
|
261
|
+
has_non_none_input = False
|
262
|
+
for _, _, edge_data in incoming_edges:
|
263
|
+
mapping = edge_data.get("mapping", {})
|
264
|
+
for source_key, target_key in mapping.items():
|
265
|
+
if (
|
266
|
+
target_key in merged_inputs
|
267
|
+
and merged_inputs[target_key] is not None
|
268
|
+
):
|
269
|
+
has_non_none_input = True
|
270
|
+
break
|
271
|
+
if has_non_none_input:
|
272
|
+
break
|
273
|
+
|
274
|
+
# Skip the node if all connected inputs are None
|
275
|
+
return not has_non_none_input
|
276
|
+
|
223
277
|
def _execute_with_cycles(
|
224
278
|
self,
|
225
279
|
workflow: Workflow,
|
@@ -863,6 +917,20 @@ class CyclicWorkflowExecutor:
|
|
863
917
|
except Exception as e:
|
864
918
|
logger.warning(f"Failed to create task for node '{node_id}': {e}")
|
865
919
|
|
920
|
+
# CONDITIONAL EXECUTION: Skip nodes that only receive None inputs from conditional routing
|
921
|
+
if self._should_skip_conditional_node_cyclic(workflow, node_id, merged_inputs):
|
922
|
+
logger.info(f"Skipping node {node_id} - all conditional inputs are None")
|
923
|
+
# Store None result to indicate the node was skipped
|
924
|
+
if task and task_manager:
|
925
|
+
task_manager.update_task_status(
|
926
|
+
task.task_id,
|
927
|
+
TaskStatus.COMPLETED,
|
928
|
+
result=None,
|
929
|
+
ended_at=datetime.now(UTC),
|
930
|
+
metadata={"skipped": True, "reason": "conditional_routing"},
|
931
|
+
)
|
932
|
+
return None
|
933
|
+
|
866
934
|
# Execute node with metrics collection
|
867
935
|
collector = MetricsCollector()
|
868
936
|
logger.debug(
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|