kailash 0.8.0__tar.gz → 0.8.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.
Files changed (354) hide show
  1. {kailash-0.8.0/src/kailash.egg-info → kailash-0.8.1}/PKG-INFO +2 -1
  2. {kailash-0.8.0 → kailash-0.8.1}/pyproject.toml +2 -1
  3. {kailash-0.8.0 → kailash-0.8.1}/setup.py +5 -5
  4. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/__init__.py +1 -1
  5. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/communication/realtime.py +50 -29
  6. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/code/python.py +5 -0
  7. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/visualization.py +36 -18
  8. {kailash-0.8.0 → kailash-0.8.1/src/kailash.egg-info}/PKG-INFO +2 -1
  9. {kailash-0.8.0 → kailash-0.8.1}/src/kailash.egg-info/requires.txt +1 -0
  10. {kailash-0.8.0 → kailash-0.8.1}/LICENSE +0 -0
  11. {kailash-0.8.0 → kailash-0.8.1}/MANIFEST.in +0 -0
  12. {kailash-0.8.0 → kailash-0.8.1}/README.md +0 -0
  13. {kailash-0.8.0 → kailash-0.8.1}/setup.cfg +0 -0
  14. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/__main__.py +0 -0
  15. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/access_control/__init__.py +0 -0
  16. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/access_control/managers.py +0 -0
  17. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/access_control/rule_evaluators.py +0 -0
  18. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/access_control.py +0 -0
  19. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/access_control_abac.py +0 -0
  20. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/adapters/__init__.py +0 -0
  21. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/adapters/mcp_platform_adapter.py +0 -0
  22. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/api/auth.py +0 -0
  23. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/api/custom_nodes.py +0 -0
  24. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/api/custom_nodes_secure.py +0 -0
  25. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/api/gateway.py +0 -0
  26. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/api/mcp_integration.py +0 -0
  27. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/api/studio.py +0 -0
  28. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/api/workflow_api.py +0 -0
  29. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/channels/__init__.py +0 -0
  30. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/channels/api_channel.py +0 -0
  31. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/channels/base.py +0 -0
  32. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/channels/cli_channel.py +0 -0
  33. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/channels/event_router.py +0 -0
  34. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/channels/mcp_channel.py +0 -0
  35. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/channels/session.py +0 -0
  36. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/cli/__init__.py +0 -0
  37. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/cli/commands.py +0 -0
  38. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/client/__init__.py +0 -0
  39. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/client/enhanced_client.py +0 -0
  40. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/config/__init__.py +0 -0
  41. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/config/database_config.py +0 -0
  42. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/actors/__init__.py +0 -0
  43. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/actors/adaptive_pool_controller.py +0 -0
  44. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/actors/connection_actor.py +0 -0
  45. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/actors/supervisor.py +0 -0
  46. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/ml/__init__.py +0 -0
  47. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/ml/query_patterns.py +0 -0
  48. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/monitoring/__init__.py +0 -0
  49. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/monitoring/connection_metrics.py +0 -0
  50. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/optimization/__init__.py +0 -0
  51. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/resilience/__init__.py +0 -0
  52. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/resilience/bulkhead.py +0 -0
  53. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/resilience/circuit_breaker.py +0 -0
  54. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/core/resilience/health_monitor.py +0 -0
  55. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/database/__init__.py +0 -0
  56. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/database/execution_pipeline.py +0 -0
  57. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/edge/__init__.py +0 -0
  58. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/edge/compliance.py +0 -0
  59. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/edge/discovery.py +0 -0
  60. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/edge/location.py +0 -0
  61. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/gateway/__init__.py +0 -0
  62. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/gateway/api.py +0 -0
  63. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/gateway/enhanced_gateway.py +0 -0
  64. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/gateway/resource_resolver.py +0 -0
  65. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/gateway/security.py +0 -0
  66. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/manifest.py +0 -0
  67. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/__init__.py +0 -0
  68. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/advanced_features.py +0 -0
  69. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/ai_registry_server.py +0 -0
  70. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/auth.py +0 -0
  71. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/client.py +0 -0
  72. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/client_new.py +0 -0
  73. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/discovery.py +0 -0
  74. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/errors.py +0 -0
  75. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/oauth.py +0 -0
  76. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/protocol.py +0 -0
  77. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/registry_integration.py +0 -0
  78. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/server.py +0 -0
  79. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/servers/ai_registry.py +0 -0
  80. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/transports.py +0 -0
  81. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/utils/__init__.py +0 -0
  82. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/utils/cache.py +0 -0
  83. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/utils/config.py +0 -0
  84. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/utils/formatters.py +0 -0
  85. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/mcp_server/utils/metrics.py +0 -0
  86. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/__init__.py +0 -0
  87. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/auth/__init__.py +0 -0
  88. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/auth/access_control.py +0 -0
  89. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/auth/auth_manager.py +0 -0
  90. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/auth/exceptions.py +0 -0
  91. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/auth/jwt_auth.py +0 -0
  92. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/auth/models.py +0 -0
  93. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/auth/utils.py +0 -0
  94. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/communication/__init__.py +0 -0
  95. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/communication/ai_chat.py +0 -0
  96. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/communication/api_gateway.py +0 -0
  97. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/communication/events.py +0 -0
  98. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/core/__init__.py +0 -0
  99. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/core/agent_ui.py +0 -0
  100. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/core/schema.py +0 -0
  101. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/core/workflows.py +0 -0
  102. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/database/__init__.py +0 -0
  103. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/database/base.py +0 -0
  104. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/database/base_models.py +0 -0
  105. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/database/enums.py +0 -0
  106. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/database/migrations.py +0 -0
  107. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/database/models.py +0 -0
  108. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/database/repositories.py +0 -0
  109. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/database/session_manager.py +0 -0
  110. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/gateway/__init__.py +0 -0
  111. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/gateway/checkpoint_manager.py +0 -0
  112. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/gateway/deduplicator.py +0 -0
  113. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/gateway/durable_gateway.py +0 -0
  114. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/gateway/durable_request.py +0 -0
  115. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/gateway/event_store.py +0 -0
  116. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/gateway/storage_backends.py +0 -0
  117. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/mcp/__init__.py +0 -0
  118. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/mcp/client_integration.py +0 -0
  119. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/middleware/mcp/enhanced_server.py +0 -0
  120. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nexus/__init__.py +0 -0
  121. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nexus/cli/__init__.py +0 -0
  122. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nexus/cli/__main__.py +0 -0
  123. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nexus/cli/main.py +0 -0
  124. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nexus/factory.py +0 -0
  125. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nexus/gateway.py +0 -0
  126. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/__init__.py +0 -0
  127. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/admin/__init__.py +0 -0
  128. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/admin/audit_log.py +0 -0
  129. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/admin/permission_check.py +0 -0
  130. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/admin/role_management.py +0 -0
  131. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/admin/schema.sql +0 -0
  132. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/admin/schema_manager.py +0 -0
  133. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/admin/security_event.py +0 -0
  134. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/admin/tenant_isolation.py +0 -0
  135. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/admin/transaction_utils.py +0 -0
  136. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/admin/user_management.py +0 -0
  137. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/ai/__init__.py +0 -0
  138. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/ai/a2a.py +0 -0
  139. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/ai/agents.py +0 -0
  140. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/ai/ai_providers.py +0 -0
  141. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/ai/embedding_generator.py +0 -0
  142. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/ai/intelligent_agent_orchestrator.py +0 -0
  143. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/ai/iterative_llm_agent.py +0 -0
  144. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/ai/llm_agent.py +0 -0
  145. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/ai/models.py +0 -0
  146. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/ai/self_organizing.py +0 -0
  147. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/ai/vision_utils.py +0 -0
  148. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/alerts/__init__.py +0 -0
  149. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/alerts/base.py +0 -0
  150. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/alerts/discord.py +0 -0
  151. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/api/__init__.py +0 -0
  152. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/api/auth.py +0 -0
  153. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/api/graphql.py +0 -0
  154. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/api/http.py +0 -0
  155. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/api/monitoring.py +0 -0
  156. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/api/rate_limiting.py +0 -0
  157. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/api/rest.py +0 -0
  158. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/api/security.py +0 -0
  159. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/auth/__init__.py +0 -0
  160. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/auth/directory_integration.py +0 -0
  161. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/auth/enterprise_auth_provider.py +0 -0
  162. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/auth/mfa.py +0 -0
  163. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/auth/risk_assessment.py +0 -0
  164. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/auth/session_management.py +0 -0
  165. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/auth/sso.py +0 -0
  166. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/base.py +0 -0
  167. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/base_async.py +0 -0
  168. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/base_cycle_aware.py +0 -0
  169. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/base_with_acl.py +0 -0
  170. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/cache/__init__.py +0 -0
  171. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/cache/cache.py +0 -0
  172. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/cache/cache_invalidation.py +0 -0
  173. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/cache/redis_pool_manager.py +0 -0
  174. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/code/__init__.py +0 -0
  175. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/code/async_python.py +0 -0
  176. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/compliance/__init__.py +0 -0
  177. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/compliance/data_retention.py +0 -0
  178. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/compliance/gdpr.py +0 -0
  179. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/__init__.py +0 -0
  180. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/async_connection.py +0 -0
  181. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/async_sql.py +0 -0
  182. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/async_vector.py +0 -0
  183. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/bulk_operations.py +0 -0
  184. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/directory.py +0 -0
  185. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/event_generation.py +0 -0
  186. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/file_discovery.py +0 -0
  187. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/optimistic_locking.py +0 -0
  188. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/query_builder.py +0 -0
  189. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/query_cache.py +0 -0
  190. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/query_pipeline.py +0 -0
  191. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/query_router.py +0 -0
  192. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/readers.py +0 -0
  193. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/redis.py +0 -0
  194. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/retrieval.py +0 -0
  195. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/sharepoint_graph.py +0 -0
  196. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/sources.py +0 -0
  197. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/sql.py +0 -0
  198. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/streaming.py +0 -0
  199. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/vector_db.py +0 -0
  200. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/workflow_connection_pool.py +0 -0
  201. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/data/writers.py +0 -0
  202. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/enterprise/__init__.py +0 -0
  203. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/enterprise/audit_logger.py +0 -0
  204. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/enterprise/batch_processor.py +0 -0
  205. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/enterprise/data_lineage.py +0 -0
  206. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/enterprise/mcp_executor.py +0 -0
  207. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/enterprise/service_discovery.py +0 -0
  208. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/enterprise/tenant_assignment.py +0 -0
  209. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/logic/__init__.py +0 -0
  210. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/logic/async_operations.py +0 -0
  211. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/logic/convergence.py +0 -0
  212. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/logic/loop.py +0 -0
  213. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/logic/operations.py +0 -0
  214. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/logic/workflow.py +0 -0
  215. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/mixins/__init__.py +0 -0
  216. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/mixins/event_emitter.py +0 -0
  217. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/mixins/mcp.py +0 -0
  218. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/mixins/security.py +0 -0
  219. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/mixins.py +0 -0
  220. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/monitoring/__init__.py +0 -0
  221. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/monitoring/connection_dashboard.py +0 -0
  222. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/monitoring/deadlock_detector.py +0 -0
  223. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/monitoring/health_check.py +0 -0
  224. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/monitoring/log_processor.py +0 -0
  225. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/monitoring/metrics_collector.py +0 -0
  226. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/monitoring/performance_anomaly.py +0 -0
  227. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/monitoring/performance_benchmark.py +0 -0
  228. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/monitoring/race_condition_detector.py +0 -0
  229. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/monitoring/transaction_metrics.py +0 -0
  230. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/monitoring/transaction_monitor.py +0 -0
  231. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/__init__.py +0 -0
  232. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/advanced.py +0 -0
  233. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/agentic.py +0 -0
  234. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/conversational.py +0 -0
  235. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/evaluation.py +0 -0
  236. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/federated.py +0 -0
  237. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/graph.py +0 -0
  238. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/multimodal.py +0 -0
  239. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/optimized.py +0 -0
  240. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/privacy.py +0 -0
  241. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/query_processing.py +0 -0
  242. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/realtime.py +0 -0
  243. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/registry.py +0 -0
  244. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/router.py +0 -0
  245. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/similarity.py +0 -0
  246. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/strategies.py +0 -0
  247. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/rag/workflows.py +0 -0
  248. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/security/__init__.py +0 -0
  249. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/security/abac_evaluator.py +0 -0
  250. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/security/audit_log.py +0 -0
  251. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/security/behavior_analysis.py +0 -0
  252. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/security/credential_manager.py +0 -0
  253. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/security/rotating_credentials.py +0 -0
  254. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/security/security_event.py +0 -0
  255. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/security/threat_detection.py +0 -0
  256. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/system/__init__.py +0 -0
  257. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/system/command_parser.py +0 -0
  258. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/testing/__init__.py +0 -0
  259. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/testing/credential_testing.py +0 -0
  260. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/transaction/__init__.py +0 -0
  261. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/transaction/distributed_transaction_manager.py +0 -0
  262. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/transaction/saga_coordinator.py +0 -0
  263. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/transaction/saga_state_storage.py +0 -0
  264. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/transaction/saga_step.py +0 -0
  265. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/transaction/transaction_context.py +0 -0
  266. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/transaction/two_phase_commit.py +0 -0
  267. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/transform/__init__.py +0 -0
  268. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/transform/chunkers.py +0 -0
  269. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/transform/formatters.py +0 -0
  270. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/transform/processors.py +0 -0
  271. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/validation/__init__.py +0 -0
  272. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/validation/test_executor.py +0 -0
  273. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/validation/validation_nodes.py +0 -0
  274. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/nodes/validation.py +0 -0
  275. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/resources/__init__.py +0 -0
  276. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/resources/factory.py +0 -0
  277. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/resources/health.py +0 -0
  278. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/resources/reference.py +0 -0
  279. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/resources/registry.py +0 -0
  280. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/runtime/__init__.py +0 -0
  281. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/runtime/access_controlled.py +0 -0
  282. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/runtime/async_local.py +0 -0
  283. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/runtime/docker.py +0 -0
  284. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/runtime/local.py +0 -0
  285. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/runtime/parallel.py +0 -0
  286. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/runtime/parallel_cyclic.py +0 -0
  287. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/runtime/parameter_injection.py +0 -0
  288. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/runtime/parameter_injector.py +0 -0
  289. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/runtime/runner.py +0 -0
  290. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/runtime/testing.py +0 -0
  291. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/sdk_exceptions.py +0 -0
  292. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/security.py +0 -0
  293. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/servers/__init__.py +0 -0
  294. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/servers/durable_workflow_server.py +0 -0
  295. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/servers/enterprise_workflow_server.py +0 -0
  296. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/servers/gateway.py +0 -0
  297. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/servers/workflow_server.py +0 -0
  298. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/testing/__init__.py +0 -0
  299. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/testing/async_test_case.py +0 -0
  300. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/testing/async_utils.py +0 -0
  301. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/testing/fixtures.py +0 -0
  302. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/testing/mock_registry.py +0 -0
  303. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/tracking/__init__.py +0 -0
  304. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/tracking/manager.py +0 -0
  305. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/tracking/metrics_collector.py +0 -0
  306. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/tracking/models.py +0 -0
  307. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/tracking/storage/__init__.py +0 -0
  308. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/tracking/storage/base.py +0 -0
  309. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/tracking/storage/database.py +0 -0
  310. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/tracking/storage/filesystem.py +0 -0
  311. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/utils/__init__.py +0 -0
  312. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/utils/data_validation.py +0 -0
  313. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/utils/export.py +0 -0
  314. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/utils/migrations/__init__.py +0 -0
  315. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/utils/migrations/generator.py +0 -0
  316. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/utils/migrations/models.py +0 -0
  317. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/utils/migrations/runner.py +0 -0
  318. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/utils/resource_manager.py +0 -0
  319. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/utils/secure_logging.py +0 -0
  320. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/utils/templates.py +0 -0
  321. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/visualization/__init__.py +0 -0
  322. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/visualization/api.py +0 -0
  323. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/visualization/dashboard.py +0 -0
  324. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/visualization/performance.py +0 -0
  325. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/visualization/reports.py +0 -0
  326. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/__init__.py +0 -0
  327. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/async_builder.py +0 -0
  328. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/async_patterns.py +0 -0
  329. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/builder.py +0 -0
  330. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/convergence.py +0 -0
  331. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/cycle_analyzer.py +0 -0
  332. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/cycle_builder.py +0 -0
  333. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/cycle_config.py +0 -0
  334. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/cycle_debugger.py +0 -0
  335. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/cycle_exceptions.py +0 -0
  336. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/cycle_profiler.py +0 -0
  337. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/cycle_state.py +0 -0
  338. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/cyclic_runner.py +0 -0
  339. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/graph.py +0 -0
  340. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/input_handling.py +0 -0
  341. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/mermaid_visualizer.py +0 -0
  342. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/migration.py +0 -0
  343. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/mock_registry.py +0 -0
  344. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/resilience.py +0 -0
  345. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/runner.py +0 -0
  346. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/safety.py +0 -0
  347. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/state.py +0 -0
  348. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/templates.py +0 -0
  349. {kailash-0.8.0 → kailash-0.8.1}/src/kailash/workflow/validation.py +0 -0
  350. {kailash-0.8.0 → kailash-0.8.1}/src/kailash.egg-info/SOURCES.txt +0 -0
  351. {kailash-0.8.0 → kailash-0.8.1}/src/kailash.egg-info/dependency_links.txt +0 -0
  352. {kailash-0.8.0 → kailash-0.8.1}/src/kailash.egg-info/entry_points.txt +0 -0
  353. {kailash-0.8.0 → kailash-0.8.1}/src/kailash.egg-info/not-zip-safe +0 -0
  354. {kailash-0.8.0 → kailash-0.8.1}/src/kailash.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kailash
