kailash 0.9.21__tar.gz → 0.9.22__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 (441) hide show
  1. {kailash-0.9.21/src/kailash.egg-info → kailash-0.9.22}/PKG-INFO +1 -1
  2. {kailash-0.9.21 → kailash-0.9.22}/pyproject.toml +1 -1
  3. {kailash-0.9.21 → kailash-0.9.22}/setup.py +1 -1
  4. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/__init__.py +1 -1
  5. kailash-0.9.22/src/kailash/api/tests/test_workflow_api_404.py +202 -0
  6. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/api/workflow_api.py +33 -1
  7. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/base.py +34 -5
  8. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/code/python.py +10 -4
  9. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/security.py +63 -17
  10. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/graph.py +5 -5
  11. {kailash-0.9.21 → kailash-0.9.22/src/kailash.egg-info}/PKG-INFO +1 -1
  12. {kailash-0.9.21 → kailash-0.9.22}/src/kailash.egg-info/SOURCES.txt +1 -0
  13. {kailash-0.9.21 → kailash-0.9.22}/LICENSE +0 -0
  14. {kailash-0.9.21 → kailash-0.9.22}/MANIFEST.in +0 -0
  15. {kailash-0.9.21 → kailash-0.9.22}/NOTICE +0 -0
  16. {kailash-0.9.21 → kailash-0.9.22}/README.md +0 -0
  17. {kailash-0.9.21 → kailash-0.9.22}/setup.cfg +0 -0
  18. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/__main__.py +0 -0
  19. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/access_control/__init__.py +0 -0
  20. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/access_control/managers.py +0 -0
  21. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/access_control/rule_evaluators.py +0 -0
  22. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/access_control.py +0 -0
  23. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/access_control_abac.py +0 -0
  24. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/adapters/__init__.py +0 -0
  25. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/adapters/mcp_platform_adapter.py +0 -0
  26. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/analysis/__init__.py +0 -0
  27. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/analysis/conditional_branch_analyzer.py +0 -0
  28. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/api/auth.py +0 -0
  29. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/api/custom_nodes.py +0 -0
  30. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/api/custom_nodes_secure.py +0 -0
  31. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/api/gateway.py +0 -0
  32. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/api/mcp_integration.py +0 -0
  33. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/api/studio.py +0 -0
  34. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/channels/__init__.py +0 -0
  35. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/channels/api_channel.py +0 -0
  36. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/channels/base.py +0 -0
  37. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/channels/cli_channel.py +0 -0
  38. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/channels/event_router.py +0 -0
  39. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/channels/mcp_channel.py +0 -0
  40. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/channels/session.py +0 -0
  41. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/cli/__init__.py +0 -0
  42. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/cli/commands.py +0 -0
  43. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/cli/validate_imports.py +0 -0
  44. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/cli/validation_audit.py +0 -0
  45. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/client/__init__.py +0 -0
  46. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/client/enhanced_client.py +0 -0
  47. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/config/__init__.py +0 -0
  48. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/config/database_config.py +0 -0
  49. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/actors/__init__.py +0 -0
  50. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/actors/adaptive_pool_controller.py +0 -0
  51. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/actors/connection_actor.py +0 -0
  52. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/actors/supervisor.py +0 -0
  53. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/ml/__init__.py +0 -0
  54. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/ml/query_patterns.py +0 -0
  55. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/monitoring/__init__.py +0 -0
  56. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/monitoring/connection_metrics.py +0 -0
  57. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/optimization/__init__.py +0 -0
  58. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/resilience/__init__.py +0 -0
  59. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/resilience/bulkhead.py +0 -0
  60. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/resilience/circuit_breaker.py +0 -0
  61. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/core/resilience/health_monitor.py +0 -0
  62. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/database/__init__.py +0 -0
  63. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/database/execution_pipeline.py +0 -0
  64. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/__init__.py +0 -0
  65. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/compliance.py +0 -0
  66. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/consistency.py +0 -0
  67. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/coordination/__init__.py +0 -0
  68. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/coordination/global_ordering.py +0 -0
  69. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/coordination/leader_election.py +0 -0
  70. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/coordination/partition_detector.py +0 -0
  71. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/coordination/raft.py +0 -0
  72. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/discovery.py +0 -0
  73. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/location.py +0 -0
  74. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/migration/__init__.py +0 -0
  75. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/migration/edge_migration_service.py +0 -0
  76. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/migration/edge_migrator.py +0 -0
  77. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/monitoring/__init__.py +0 -0
  78. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/monitoring/edge_monitor.py +0 -0
  79. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/prediction/__init__.py +0 -0
  80. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/prediction/predictive_warmer.py +0 -0
  81. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/resource/__init__.py +0 -0
  82. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/resource/cloud_integration.py +0 -0
  83. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/resource/cost_optimizer.py +0 -0
  84. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/resource/docker_integration.py +0 -0
  85. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/resource/kubernetes_integration.py +0 -0
  86. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/resource/platform_integration.py +0 -0
  87. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/resource/predictive_scaler.py +0 -0
  88. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/resource/resource_analyzer.py +0 -0
  89. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/edge/resource/resource_pools.py +0 -0
  90. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/gateway/__init__.py +0 -0
  91. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/gateway/api.py +0 -0
  92. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/gateway/enhanced_gateway.py +0 -0
  93. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/gateway/resource_resolver.py +0 -0
  94. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/gateway/security.py +0 -0
  95. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/integrations/dataflow_edge.py +0 -0
  96. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/manifest.py +0 -0
  97. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/__init__.py +0 -0
  98. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/advanced_features.py +0 -0
  99. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/ai_registry_server.py +0 -0
  100. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/auth.py +0 -0
  101. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/client.py +0 -0
  102. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/client_new.py +0 -0
  103. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/discovery.py +0 -0
  104. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/errors.py +0 -0
  105. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/oauth.py +0 -0
  106. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/protocol.py +0 -0
  107. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/registry_integration.py +0 -0
  108. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/server.py +0 -0
  109. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/servers/ai_registry.py +0 -0
  110. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/subscriptions.py +0 -0
  111. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/transports.py +0 -0
  112. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/utils/__init__.py +0 -0
  113. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/utils/cache.py +0 -0
  114. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/utils/config.py +0 -0
  115. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/utils/formatters.py +0 -0
  116. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/mcp_server/utils/metrics.py +0 -0
  117. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/__init__.py +0 -0
  118. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/auth/__init__.py +0 -0
  119. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/auth/access_control.py +0 -0
  120. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/auth/auth_manager.py +0 -0
  121. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/auth/exceptions.py +0 -0
  122. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/auth/jwt_auth.py +0 -0
  123. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/auth/models.py +0 -0
  124. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/auth/utils.py +0 -0
  125. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/communication/__init__.py +0 -0
  126. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/communication/ai_chat.py +0 -0
  127. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/communication/api_gateway.py +0 -0
  128. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/communication/events.py +0 -0
  129. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/communication/realtime.py +0 -0
  130. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/core/__init__.py +0 -0
  131. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/core/agent_ui.py +0 -0
  132. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/core/schema.py +0 -0
  133. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/core/workflows.py +0 -0
  134. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/database/__init__.py +0 -0
  135. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/database/base.py +0 -0
  136. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/database/base_models.py +0 -0
  137. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/database/enums.py +0 -0
  138. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/database/migrations.py +0 -0
  139. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/database/models.py +0 -0
  140. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/database/repositories.py +0 -0
  141. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/database/session_manager.py +0 -0
  142. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/gateway/__init__.py +0 -0
  143. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/gateway/checkpoint_manager.py +0 -0
  144. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/gateway/deduplicator.py +0 -0
  145. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/gateway/durable_gateway.py +0 -0
  146. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/gateway/durable_request.py +0 -0
  147. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/gateway/event_store.py +0 -0
  148. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/gateway/storage_backends.py +0 -0
  149. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/mcp/__init__.py +0 -0
  150. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/mcp/client_integration.py +0 -0
  151. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/middleware/mcp/enhanced_server.py +0 -0
  152. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/__init__.py +0 -0
  153. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/cli.py +0 -0
  154. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/compatibility_checker.py +0 -0
  155. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/configuration_validator.py +0 -0
  156. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/documentation_generator.py +0 -0
  157. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/examples/__init__.py +0 -0
  158. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/examples/complete_migration_example.py +0 -0
  159. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/migration_assistant.py +0 -0
  160. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/performance_comparator.py +0 -0
  161. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/regression_detector.py +0 -0
  162. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/tests/__init__.py +0 -0
  163. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/tests/test_compatibility_checker.py +0 -0
  164. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/tests/test_integration.py +0 -0
  165. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/tests/test_migration_assistant.py +0 -0
  166. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/migration/tests/test_performance_comparator.py +0 -0
  167. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/monitoring/__init__.py +0 -0
  168. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/monitoring/alerts.py +0 -0
  169. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/monitoring/asyncsql_metrics.py +0 -0
  170. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/monitoring/metrics.py +0 -0
  171. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/__init__.py +0 -0
  172. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/__init___original.py +0 -0
  173. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/admin/__init__.py +0 -0
  174. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/admin/audit_log.py +0 -0
  175. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/admin/permission_check.py +0 -0
  176. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/admin/role_management.py +0 -0
  177. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/admin/schema.sql +0 -0
  178. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/admin/schema_manager.py +0 -0
  179. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/admin/security_event.py +0 -0
  180. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/admin/tenant_isolation.py +0 -0
  181. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/admin/transaction_utils.py +0 -0
  182. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/admin/user_management.py +0 -0
  183. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/__init__.py +0 -0
  184. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/a2a.py +0 -0
  185. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/agents.py +0 -0
  186. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/ai_providers.py +0 -0
  187. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/embedding_generator.py +0 -0
  188. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/hybrid_search.py +0 -0
  189. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/intelligent_agent_orchestrator.py +0 -0
  190. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/iterative_llm_agent.py +0 -0
  191. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/llm_agent.py +0 -0
  192. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/models.py +0 -0
  193. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/self_organizing.py +0 -0
  194. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/semantic_memory.py +0 -0
  195. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/streaming_analytics.py +0 -0
  196. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ai/vision_utils.py +0 -0
  197. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/alerts/__init__.py +0 -0
  198. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/alerts/base.py +0 -0
  199. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/alerts/discord.py +0 -0
  200. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/api/__init__.py +0 -0
  201. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/api/auth.py +0 -0
  202. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/api/graphql.py +0 -0
  203. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/api/http.py +0 -0
  204. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/api/monitoring.py +0 -0
  205. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/api/rate_limiting.py +0 -0
  206. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/api/rest.py +0 -0
  207. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/api/security.py +0 -0
  208. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/auth/__init__.py +0 -0
  209. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/auth/directory_integration.py +0 -0
  210. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/auth/enterprise_auth_provider.py +0 -0
  211. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/auth/mfa.py +0 -0
  212. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/auth/risk_assessment.py +0 -0
  213. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/auth/session_management.py +0 -0
  214. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/auth/sso.py +0 -0
  215. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/base_async.py +0 -0
  216. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/base_cycle_aware.py +0 -0
  217. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/base_with_acl.py +0 -0
  218. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/cache/__init__.py +0 -0
  219. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/cache/cache.py +0 -0
  220. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/cache/cache_invalidation.py +0 -0
  221. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/cache/redis_pool_manager.py +0 -0
  222. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/code/__init__.py +0 -0
  223. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/code/async_python.py +0 -0
  224. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/compliance/__init__.py +0 -0
  225. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/compliance/data_retention.py +0 -0
  226. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/compliance/gdpr.py +0 -0
  227. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/__init__.py +0 -0
  228. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/async_connection.py +0 -0
  229. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/async_sql.py +0 -0
  230. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/async_vector.py +0 -0
  231. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/bulk_operations.py +0 -0
  232. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/directory.py +0 -0
  233. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/event_generation.py +0 -0
  234. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/file_discovery.py +0 -0
  235. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/optimistic_locking.py +0 -0
  236. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/query_builder.py +0 -0
  237. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/query_cache.py +0 -0
  238. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/query_pipeline.py +0 -0
  239. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/query_router.py +0 -0
  240. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/readers.py +0 -0
  241. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/redis.py +0 -0
  242. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/retrieval.py +0 -0
  243. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/sharepoint_graph.py +0 -0
  244. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/sources.py +0 -0
  245. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/sql.py +0 -0
  246. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/streaming.py +0 -0
  247. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/vector_db.py +0 -0
  248. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/workflow_connection_pool.py +0 -0
  249. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/data/writers.py +0 -0
  250. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/__init__.py +0 -0
  251. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/base.py +0 -0
  252. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/cloud_node.py +0 -0
  253. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/coordination.py +0 -0
  254. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/docker_node.py +0 -0
  255. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/edge_data.py +0 -0
  256. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/edge_migration_node.py +0 -0
  257. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/edge_monitoring_node.py +0 -0
  258. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/edge_state.py +0 -0
  259. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/edge_warming_node.py +0 -0
  260. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/kubernetes_node.py +0 -0
  261. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/platform_node.py +0 -0
  262. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/resource_analyzer_node.py +0 -0
  263. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/resource_optimizer_node.py +0 -0
  264. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/edge/resource_scaler_node.py +0 -0
  265. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/enterprise/__init__.py +0 -0
  266. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/enterprise/audit_logger.py +0 -0
  267. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/enterprise/batch_processor.py +0 -0
  268. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/enterprise/data_lineage.py +0 -0
  269. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/enterprise/mcp_executor.py +0 -0
  270. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/enterprise/service_discovery.py +0 -0
  271. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/enterprise/tenant_assignment.py +0 -0
  272. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/governance.py +0 -0
  273. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/logic/__init__.py +0 -0
  274. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/logic/async_operations.py +0 -0
  275. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/logic/convergence.py +0 -0
  276. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/logic/intelligent_merge.py +0 -0
  277. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/logic/loop.py +0 -0
  278. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/logic/operations.py +0 -0
  279. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/logic/workflow.py +0 -0
  280. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/mixins/__init__.py +0 -0
  281. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/mixins/event_emitter.py +0 -0
  282. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/mixins/mcp.py +0 -0
  283. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/mixins/security.py +0 -0
  284. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/mixins.py +0 -0
  285. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/monitoring/__init__.py +0 -0
  286. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/monitoring/connection_dashboard.py +0 -0
  287. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/monitoring/deadlock_detector.py +0 -0
  288. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/monitoring/health_check.py +0 -0
  289. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/monitoring/log_processor.py +0 -0
  290. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/monitoring/metrics_collector.py +0 -0
  291. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/monitoring/performance_anomaly.py +0 -0
  292. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/monitoring/performance_benchmark.py +0 -0
  293. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/monitoring/race_condition_detector.py +0 -0
  294. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/monitoring/transaction_metrics.py +0 -0
  295. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/monitoring/transaction_monitor.py +0 -0
  296. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/ports.py +0 -0
  297. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/__init__.py +0 -0
  298. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/advanced.py +0 -0
  299. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/agentic.py +0 -0
  300. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/conversational.py +0 -0
  301. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/evaluation.py +0 -0
  302. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/federated.py +0 -0
  303. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/graph.py +0 -0
  304. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/multimodal.py +0 -0
  305. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/optimized.py +0 -0
  306. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/privacy.py +0 -0
  307. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/query_processing.py +0 -0
  308. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/realtime.py +0 -0
  309. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/registry.py +0 -0
  310. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/router.py +0 -0
  311. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/similarity.py +0 -0
  312. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/strategies.py +0 -0
  313. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/rag/workflows.py +0 -0
  314. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/security/__init__.py +0 -0
  315. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/security/abac_evaluator.py +0 -0
  316. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/security/audit_log.py +0 -0
  317. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/security/behavior_analysis.py +0 -0
  318. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/security/credential_manager.py +0 -0
  319. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/security/rotating_credentials.py +0 -0
  320. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/security/security_event.py +0 -0
  321. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/security/threat_detection.py +0 -0
  322. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/system/__init__.py +0 -0
  323. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/system/command_parser.py +0 -0
  324. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/testing/__init__.py +0 -0
  325. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/testing/credential_testing.py +0 -0
  326. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/transaction/__init__.py +0 -0
  327. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/transaction/distributed_transaction_manager.py +0 -0
  328. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/transaction/saga_coordinator.py +0 -0
  329. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/transaction/saga_state_storage.py +0 -0
  330. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/transaction/saga_step.py +0 -0
  331. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/transaction/transaction_context.py +0 -0
  332. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/transaction/two_phase_commit.py +0 -0
  333. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/transform/__init__.py +0 -0
  334. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/transform/chunkers.py +0 -0
  335. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/transform/formatters.py +0 -0
  336. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/transform/processors.py +0 -0
  337. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/validation/__init__.py +0 -0
  338. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/validation/test_executor.py +0 -0
  339. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/validation/validation_nodes.py +0 -0
  340. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/nodes/validation.py +0 -0
  341. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/planning/__init__.py +0 -0
  342. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/planning/dynamic_execution_planner.py +0 -0
  343. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/resources/__init__.py +0 -0
  344. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/resources/factory.py +0 -0
  345. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/resources/health.py +0 -0
  346. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/resources/reference.py +0 -0
  347. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/resources/registry.py +0 -0
  348. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/__init__.py +0 -0
  349. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/access_controlled.py +0 -0
  350. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/async_local.py +0 -0
  351. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/compatibility_reporter.py +0 -0
  352. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/docker.py +0 -0
  353. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/hierarchical_switch_executor.py +0 -0
  354. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/local.py +0 -0
  355. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/monitoring/__init__.py +0 -0
  356. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/monitoring/runtime_monitor.py +0 -0
  357. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/parallel.py +0 -0
  358. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/parallel_cyclic.py +0 -0
  359. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/parameter_injection.py +0 -0
  360. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/parameter_injector.py +0 -0
  361. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/performance_monitor.py +0 -0
  362. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/resource_manager.py +0 -0
  363. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/runner.py +0 -0
  364. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/secret_provider.py +0 -0
  365. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/testing.py +0 -0
  366. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/validation/__init__.py +0 -0
  367. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/validation/connection_context.py +0 -0
  368. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/validation/enhanced_error_formatter.py +0 -0
  369. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/validation/error_categorizer.py +0 -0
  370. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/validation/import_validator.py +0 -0
  371. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/validation/metrics.py +0 -0
  372. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/validation/performance.py +0 -0
  373. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/runtime/validation/suggestion_engine.py +0 -0
  374. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/sdk_exceptions.py +0 -0
  375. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/servers/__init__.py +0 -0
  376. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/servers/durable_workflow_server.py +0 -0
  377. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/servers/enterprise_workflow_server.py +0 -0
  378. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/servers/gateway.py +0 -0
  379. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/servers/workflow_server.py +0 -0
  380. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/testing/__init__.py +0 -0
  381. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/testing/async_test_case.py +0 -0
  382. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/testing/async_utils.py +0 -0
  383. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/testing/fixtures.py +0 -0
  384. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/testing/mock_registry.py +0 -0
  385. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/tracking/__init__.py +0 -0
  386. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/tracking/manager.py +0 -0
  387. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/tracking/metrics_collector.py +0 -0
  388. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/tracking/models.py +0 -0
  389. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/tracking/storage/__init__.py +0 -0
  390. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/tracking/storage/base.py +0 -0
  391. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/tracking/storage/database.py +0 -0
  392. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/tracking/storage/filesystem.py +0 -0
  393. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/__init__.py +0 -0
  394. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/circular_dependency_detector.py +0 -0
  395. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/data_paths.py +0 -0
  396. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/data_validation.py +0 -0
  397. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/export.py +0 -0
  398. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/migrations/__init__.py +0 -0
  399. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/migrations/generator.py +0 -0
  400. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/migrations/models.py +0 -0
  401. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/migrations/runner.py +0 -0
  402. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/resource_manager.py +0 -0
  403. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/secure_logging.py +0 -0
  404. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/utils/templates.py +0 -0
  405. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/visualization/__init__.py +0 -0
  406. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/visualization/api.py +0 -0
  407. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/visualization/dashboard.py +0 -0
  408. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/visualization/performance.py +0 -0
  409. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/visualization/reports.py +0 -0
  410. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/__init__.py +0 -0
  411. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/async_builder.py +0 -0
  412. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/async_patterns.py +0 -0
  413. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/builder.py +0 -0
  414. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/contracts.py +0 -0
  415. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/convergence.py +0 -0
  416. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/cycle_analyzer.py +0 -0
  417. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/cycle_builder.py +0 -0
  418. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/cycle_config.py +0 -0
  419. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/cycle_debugger.py +0 -0
  420. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/cycle_exceptions.py +0 -0
  421. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/cycle_profiler.py +0 -0
  422. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/cycle_state.py +0 -0
  423. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/cyclic_runner.py +0 -0
  424. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/edge_infrastructure.py +0 -0
  425. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/input_handling.py +0 -0
  426. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/mermaid_visualizer.py +0 -0
  427. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/migration.py +0 -0
  428. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/mock_registry.py +0 -0
  429. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/resilience.py +0 -0
  430. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/runner.py +0 -0
  431. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/safety.py +0 -0
  432. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/state.py +0 -0
  433. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/templates.py +0 -0
  434. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/type_inference.py +0 -0
  435. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/validation.py +0 -0
  436. {kailash-0.9.21 → kailash-0.9.22}/src/kailash/workflow/visualization.py +0 -0
  437. {kailash-0.9.21 → kailash-0.9.22}/src/kailash.egg-info/dependency_links.txt +0 -0
  438. {kailash-0.9.21 → kailash-0.9.22}/src/kailash.egg-info/entry_points.txt +0 -0
  439. {kailash-0.9.21 → kailash-0.9.22}/src/kailash.egg-info/not-zip-safe +0 -0
  440. {kailash-0.9.21 → kailash-0.9.22}/src/kailash.egg-info/requires.txt +0 -0
  441. {kailash-0.9.21 → kailash-0.9.22}/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.9.21
3
+ Version: 0.9.22
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
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "kailash"
7
- version = "0.9.21"
7
+ version = "0.9.22"
8
8
  description = "Python SDK for the Kailash container-node architecture"
9
9
  authors = [
10
10
  {name = "Integrum", email = "info@integrum.com"}
@@ -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.9.21",
16
+ version="0.9.22",
17
17
  author="Integrum",
18
18
  author_email="info@integrum.com",
19
19
  description="Python SDK for the Kailash container-node architecture",
@@ -52,7 +52,7 @@ except ImportError:
52
52
  # For backward compatibility
53
53
  WorkflowGraph = Workflow
54
54
 
55
- __version__ = "0.9.21"
55
+ __version__ = "0.9.22"
56
56
 
57
57
  __all__ = [
58
58
  # Core workflow components
@@ -0,0 +1,202 @@
1
+ """
2
+ Tests for WorkflowAPI Custom 404 Handler
3
+
4
+ Tests that WorkflowAPI provides helpful 404 error messages
5
+ with available endpoints when wrong paths are accessed.
6
+
7
+ These tests follow TDD: They will FAIL initially until the 404 handler is implemented.
8
+ This is expected behavior - we write tests FIRST, then implement.
9
+ """
10
+
11
+ import pytest
12
+ from fastapi.testclient import TestClient
13
+
14
+ from kailash.api.workflow_api import WorkflowAPI
15
+ from kailash.workflow.builder import WorkflowBuilder
16
+
17
+
18
+ @pytest.fixture
19
+ def simple_workflow_api():
20
+ """Simple WorkflowAPI for testing"""
21
+ workflow = WorkflowBuilder()
22
+ workflow.add_node(
23
+ "PythonCodeNode", "test", {"code": "result = {'message': 'test'}"}
24
+ )
25
+ api = WorkflowAPI(workflow.build())
26
+ return api
27
+
28
+
29
+ def test_404_returns_helpful_json(simple_workflow_api):
30
+ """Test that 404 errors return helpful JSON with available endpoints."""
31
+ client = TestClient(simple_workflow_api.app)
32
+
33
+ # Try to access non-existent path
34
+ response = client.get("/nonexistent")
35
+
36
+ # Should return 404
37
+ assert response.status_code == 404
38
+
39
+ # Should be JSON
40
+ assert response.headers["content-type"] == "application/json"
41
+
42
+ # Should have helpful error message
43
+ data = response.json()
44
+ assert "error" in data or "detail" in data, "404 response should have error field"
45
+
46
+ # Should mention endpoints or provide helpful info
47
+ response_str = str(data).lower()
48
+ has_endpoint_info = (
49
+ "endpoint" in response_str
50
+ or "available" in response_str
51
+ or "path" in response_str
52
+ )
53
+ assert has_endpoint_info, "404 response should mention endpoints or paths"
54
+
55
+
56
+ def test_404_lists_available_endpoints(simple_workflow_api):
57
+ """Test that 404 response includes list of available endpoints."""
58
+ client = TestClient(simple_workflow_api.app)
59
+
60
+ # Try to access non-existent path
61
+ response = client.get("/invalid_path")
62
+
63
+ assert response.status_code == 404
64
+
65
+ data = response.json()
66
+
67
+ # Should have some reference to available endpoints
68
+ response_str = str(data)
69
+ endpoints = []
70
+
71
+ # Check if standard endpoints are mentioned
72
+ if "/execute" in response_str:
73
+ endpoints.append("/execute")
74
+ if "/workflow/info" in response_str or "/info" in response_str:
75
+ endpoints.append("/workflow/info")
76
+ if "/health" in response_str:
77
+ endpoints.append("/health")
78
+
79
+ # Should mention at least 2 of the 3 standard endpoints
80
+ assert (
81
+ len(endpoints) >= 2
82
+ ), f"404 response should mention available endpoints. Found: {endpoints}"
83
+
84
+
85
+ def test_404_provides_helpful_hint(simple_workflow_api):
86
+ """Test that 404 response provides actionable hint."""
87
+ client = TestClient(simple_workflow_api.app)
88
+
89
+ # Try wrong path
90
+ response = client.get("/wrong")
91
+
92
+ assert response.status_code == 404
93
+
94
+ data = response.json()
95
+ response_str = str(data).lower()
96
+
97
+ # Should have hint, message, or suggestion
98
+ has_helpful_content = (
99
+ "hint" in response_str
100
+ or "try" in response_str
101
+ or "use" in response_str
102
+ or "most common" in response_str
103
+ or "suggestion" in response_str
104
+ or "did you mean" in response_str
105
+ )
106
+
107
+ assert (
108
+ has_helpful_content
109
+ ), "404 response should provide helpful hints or suggestions"
110
+
111
+
112
+ def test_404_includes_documentation_link(simple_workflow_api):
113
+ """Test that 404 response includes link to documentation."""
114
+ client = TestClient(simple_workflow_api.app)
115
+
116
+ response = client.get("/missing")
117
+
118
+ assert response.status_code == 404
119
+ data = response.json()
120
+
121
+ # Should have docs link or path
122
+ response_str = str(data).lower()
123
+ has_docs_reference = (
124
+ "docs" in response_str
125
+ or "documentation" in response_str
126
+ or "/docs" in response_str
127
+ )
128
+ assert has_docs_reference, "404 response should reference documentation"
129
+
130
+
131
+ def test_404_handler_for_root_path(simple_workflow_api):
132
+ """Test 404 handler when accessing root path with wrong method."""
133
+ client = TestClient(simple_workflow_api.app)
134
+
135
+ # Try to GET root (only POST is typically defined for execute)
136
+ response = client.get("/")
137
+
138
+ # Could be 404 or 405 Method Not Allowed
139
+ assert response.status_code in [
140
+ 404,
141
+ 405,
142
+ ], f"Expected 404 or 405, got {response.status_code}"
143
+
144
+ # If 404, should have helpful info
145
+ if response.status_code == 404:
146
+ data = response.json()
147
+ response_str = str(data).lower()
148
+
149
+ # Should mention execute or available methods
150
+ has_helpful_info = (
151
+ "execute" in response_str
152
+ or "post" in response_str
153
+ or "endpoint" in response_str
154
+ )
155
+ assert (
156
+ has_helpful_info
157
+ ), "404 on root should mention execute endpoint or POST method"
158
+
159
+
160
+ def test_404_handler_preserves_fastapi_routes(simple_workflow_api):
161
+ """Test that valid routes still work after adding 404 handler."""
162
+ client = TestClient(simple_workflow_api.app)
163
+
164
+ # Valid route should work
165
+ response = client.get("/health")
166
+
167
+ # Health endpoint should return 200
168
+ assert (
169
+ response.status_code == 200
170
+ ), "Valid routes should still work after adding 404 handler"
171
+
172
+ # Should return JSON
173
+ assert response.headers["content-type"] == "application/json"
174
+
175
+
176
+ def test_404_response_format_consistency(simple_workflow_api):
177
+ """Test that 404 responses have consistent format."""
178
+ client = TestClient(simple_workflow_api.app)
179
+
180
+ # Try multiple invalid paths
181
+ paths = ["/invalid1", "/wrong/path", "/nonexistent/endpoint"]
182
+
183
+ for path in paths:
184
+ response = client.get(path)
185
+ assert response.status_code == 404
186
+
187
+ # All should return JSON
188
+ assert (
189
+ response.headers["content-type"] == "application/json"
190
+ ), f"404 response for {path} should be JSON"
191
+
192
+ # All should have error structure
193
+ data = response.json()
194
+ assert isinstance(
195
+ data, dict
196
+ ), f"404 response for {path} should be a JSON object"
197
+
198
+ # Should have at least one error-related field
199
+ has_error_field = any(key in data for key in ["error", "detail", "message"])
200
+ assert (
201
+ has_error_field
202
+ ), f"404 response for {path} should have error/detail/message field"
@@ -12,7 +12,7 @@ from typing import Any
12
12
 
13
13
  import uvicorn
14
14
  from fastapi import BackgroundTasks, FastAPI, HTTPException, Request
15
- from fastapi.responses import StreamingResponse
15
+ from fastapi.responses import JSONResponse, StreamingResponse
16
16
  from pydantic import BaseModel, Field
17
17
 
18
18
  from kailash.runtime.local import LocalRuntime
@@ -129,6 +129,38 @@ class WorkflowAPI:
129
129
  def _setup_routes(self):
130
130
  """Setup API routes dynamically based on workflow."""
131
131
 
132
+ # Custom 404 handler for helpful error messages
133
+ @self.app.exception_handler(404)
134
+ async def custom_404_handler(request: Request, exc):
135
+ """Provide helpful 404 error with available endpoints."""
136
+ return JSONResponse(
137
+ status_code=404,
138
+ content={
139
+ "error": "Endpoint not found",
140
+ "path": request.url.path,
141
+ "message": "The requested endpoint does not exist for this workflow.",
142
+ "available_endpoints": [
143
+ {
144
+ "method": "POST",
145
+ "path": "/execute",
146
+ "description": "Execute the workflow with input parameters",
147
+ },
148
+ {
149
+ "method": "GET",
150
+ "path": "/workflow/info",
151
+ "description": "Get workflow metadata and structure",
152
+ },
153
+ {
154
+ "method": "GET",
155
+ "path": "/health",
156
+ "description": "Check workflow API health status",
157
+ },
158
+ ],
159
+ "hint": "Most common: POST to /execute endpoint with JSON body containing 'inputs' field",
160
+ "documentation": "/docs",
161
+ },
162
+ )
163
+
132
164
  # Root execution endpoint (convenience for direct workflow execution)
133
165
  @self.app.post("/")
134
166
  async def execute_workflow_root(
@@ -202,11 +202,13 @@ class Node(ABC):
202
202
  - Validates parameters are correctly specified
203
203
  """
204
204
  try:
205
- self.id = kwargs.get("id", self.__class__.__name__)
205
+ # Use _node_id for internal node identifier (namespace separation)
206
+ # This prevents collision with user's 'id' parameter
207
+ self._node_id = kwargs.get("_node_id", self.__class__.__name__)
206
208
  self.metadata = kwargs.get(
207
209
  "metadata",
208
210
  NodeMetadata(
209
- id=self.id,
211
+ id=self._node_id, # NodeMetadata still uses 'id' internally
210
212
  name=kwargs.get("name", self.__class__.__name__),
211
213
  description=kwargs.get("description", self.__doc__ or ""),
212
214
  version=kwargs.get("version", "1.0.0"),
@@ -214,7 +216,7 @@ class Node(ABC):
214
216
  tags=kwargs.get("tags", set()),
215
217
  ),
216
218
  )
217
- self.logger = logging.getLogger(f"kailash.nodes.{self.id}")
219
+ self.logger = logging.getLogger(f"kailash.nodes.{self._node_id}")
218
220
 
219
221
  # Filter out internal fields from config with comprehensive parameter handling
220
222
  # Get parameter definitions once and cache for both filtering and validation
@@ -232,11 +234,12 @@ class Node(ABC):
232
234
 
233
235
  # Comprehensive parameter filtering: handle ALL potential conflicts
234
236
  # Fields that are always internal (never user parameters)
235
- always_internal = {"metadata"}
237
+ always_internal = {"metadata", "_node_id"}
236
238
 
237
239
  # Fields that can be either internal or user parameters
240
+ # Note: 'id' removed from this list - users can now use 'id' freely
241
+ # since node identifier is now '_node_id'
238
242
  potentially_user_params = {
239
- "id",
240
243
  "name",
241
244
  "description",
242
245
  "version",
@@ -344,6 +347,32 @@ class Node(ABC):
344
347
  self._workflow_context = {}
345
348
  self._workflow_context[key] = value
346
349
 
350
+ @property
351
+ def id(self) -> str:
352
+ """
353
+ Backward compatibility property for node identifier.
354
+
355
+ Returns the node's identifier (_node_id). This property maintains
356
+ backward compatibility for code that accesses node.id.
357
+
358
+ The internal identifier is now _node_id to prevent namespace collision
359
+ with user's 'id' parameter.
360
+ """
361
+ return self._node_id
362
+
363
+ @id.setter
364
+ def id(self, value: str):
365
+ """
366
+ Setter for backward compatibility with code that sets node.id.
367
+
368
+ This allows graph.py and other code to set the node identifier
369
+ while internally using _node_id for namespace separation.
370
+
371
+ Args:
372
+ value: The node identifier to set
373
+ """
374
+ self._node_id = value
375
+
347
376
  @abstractmethod
348
377
  def get_parameters(self) -> dict[str, NodeParameter]:
349
378
  """Define the parameters this node accepts.
@@ -412,8 +412,11 @@ class CodeExecutor:
412
412
  # Check code safety first
413
413
  is_safe, violations, imports_found = self.check_code_safety(code)
414
414
 
415
- # Sanitize inputs
416
- sanitized_inputs = validate_node_parameters(inputs, self.security_config)
415
+ # Sanitize inputs with python_exec context
416
+ # Python code execution via exec() does not need shell metacharacter sanitization
417
+ sanitized_inputs = validate_node_parameters(
418
+ inputs, self.security_config, context="python_exec"
419
+ )
417
420
 
418
421
  # Create isolated namespace
419
422
  import builtins
@@ -572,8 +575,11 @@ class CodeExecutor:
572
575
  Raises:
573
576
  NodeExecutionError: If function execution fails
574
577
  """
575
- # Sanitize inputs for security
576
- sanitized_inputs = validate_node_parameters(inputs, self.security_config)
578
+ # Sanitize inputs for security with python_exec context
579
+ # Python function execution does not need shell metacharacter sanitization
580
+ sanitized_inputs = validate_node_parameters(
581
+ inputs, self.security_config, context="python_exec"
582
+ )
577
583
 
578
584
  try:
579
585
  # Get function signature
@@ -475,6 +475,7 @@ def sanitize_input(
475
475
  max_length: int = 10000,
476
476
  allowed_types: list[type] | None = None,
477
477
  config: SecurityConfig | None = None,
478
+ context: str = "generic",
478
479
  ) -> Any:
479
480
  """
480
481
  Sanitize input values to prevent injection attacks.
@@ -484,12 +485,22 @@ def sanitize_input(
484
485
  max_length: Maximum string length
485
486
  allowed_types: List of allowed types
486
487
  config: Security configuration
488
+ context: Execution context for context-aware sanitization.
489
+ - "generic": Default moderate sanitization (backward compatible)
490
+ - "python_exec": Python code execution (preserves shell metacharacters)
491
+ - "shell_exec": Shell command execution (removes all dangerous characters)
487
492
 
488
493
  Returns:
489
494
  Sanitized value
490
495
 
491
496
  Raises:
492
497
  SecurityError: If input fails validation
498
+
499
+ Note:
500
+ The context parameter allows for appropriate security measures based on
501
+ how the data will be used. Python code execution via exec() does not
502
+ need shell metacharacter sanitization since characters like $, ;, &, |
503
+ are regular Python string characters and not executed by a shell.
493
504
  """
494
505
  if config is None:
495
506
  config = get_security_config()
@@ -751,32 +762,59 @@ def sanitize_input(
751
762
  if len(value) > max_length:
752
763
  raise SecurityError(f"Input too long: {len(value)} > {max_length}")
753
764
 
754
- # Remove potentially dangerous characters and patterns
755
- sanitized = re.sub(r"[<>;&|`$()]", "", value)
756
- # Remove script tags and javascript
757
- sanitized = re.sub(
758
- r"<script.*?</script>", "", sanitized, flags=re.IGNORECASE | re.DOTALL
759
- )
760
- sanitized = re.sub(r"javascript:", "", sanitized, flags=re.IGNORECASE)
765
+ # Context-aware sanitization
766
+ if context == "python_exec":
767
+ # Python execution context: Only remove XSS patterns, preserve shell metacharacters
768
+ # Python exec() does not execute shell commands, so $, ;, &, |, `, (, ) are safe
769
+ sanitized = re.sub(
770
+ r"<script.*?</script>", "", value, flags=re.IGNORECASE | re.DOTALL
771
+ )
772
+ sanitized = re.sub(r"javascript:", "", sanitized, flags=re.IGNORECASE)
773
+ # Remove only the most dangerous HTML tags for XSS prevention
774
+ sanitized = re.sub(
775
+ r"</?(?:script|iframe|object|embed).*?>",
776
+ "",
777
+ sanitized,
778
+ flags=re.IGNORECASE,
779
+ )
780
+ elif context == "shell_exec":
781
+ # Shell execution context: Remove all shell metacharacters
782
+ sanitized = re.sub(r"[<>;&|`$()]", "", value)
783
+ sanitized = re.sub(
784
+ r"<script.*?</script>", "", sanitized, flags=re.IGNORECASE | re.DOTALL
785
+ )
786
+ sanitized = re.sub(r"javascript:", "", sanitized, flags=re.IGNORECASE)
787
+ else:
788
+ # Generic context: Moderate sanitization (backward compatible)
789
+ # Remove only basic XSS patterns, preserve most characters
790
+ sanitized = re.sub(
791
+ r"<script.*?</script>", "", value, flags=re.IGNORECASE | re.DOTALL
792
+ )
793
+ sanitized = re.sub(r"javascript:", "", sanitized, flags=re.IGNORECASE)
794
+ # Remove angle brackets for basic XSS protection
795
+ sanitized = re.sub(r"[<>]", "", sanitized)
761
796
 
762
797
  if sanitized != value and config.enable_audit_logging:
763
- logger.warning(f"Input sanitized: {value[:50]}... -> {sanitized[:50]}...")
798
+ logger.warning(
799
+ f"Input sanitized ({context}): {value[:50]}... -> {sanitized[:50]}..."
800
+ )
764
801
 
765
802
  return sanitized
766
803
 
767
804
  # Dictionary sanitization (recursive)
768
805
  if isinstance(value, dict):
769
806
  return {
770
- sanitize_input(k, max_length, allowed_types, config): sanitize_input(
771
- v, max_length, allowed_types, config
772
- )
807
+ sanitize_input(
808
+ k, max_length, allowed_types, config, context
809
+ ): sanitize_input(v, max_length, allowed_types, config, context)
773
810
  for k, v in value.items()
774
811
  }
775
812
 
776
813
  # List sanitization (recursive)
777
814
  if isinstance(value, list):
778
815
  return [
779
- sanitize_input(item, max_length, allowed_types, config) for item in value
816
+ sanitize_input(item, max_length, allowed_types, config, context)
817
+ for item in value
780
818
  ]
781
819
 
782
820
  return value
@@ -811,7 +849,9 @@ def create_secure_temp_dir(
811
849
 
812
850
 
813
851
  def validate_node_parameters(
814
- parameters: dict[str, Any], config: SecurityConfig | None = None
852
+ parameters: dict[str, Any],
853
+ config: SecurityConfig | None = None,
854
+ context: str = "generic",
815
855
  ) -> dict[str, Any]:
816
856
  """
817
857
  Validate and sanitize node parameters.
@@ -819,6 +859,10 @@ def validate_node_parameters(
819
859
  Args:
820
860
  parameters: Node parameters to validate
821
861
  config: Security configuration
862
+ context: Execution context for context-aware sanitization
863
+ - "generic": Default moderate sanitization
864
+ - "python_exec": Python code execution (preserves shell metacharacters)
865
+ - "shell_exec": Shell command execution (removes all dangerous characters)
822
866
 
823
867
  Returns:
824
868
  Validated and sanitized parameters
@@ -833,20 +877,22 @@ def validate_node_parameters(
833
877
 
834
878
  for key, value in parameters.items():
835
879
  # Sanitize parameter key
836
- clean_key = sanitize_input(key, config=config)
880
+ clean_key = sanitize_input(key, config=config, context=context)
837
881
 
838
882
  # Special handling for file paths
839
883
  if "path" in key.lower() or "file" in key.lower():
840
884
  if isinstance(value, (str, Path)):
841
885
  validated_value = validate_file_path(value, config, f"parameter {key}")
842
886
  else:
843
- validated_value = sanitize_input(value, config=config)
887
+ validated_value = sanitize_input(value, config=config, context=context)
844
888
  else:
845
- validated_value = sanitize_input(value, config=config)
889
+ validated_value = sanitize_input(value, config=config, context=context)
846
890
 
847
891
  validated_params[clean_key] = validated_value
848
892
 
849
893
  if config.enable_audit_logging:
850
- logger.info(f"Node parameters validated: {list(validated_params.keys())}")
894
+ logger.info(
895
+ f"Node parameters validated ({context}): {list(validated_params.keys())}"
896
+ )
851
897
 
852
898
  return validated_params
@@ -154,19 +154,19 @@ class Workflow:
154
154
 
155
155
  try:
156
156
  # Handle different constructor patterns
157
- if "name" in params and "id" not in params:
157
+ if "name" in params and "_node_id" not in params:
158
158
  # Node expects 'name' parameter (like PythonCodeNode)
159
159
  if "name" not in config:
160
160
  config = config.copy() # Don't modify original
161
161
  config["name"] = node_id
162
162
  return node_class(**config)
163
- elif "id" in params:
164
- # Node expects 'id' parameter (traditional pattern)
165
- return node_class(id=node_id, **config)
163
+ elif "_node_id" in params:
164
+ # Node expects '_node_id' parameter (namespace-separated metadata)
165
+ return node_class(_node_id=node_id, **config)
166
166
  else:
167
167
  # Fallback: try both patterns
168
168
  try:
169
- return node_class(id=node_id, **config)
169
+ return node_class(_node_id=node_id, **config)
170
170
  except TypeError:
171
171
  # Try with name parameter
172
172
  config = config.copy()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kailash
3
- Version: 0.9.21
3
+ Version: 0.9.22
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
@@ -33,6 +33,7 @@ src/kailash/api/gateway.py
33
33
  src/kailash/api/mcp_integration.py
34
34
  src/kailash/api/studio.py
35
35
  src/kailash/api/workflow_api.py
36
+ src/kailash/api/tests/test_workflow_api_404.py
36
37
  src/kailash/channels/__init__.py
37
38
  src/kailash/channels/api_channel.py
38
39
  src/kailash/channels/base.py
File without changes
File without changes
File without changes
File without changes
File without changes