3
- Version: 0.8.0
3
+ Version: 0.8.1
4
4
  Summary: Python SDK for the Kailash container-node architecture
5
5
  Home-page: https://github.com/integrum/kailash-python-sdk
6
6
  Author: Integrum
@@ -58,6 +58,7 @@ Requires-Dist: python-jose>=3.5.0
58
58
  Requires-Dist: pytest-xdist>=3.6.0
59
59
  Requires-Dist: pytest-timeout>=2.3.0
60
60
  Requires-Dist: pytest-split>=0.9.0
61
+ Requires-Dist: pytest-forked>=1.6.0
61
62
  Requires-Dist: asyncpg>=0.30.0
62
63
  Requires-Dist: aiomysql>=0.2.0
63
64
  Requires-Dist: twilio>=9.6.3
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "kailash"
7
- version = "0.8.0"
7
+ version = "0.8.1"
8
8
  description = "Python SDK for the Kailash container-node architecture"
9
9
  authors = [
10
10
  {name = "Integrum", email = "info@integrum.com"}
@@ -62,6 +62,7 @@ dependencies = [
62
62
  "pytest-xdist>=3.6.0",
63
63
  "pytest-timeout>=2.3.0",
64
64
  "pytest-split>=0.9.0",
65
+ "pytest-forked>=1.6.0",
65
66
  "asyncpg>=0.30.0",
66
67
  "aiomysql>=0.2.0",
67
68
  "twilio>=9.6.3",
@@ -13,7 +13,7 @@ with open(os.path.join(this_directory, "README.md"), encoding="utf-8") as f:
13
13
  # Package configuration
14
14
  setup(
15
15
  name="kailash",
16
- version="0.7.0",
16
+ version="0.8.1",
17
17
  author="Integrum",
18
18
  author_email="info@integrum.com",
19
19
  description="Python SDK for the Kailash container-node architecture",
@@ -51,14 +51,14 @@ setup(
51
51
  "pygraphviz>=1.9",
52
52
  ],
53
53
  "dataflow": [
54
- "dataflow>=0.1.0",
54
+ "kailash-dataflow>=0.1.0",
55
55
  ],
56
56
  "nexus": [
57
- "nexus>=1.0.0",
57
+ "kailash-nexus>=1.0.0",
58
58
  ],
59
59
  "all": [
60
- "dataflow>=0.1.0",
61
- "nexus>=1.0.0",
60
+ "kailash-dataflow>=0.1.0",
61
+ "kailash-nexus>=1.0.0",
62
62
  ],
63
63
  },
64
64
  # Entry points for CLI
@@ -52,7 +52,7 @@ except ImportError:
52
52
  # For backward compatibility
53
53
  WorkflowGraph = Workflow
54
54
 
55
- __version__ = "0.8.0"
55
+ __version__ = "0.8.1"
56
56
 
57
57
  __all__ = [
58
58
  # Core workflow components
@@ -177,87 +177,108 @@ class ConnectionManager:
177
177
  "active_users": len(self.user_connections),
178
178
  "total_messages_sent": total_messages,
179
179
  }
180
-
181
- def filter_events(self, events: List[BaseEvent], event_filter: EventFilter = None) -> List[BaseEvent]:
180
+
181
+ def filter_events(
182
+ self, events: List[BaseEvent], event_filter: EventFilter = None
183
+ ) -> List[BaseEvent]:
182
184
  """Filter events based on event filter criteria."""
183
185
  if not event_filter:
184
186
  return events
185
-
187
+
186
188
  filtered = []
187
189
  for event in events:
188
190
  # Apply session filter
189
- if event_filter.session_id and hasattr(event, 'session_id'):
191
+ if event_filter.session_id and hasattr(event, "session_id"):
190
192
  if event.session_id != event_filter.session_id:
191
193
  continue
192
-
194
+
193
195
  # Apply user filter
194
- if event_filter.user_id and hasattr(event, 'user_id'):
196
+ if event_filter.user_id and hasattr(event, "user_id"):
195
197
  if event.user_id != event_filter.user_id:
196
198
  continue
197
-
199
+
198
200
  # Apply event type filter
199
- if event_filter.event_types and event.event_type not in event_filter.event_types:
201
+ if (
202
+ event_filter.event_types
203
+ and event.event_type not in event_filter.event_types
204
+ ):
200
205
  continue
201
-
206
+
202
207
  filtered.append(event)
203
-
208
+
204
209
  return filtered
205
-
210
+
206
211
  def set_event_filter(self, connection_id: str, event_filter: EventFilter):
207
212
  """Set event filter for a specific connection."""
208
213
  if connection_id in self.connections:
209
214
  self.connections[connection_id]["event_filter"] = event_filter
210
-
215
+
211
216
  def get_event_filter(self, connection_id: str) -> Optional[EventFilter]:
212
217
  """Get event filter for a specific connection."""
213
218
  if connection_id in self.connections:
214
219
  return self.connections[connection_id].get("event_filter")
215
220
  return None
216
-
221
+
217
222
  # Alias methods for compatibility
218
- def event_filter(self, events: List[BaseEvent], filter_criteria: EventFilter = None) -> List[BaseEvent]:
223
+ def event_filter(
224
+ self, events: List[BaseEvent], filter_criteria: EventFilter = None
225
+ ) -> List[BaseEvent]:
219
226
  """Alias for filter_events method."""
220
227
  return self.filter_events(events, filter_criteria)
221
-
228
+
222
229
  async def on_event(self, event: BaseEvent):
223
230
  """Handle incoming event - route to appropriate connections."""
224
231
  await self.handle_event(event)
225
-
232
+
226
233
  async def handle_event(self, event: BaseEvent):
227
234
  """Handle and route event to matching connections."""
228
235
  await self.process_event(event)
229
-
236
+
230
237
  async def process_event(self, event: BaseEvent):
231
238
  """Process event and broadcast to matching connections."""
232
239
  message = {
233
240
  "type": "event",
234
- "event_type": event.event_type.value if hasattr(event.event_type, 'value') else str(event.event_type),
241
+ "event_type": (
242
+ event.event_type.value
243
+ if hasattr(event.event_type, "value")
244
+ else str(event.event_type)
245
+ ),
235
246
  "data": event.data,
236
- "timestamp": event.timestamp.isoformat() if hasattr(event, 'timestamp') else datetime.now(timezone.utc).isoformat(),
237
- "session_id": getattr(event, 'session_id', None),
238
- "user_id": getattr(event, 'user_id', None),
247
+ "timestamp": (
248
+ event.timestamp.isoformat()
249
+ if hasattr(event, "timestamp")
250
+ else datetime.now(timezone.utc).isoformat()
251
+ ),
252
+ "session_id": getattr(event, "session_id", None),
253
+ "user_id": getattr(event, "user_id", None),
239
254
  }
240
-
255
+
241
256
  # Broadcast to all matching connections
242
257
  for connection_id, connection in self.connections.items():
243
258
  event_filter = connection.get("event_filter")
244
-
259
+
245
260
  # Check if this connection should receive this event
246
261
  should_send = True
247
262
  if event_filter:
248
263
  # Apply session filter
249
- if event_filter.session_id and connection["session_id"] != event_filter.session_id:
264
+ if (
265
+ event_filter.session_id
266
+ and connection["session_id"] != event_filter.session_id
267
+ ):
250
268
  should_send = False
251
-
269
+
252
270
  # Apply user filter
253
- if event_filter.user_id and connection["user_id"] != event_filter.user_id:
271
+ if (
272
+ event_filter.user_id
273
+ and connection["user_id"] != event_filter.user_id
274
+ ):
254
275
  should_send = False
255
-
276
+
256
277
  # Apply event type filter
257
- if hasattr(event_filter, 'event_types') and event_filter.event_types:
278
+ if hasattr(event_filter, "event_types") and event_filter.event_types:
258
279
  if event.event_type not in event_filter.event_types:
259
280
  should_send = False
260
-
281
+
261
282
  if should_send:
262
283
  await self.send_to_connection(connection_id, message)
263
284
 
@@ -50,6 +50,7 @@ import ast
50
50
  import importlib.util
51
51
  import inspect
52
52
  import logging
53
+ import os
53
54
  import resource
54
55
  import traceback
55
56
  from collections.abc import Callable
@@ -465,6 +466,10 @@ class CodeExecutor:
465
466
  # Normal operation - eagerly load all modules
466
467
  for module_name in self.allowed_modules:
467
468
  try:
469
+ # Skip scipy in CI due to version conflicts
470
+ if module_name == "scipy" and os.environ.get("CI"):
471
+ logger.warning("Skipping scipy import in CI environment")
472
+ continue
468
473
  module = importlib.import_module(module_name)
469
474
  namespace[module_name] = module
470
475
  except ImportError:
@@ -70,7 +70,7 @@ class WorkflowVisualizer:
70
70
  """Get colors for all nodes in workflow."""
71
71
  colors = []
72
72
  for node_id in self.workflow.graph.nodes():
73
- node_instance = target_workflow.nodes.get(node_id)
73
+ node_instance = self.workflow.nodes.get(node_id)
74
74
  if node_instance:
75
75
  node_type = node_instance.node_type
76
76
  colors.append(self._get_node_color(node_type))
@@ -122,12 +122,14 @@ class WorkflowVisualizer:
122
122
 
123
123
  return edge_labels
124
124
 
125
- def _calculate_layout(self, workflow: 'Workflow' = None) -> dict[str, tuple[float, float]]:
125
+ def _calculate_layout(
126
+ self, workflow: "Workflow" = None
127
+ ) -> dict[str, tuple[float, float]]:
126
128
  """Calculate node positions for visualization."""
127
129
  target_workflow = workflow or self.workflow
128
130
  if not target_workflow:
129
131
  return {}
130
-
132
+
131
133
  # Try to use stored positions first
132
134
  pos = {}
133
135
  for node_id, node_instance in target_workflow.nodes.items():
@@ -154,8 +156,10 @@ class WorkflowVisualizer:
154
156
  pos = nx.spring_layout(target_workflow.graph)
155
157
 
156
158
  return pos
157
-
158
- def _get_layout_positions(self, workflow: Workflow) -> dict[str, tuple[float, float]]:
159
+
160
+ def _get_layout_positions(
161
+ self, workflow: Workflow
162
+ ) -> dict[str, tuple[float, float]]:
159
163
  """Get layout positions for workflow nodes."""
160
164
  # Temporarily store workflow and calculate layout
161
165
  original_workflow = self.workflow
@@ -164,7 +168,7 @@ class WorkflowVisualizer:
164
168
  return self._calculate_layout()
165
169
  finally:
166
170
  self.workflow = original_workflow
167
-
171
+
168
172
  def _get_node_colors(self, workflow: Workflow) -> list[str]:
169
173
  """Get node colors for workflow."""
170
174
  colors = []
@@ -183,17 +187,19 @@ class WorkflowVisualizer:
183
187
  color_key = "ai"
184
188
  else:
185
189
  color_key = "default"
186
- colors.append(self.node_colors.get(color_key, self.node_colors["default"]))
190
+ colors.append(
191
+ self.node_colors.get(color_key, self.node_colors["default"])
192
+ )
187
193
  else:
188
194
  colors.append(self.node_colors["default"])
189
195
  return colors
190
196
 
191
- def _create_layers(self, workflow: 'Workflow' = None) -> dict[int, list]:
197
+ def _create_layers(self, workflow: "Workflow" = None) -> dict[int, list]:
192
198
  """Create layers of nodes for hierarchical layout."""
193
199
  target_workflow = workflow or self.workflow
194
200
  if not target_workflow:
195
201
  return {}
196
-
202
+
197
203
  layers = {}
198
204
  remaining = set(target_workflow.graph.nodes())
199
205
  layer = 0
@@ -251,18 +257,22 @@ class WorkflowVisualizer:
251
257
  target_workflow = workflow or self.workflow
252
258
  if not target_workflow:
253
259
  raise ValueError("No workflow provided to draw")
254
-
260
+
255
261
  # Use default position if not provided
256
262
  if pos is None:
257
263
  pos = self._get_layout_positions(target_workflow)
258
-
264
+
259
265
  # Use default colors if not provided
260
266
  if node_colors is None:
261
267
  node_colors = self._get_node_colors(target_workflow)
262
-
268
+
263
269
  # Draw nodes
264
270
  nx.draw_networkx_nodes(
265
- target_workflow.graph, pos, node_color=node_colors, node_size=3000, alpha=0.9
271
+ target_workflow.graph,
272
+ pos,
273
+ node_color=node_colors,
274
+ node_size=3000,
275
+ alpha=0.9,
266
276
  )
267
277
 
268
278
  # Draw edges
@@ -284,7 +294,7 @@ class WorkflowVisualizer:
284
294
  self.workflow = target_workflow
285
295
  labels = self._get_node_labels()
286
296
  self.workflow = old_workflow
287
-
297
+
288
298
  nx.draw_networkx_labels(
289
299
  target_workflow.graph, pos, labels, font_size=10, font_weight="bold"
290
300
  )
@@ -296,7 +306,7 @@ class WorkflowVisualizer:
296
306
  self.workflow = target_workflow
297
307
  edge_labels = self._get_edge_labels()
298
308
  self.workflow = old_workflow
299
-
309
+
300
310
  nx.draw_networkx_edge_labels(
301
311
  target_workflow.graph, pos, edge_labels, font_size=8
302
312
  )
@@ -325,8 +335,10 @@ class WorkflowVisualizer:
325
335
  try:
326
336
  # Check if workflow is available
327
337
  if not self.workflow:
328
- raise ValueError("No workflow to visualize. Set workflow property or create visualizer with workflow.")
329
-
338
+ raise ValueError(
339
+ "No workflow to visualize. Set workflow property or create visualizer with workflow."
340
+ )
341
+
330
342
  plt.figure(figsize=figsize)
331
343
 
332
344
  # Calculate node positions
@@ -342,7 +354,13 @@ class WorkflowVisualizer:
342
354
 
343
355
  # Draw the graph components
344
356
  if pos:
345
- self._draw_graph(workflow=self.workflow, pos=pos, node_colors=node_colors, show_labels=show_labels, show_connections=show_connections)
357
+ self._draw_graph(
358
+ workflow=self.workflow,
359
+ pos=pos,
360
+ node_colors=node_colors,
361
+ show_labels=show_labels,
362
+ show_connections=show_connections,
363
+ )
346
364
 
347
365
  # Set title
348
366
  if title is None:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kailash
3
- Version: 0.8.0
3
+ Version: 0.8.1
4
4
  Summary: Python SDK for the Kailash container-node architecture
5
5
  Home-page: https://github.com/integrum/kailash-python-sdk
6
6
  Author: Integrum
@@ -58,6 +58,7 @@ Requires-Dist: python-jose>=3.5.0
58
58
  Requires-Dist: pytest-xdist>=3.6.0
59
59
  Requires-Dist: pytest-timeout>=2.3.0
60
60
  Requires-Dist: pytest-split>=0.9.0
61
+ Requires-Dist: pytest-forked>=1.6.0
61
62
  Requires-Dist: asyncpg>=0.30.0
62
63
  Requires-Dist: aiomysql>=0.2.0
63
64
  Requires-Dist: twilio>=9.6.3
@@ -41,6 +41,7 @@ python-jose>=3.5.0
41
41
  pytest-xdist>=3.6.0
42
42
  pytest-timeout>=2.3.0
43
43
  pytest-split>=0.9.0
44
+ pytest-forked>=1.6.0
44
45
  asyncpg>=0.30.0
45
46
  aiomysql>=0.2.0
46
47
  twilio>=9.6.3
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes