kailash 0.5.0__py3-none-any.whl → 0.6.0__py3-none-any.whl

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 (57) hide show
  1. kailash/__init__.py +1 -1
  2. kailash/client/__init__.py +12 -0
  3. kailash/client/enhanced_client.py +306 -0
  4. kailash/core/actors/__init__.py +16 -0
  5. kailash/core/actors/connection_actor.py +566 -0
  6. kailash/core/actors/supervisor.py +364 -0
  7. kailash/edge/__init__.py +16 -0
  8. kailash/edge/compliance.py +834 -0
  9. kailash/edge/discovery.py +659 -0
  10. kailash/edge/location.py +582 -0
  11. kailash/gateway/__init__.py +33 -0
  12. kailash/gateway/api.py +289 -0
  13. kailash/gateway/enhanced_gateway.py +357 -0
  14. kailash/gateway/resource_resolver.py +217 -0
  15. kailash/gateway/security.py +227 -0
  16. kailash/middleware/auth/models.py +2 -2
  17. kailash/middleware/database/base_models.py +1 -7
  18. kailash/middleware/gateway/__init__.py +22 -0
  19. kailash/middleware/gateway/checkpoint_manager.py +398 -0
  20. kailash/middleware/gateway/deduplicator.py +382 -0
  21. kailash/middleware/gateway/durable_gateway.py +417 -0
  22. kailash/middleware/gateway/durable_request.py +498 -0
  23. kailash/middleware/gateway/event_store.py +459 -0
  24. kailash/nodes/admin/permission_check.py +817 -33
  25. kailash/nodes/admin/role_management.py +1242 -108
  26. kailash/nodes/admin/schema_manager.py +438 -0
  27. kailash/nodes/admin/user_management.py +1124 -1582
  28. kailash/nodes/code/__init__.py +8 -1
  29. kailash/nodes/code/async_python.py +1035 -0
  30. kailash/nodes/code/python.py +1 -0
  31. kailash/nodes/data/async_sql.py +9 -3
  32. kailash/nodes/data/sql.py +20 -11
  33. kailash/nodes/data/workflow_connection_pool.py +643 -0
  34. kailash/nodes/rag/__init__.py +1 -4
  35. kailash/resources/__init__.py +40 -0
  36. kailash/resources/factory.py +533 -0
  37. kailash/resources/health.py +319 -0
  38. kailash/resources/reference.py +288 -0
  39. kailash/resources/registry.py +392 -0
  40. kailash/runtime/async_local.py +711 -302
  41. kailash/testing/__init__.py +34 -0
  42. kailash/testing/async_test_case.py +353 -0
  43. kailash/testing/async_utils.py +345 -0
  44. kailash/testing/fixtures.py +458 -0
  45. kailash/testing/mock_registry.py +495 -0
  46. kailash/workflow/__init__.py +8 -0
  47. kailash/workflow/async_builder.py +621 -0
  48. kailash/workflow/async_patterns.py +766 -0
  49. kailash/workflow/cyclic_runner.py +107 -16
  50. kailash/workflow/graph.py +7 -2
  51. kailash/workflow/resilience.py +11 -1
  52. {kailash-0.5.0.dist-info → kailash-0.6.0.dist-info}/METADATA +7 -4
  53. {kailash-0.5.0.dist-info → kailash-0.6.0.dist-info}/RECORD +57 -22
  54. {kailash-0.5.0.dist-info → kailash-0.6.0.dist-info}/WHEEL +0 -0
  55. {kailash-0.5.0.dist-info → kailash-0.6.0.dist-info}/entry_points.txt +0 -0
  56. {kailash-0.5.0.dist-info → kailash-0.6.0.dist-info}/licenses/LICENSE +0 -0
  57. {kailash-0.5.0.dist-info → kailash-0.6.0.dist-info}/top_level.txt +0 -0
@@ -297,19 +297,29 @@ class CyclicWorkflowExecutor:
297
297
  entry_nodes = set()
298
298
  exit_nodes = set()
299
299
 
300
+ # First, collect all nodes in the cycle
300
301
  for source, target, data in cycle_edges:
301
302
  cycle_nodes.add(source)
302
303
  cycle_nodes.add(target)
303
304
 
305
+ # Then identify entry and exit nodes
306
+ for node in cycle_nodes:
304
307
  # Entry nodes have incoming edges from non-cycle nodes
305
- for pred in workflow.graph.predecessors(target):
308
+ for pred in workflow.graph.predecessors(node):
306
309
  if pred not in cycle_nodes:
307
- entry_nodes.add(target)
310
+ entry_nodes.add(node)
311
+ logger.debug(
312
+ f"Cycle {cycle_id}: Node {node} is an entry node (has predecessor {pred})"
313
+ )
308
314
 
309
315
  # Exit nodes have outgoing edges to non-cycle nodes
310
- for succ in workflow.graph.successors(source):
316
+ for succ in workflow.graph.successors(node):
311
317
  if succ not in cycle_nodes:
312
- exit_nodes.add(source)
318
+ exit_nodes.add(node)
319
+
320
+ logger.debug(
321
+ f"Cycle {cycle_id}: nodes={cycle_nodes}, entry_nodes={entry_nodes}, exit_nodes={exit_nodes}"
322
+ )
313
323
 
314
324
  plan.add_cycle_group(
315
325
  cycle_id=cycle_id,
@@ -320,7 +330,7 @@ class CyclicWorkflowExecutor:
320
330
  )
321
331
 
322
332
  # Build execution stages
323
- plan.build_stages(topo_order, dag_graph)
333
+ plan.build_stages(topo_order, dag_graph, workflow)
324
334
 
325
335
  return plan
326
336
 
@@ -628,6 +638,10 @@ class CyclicWorkflowExecutor:
628
638
  # Gather inputs from connections
629
639
  inputs = {}
630
640
 
641
+ logger.debug(
642
+ f"_execute_node {node_id}: state.node_outputs keys = {list(state.node_outputs.keys())}"
643
+ )
644
+
631
645
  # Check if we're in a cycle and this is not the first iteration
632
646
  in_cycle = cycle_state is not None
633
647
  is_cycle_iteration = in_cycle and cycle_state.iteration > 0
@@ -654,6 +668,9 @@ class CyclicWorkflowExecutor:
654
668
 
655
669
  # Apply mapping
656
670
  mapping = edge_data.get("mapping", {})
671
+ logger.debug(
672
+ f"Edge {pred} -> {node_id}: mapping = {mapping}, pred_output keys = {list(pred_output.keys()) if isinstance(pred_output, dict) else type(pred_output)}"
673
+ )
657
674
  for src_key, dst_key in mapping.items():
658
675
  # Handle nested output access
659
676
  if "." in src_key:
@@ -669,6 +686,9 @@ class CyclicWorkflowExecutor:
669
686
  inputs[dst_key] = value
670
687
  elif isinstance(pred_output, dict) and src_key in pred_output:
671
688
  inputs[dst_key] = pred_output[src_key]
689
+ logger.debug(
690
+ f"Mapped {src_key} -> {dst_key}: {type(pred_output[src_key])}, length={len(pred_output[src_key]) if hasattr(pred_output[src_key], '__len__') else 'N/A'}"
691
+ )
672
692
  elif src_key == "output":
673
693
  # Default output mapping
674
694
  inputs[dst_key] = pred_output
@@ -698,12 +718,11 @@ class CyclicWorkflowExecutor:
698
718
  # Order: config < initial_parameters < connection inputs
699
719
  merged_inputs = {**node.config}
700
720
 
701
- # Add initial parameters if available and node hasn't been executed yet
721
+ # Add initial parameters if available
722
+ # For cycle nodes, initial parameters should be available throughout all iterations
702
723
  if hasattr(state, "initial_parameters") and node_id in state.initial_parameters:
703
- if node_id not in state.node_outputs or (
704
- cycle_state and cycle_state.iteration == 0
705
- ):
706
- # Use initial parameters on first execution
724
+ if node_id not in state.node_outputs or cycle_state is not None:
725
+ # Use initial parameters on first execution or for any cycle iteration
707
726
  merged_inputs.update(state.initial_parameters[node_id])
708
727
 
709
728
  # Connection inputs override everything
@@ -712,6 +731,10 @@ class CyclicWorkflowExecutor:
712
731
  # Filter out None values to avoid security validation errors
713
732
  merged_inputs = {k: v for k, v in merged_inputs.items() if v is not None}
714
733
 
734
+ logger.debug(
735
+ f"Final merged_inputs for {node_id}: keys={list(merged_inputs.keys())}"
736
+ )
737
+
715
738
  # Create task for node execution if task manager available
716
739
  task = None
717
740
  if task_manager and state.run_id:
@@ -837,12 +860,15 @@ class ExecutionPlan:
837
860
  edges=edges,
838
861
  )
839
862
 
840
- def build_stages(self, topo_order: list[str], dag_graph: nx.DiGraph) -> None:
863
+ def build_stages(
864
+ self, topo_order: list[str], dag_graph: nx.DiGraph, workflow: Workflow
865
+ ) -> None:
841
866
  """Build execution stages.
842
867
 
843
868
  Args:
844
869
  topo_order: Topological order of DAG nodes
845
870
  dag_graph: DAG portion of the graph
871
+ workflow: The full workflow for checking dependencies
846
872
  """
847
873
  # Track which nodes have been scheduled
848
874
  scheduled = set()
@@ -873,18 +899,83 @@ class ExecutionPlan:
873
899
  f"in_cycle_id value: {in_cycle_id}, found_cycle_group: {found_cycle_group is not None}"
874
900
  )
875
901
  if found_cycle_group is not None:
876
- logger.debug(f"Scheduling cycle group {in_cycle_id} for node {node_id}")
877
- # Schedule entire cycle group
878
- self.stages.append(
879
- ExecutionStage(is_cycle=True, cycle_group=found_cycle_group)
902
+ # Check if all DAG dependencies of cycle entry nodes are satisfied
903
+ can_schedule_cycle = True
904
+ logger.debug(
905
+ f"Checking dependencies for cycle {in_cycle_id}, entry_nodes: {found_cycle_group.entry_nodes}"
880
906
  )
881
- scheduled.update(found_cycle_group.nodes)
907
+ for entry_node in found_cycle_group.entry_nodes:
908
+ # Check all predecessors of this entry node in the FULL workflow graph
909
+ # (dag_graph only contains DAG edges, not connections to cycle nodes)
910
+ preds = list(workflow.graph.predecessors(entry_node))
911
+ logger.debug(
912
+ f"Entry node {entry_node} has predecessors: {preds}, scheduled: {scheduled}"
913
+ )
914
+ for pred in preds:
915
+ # Skip self-cycles and nodes within the same cycle group
916
+ logger.debug(
917
+ f"Checking pred {pred}: in scheduled? {pred in scheduled}, in cycle? {pred in found_cycle_group.nodes}"
918
+ )
919
+ if (
920
+ pred not in scheduled
921
+ and pred not in found_cycle_group.nodes
922
+ ):
923
+ # This predecessor hasn't been scheduled yet
924
+ logger.debug(
925
+ f"Cannot schedule cycle {in_cycle_id} yet - entry node {entry_node} "
926
+ f"depends on unscheduled node {pred}"
927
+ )
928
+ can_schedule_cycle = False
929
+ break
930
+ if not can_schedule_cycle:
931
+ break
932
+
933
+ if can_schedule_cycle:
934
+ logger.debug(
935
+ f"Scheduling cycle group {in_cycle_id} for node {node_id}"
936
+ )
937
+ # Schedule entire cycle group
938
+ self.stages.append(
939
+ ExecutionStage(is_cycle=True, cycle_group=found_cycle_group)
940
+ )
941
+ scheduled.update(found_cycle_group.nodes)
942
+ else:
943
+ # Skip this node for now, it will be scheduled when its dependencies are met
944
+ logger.debug(
945
+ f"Deferring cycle group {in_cycle_id} - dependencies not met"
946
+ )
947
+ continue
882
948
  else:
883
949
  logger.debug(f"Scheduling DAG node {node_id}")
884
950
  # Schedule DAG node
885
951
  self.stages.append(ExecutionStage(is_cycle=False, nodes=[node_id]))
886
952
  scheduled.add(node_id)
887
953
 
954
+ # After processing all nodes in topological order, check for any unscheduled cycle groups
955
+ for cycle_id, cycle_group in self.cycle_groups.items():
956
+ if not any(node in scheduled for node in cycle_group.nodes):
957
+ # This cycle group hasn't been scheduled yet
958
+ # Check if all dependencies are now satisfied
959
+ can_schedule = True
960
+ for entry_node in cycle_group.entry_nodes:
961
+ for pred in workflow.graph.predecessors(entry_node):
962
+ if pred not in scheduled and pred not in cycle_group.nodes:
963
+ logger.warning(
964
+ f"Cycle group {cycle_id} has unsatisfied dependency: "
965
+ f"{entry_node} depends on {pred}"
966
+ )
967
+ can_schedule = False
968
+ break
969
+ if not can_schedule:
970
+ break
971
+
972
+ if can_schedule:
973
+ logger.debug(f"Scheduling deferred cycle group {cycle_id}")
974
+ self.stages.append(
975
+ ExecutionStage(is_cycle=True, cycle_group=cycle_group)
976
+ )
977
+ scheduled.update(cycle_group.nodes)
978
+
888
979
 
889
980
  class ExecutionStage:
890
981
  """Single stage in execution plan."""
kailash/workflow/graph.py CHANGED
@@ -657,9 +657,14 @@ class Workflow:
657
657
  cycle_groups = {}
658
658
  _, cycle_edges = self.separate_dag_and_cycle_edges()
659
659
 
660
- # First pass: group by cycle_id as before
660
+ # First pass: group by cycle_id, using edge-based IDs when not specified
661
661
  for source, target, data in cycle_edges:
662
- cycle_id = data.get("cycle_id", "default")
662
+ # Generate unique cycle_id based on edge if not provided
663
+ cycle_id = data.get("cycle_id")
664
+ if cycle_id is None:
665
+ # Create unique ID based on the cycle edge
666
+ cycle_id = f"cycle_{source}_{target}"
667
+
663
668
  if cycle_id not in cycle_groups:
664
669
  cycle_groups[cycle_id] = []
665
670
  cycle_groups[cycle_id].append((source, target, data))
@@ -6,7 +6,7 @@ including retry policies, fallback nodes, and circuit breakers.
6
6
 
7
7
  import asyncio
8
8
  import time
9
- from dataclasses import dataclass, field
9
+ from dataclasses import asdict, dataclass, field
10
10
  from datetime import datetime
11
11
  from enum import Enum
12
12
  from typing import Any, Callable, Dict, List, Optional, Union
@@ -50,6 +50,16 @@ class RetryPolicy:
50
50
 
51
51
  return min(delay, self.max_delay)
52
52
 
53
+ def to_dict(self) -> dict:
54
+ """Convert RetryPolicy to dictionary."""
55
+ return {
56
+ "max_retries": self.max_retries,
57
+ "strategy": self.strategy.value,
58
+ "base_delay": self.base_delay,
59
+ "max_delay": self.max_delay,
60
+ "retry_on": [cls.__name__ for cls in self.retry_on],
61
+ }
62
+
53
63
 
54
64
  @dataclass
55
65
  class CircuitBreakerConfig:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kailash
3
- Version: 0.5.0
3
+ Version: 0.6.0
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
@@ -61,6 +61,8 @@ Requires-Dist: asyncpg>=0.30.0
61
61
  Requires-Dist: aiomysql>=0.2.0
62
62
  Requires-Dist: twilio>=9.6.3
63
63
  Requires-Dist: qrcode>=8.2
64
+ Requires-Dist: aiofiles>=24.1.0
65
+ Requires-Dist: bcrypt>=4.3.0
64
66
  Provides-Extra: dev
65
67
  Requires-Dist: pytest>=7.0; extra == "dev"
66
68
  Requires-Dist: pytest-cov>=3.0; extra == "dev"
@@ -80,8 +82,9 @@ Dynamic: requires-python
80
82
  <a href="https://pepy.tech/project/kailash"><img src="https://static.pepy.tech/badge/kailash" alt="Downloads"></a>
81
83
  <img src="https://img.shields.io/badge/license-MIT-green.svg" alt="MIT License">
82
84
  <img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Code style: black">
83
- <img src="https://img.shields.io/badge/tests-127%20organized-brightgreen.svg" alt="Tests: 127 organized">
84
- <img src="https://img.shields.io/badge/test%20structure-reorganized-blue.svg" alt="Test structure: reorganized">
85
+ <img src="https://img.shields.io/badge/tests-production%20quality-brightgreen.svg" alt="Tests: Production Quality">
86
+ <img src="https://img.shields.io/badge/docker-integrated-blue.svg" alt="Docker: Integrated">
87
+ <img src="https://img.shields.io/badge/AI-ollama%20validated-purple.svg" alt="AI: Ollama Validated">
85
88
  </p>
86
89
 
87
90
  <p align="center">
@@ -121,6 +124,7 @@ Dynamic: requires-python
121
124
  - 🔄 **Zero-Downtime Operations**: Automatic credential rotation with enterprise notifications and audit trails
122
125
  - 🌉 **Enterprise Middleware (v0.4.0)**: Production-ready middleware architecture with real-time agent-frontend communication, dynamic workflows, and AI chat integration
123
126
  - ⚡ **Performance Revolution (v0.5.0)**: 10-100x faster parameter resolution, clear async/sync separation, automatic resource management
127
+ - 🧪 **Production-Quality Testing (v0.5.0)**: Comprehensive testing infrastructure with Docker integration, AI workflows, and real-world business scenarios
124
128
 
125
129
  ## 🏗️ Project Architecture
126
130
 
@@ -177,7 +181,6 @@ pip install kailash[user-management]
177
181
  # Everything
178
182
  pip install kailash[all]
179
183
  ```
180
- >>>>>>> origin/main
181
184
 
182
185
  ## 🎯 Who Is This For?
183
186
 
@@ -1,4 +1,4 @@
1
- kailash/__init__.py,sha256=DNNHLV-T781fKqEzh6k-FKu74CJHZG9hsjx6a9xxV48,1724
1
+ kailash/__init__.py,sha256=sYi59rDLq7hzsiA5ayT8JQ9SVfZLgbXV2WTK4xvg7Nc,1724
2
2
  kailash/__main__.py,sha256=vr7TVE5o16V6LsTmRFKG6RDKUXHpIWYdZ6Dok2HkHnI,198
3
3
  kailash/access_control.py,sha256=2ctdRFeSeu-d7DU04Aovxh6Rt_4t3IyQfkKEjTeQiMM,25519
4
4
  kailash/access_control_abac.py,sha256=FPfa_8PuDP3AxTjdWfiH3ntwWO8NodA0py9W8SE5dno,30263
@@ -17,10 +17,24 @@ kailash/api/studio.py,sha256=F48J0dzqv48n_OiGPR7VGQk7KfH39yHNk9rQNM_-fJM,34888
17
17
  kailash/api/workflow_api.py,sha256=1Y8EfjqBJrs9rettbGHH_SifDi1c-cwibDk3GGG-NUo,13139
18
18
  kailash/cli/__init__.py,sha256=kJaqsBp3fRmagJhqA6LMwMbEa_Vkz93hIPH3W5Mn5r0,97
19
19
  kailash/cli/commands.py,sha256=lv1S1uB0JQE4tiQCJIa1HCbjYDbFE9KwcK3M1jRtRU4,18168
20
+ kailash/client/__init__.py,sha256=WNR39t4O6TDQLI14uR_MjQpLza2c6rU3YkQCXcGCiSU,293
21
+ kailash/client/enhanced_client.py,sha256=trcDWQsON0Hphj14WozVMbfU7HKuxauknzDfoy1fTlo,9431
20
22
  kailash/config/__init__.py,sha256=9qNwtvXAVV-KkHbuL1ZbtC6yXDtowH4YoFiOP-Qbe-w,638
21
23
  kailash/config/database_config.py,sha256=rdlqIP9WUzC0kvAdSjno1LMpu_bEy2v5FgFdgJy-qsc,11588
24
+ kailash/core/actors/__init__.py,sha256=o8CrwZRTPW5uB3UZiiFtz34n1Q-XBoKNwTz5NMTDQgA,433
25
+ kailash/core/actors/connection_actor.py,sha256=TFqlYPEnV8Hjmc706tdRzEw9pBJs2OieH8UeaOrWYIo,18949
26
+ kailash/core/actors/supervisor.py,sha256=7_YXm9o4O_xBs5YxsDFt7RjzaMvTbKcK-jd4KPmSt1M,11968
22
27
  kailash/database/__init__.py,sha256=keUIl-BhRMSR7ohW4kojaEYCzKmeb_pb4IpWqDqfnOk,686
23
28
  kailash/database/execution_pipeline.py,sha256=1Y-iVXKPoCED3dRoQvOZe1lQyff92NJ__q77NPI0CRQ,16453
29
+ kailash/edge/__init__.py,sha256=-jhM4xaDAUCbwrq6jJjRCdlf49XDULVTcvfsUiqz_qg,447
30
+ kailash/edge/compliance.py,sha256=tUiKiib7FjNtZ62ThQIRhxkehOddndTGLu-Y4He7iRQ,31951
31
+ kailash/edge/discovery.py,sha256=tEV7W2XVPfEgEOM5oaRAlWAtuXV3M4xM07Z7OcnXZxY,24311
32
+ kailash/edge/location.py,sha256=ZrG4CqN-taZFo9VDLvZ2z1lNiTHgXcZvzBJS9meXY8k,19717
33
+ kailash/gateway/__init__.py,sha256=zh2uCsDHi82pZ_tGJklsH_FS-Mx9V31r0hkxk48CM-g,927
34
+ kailash/gateway/api.py,sha256=rvbqV85Av1w7b0FsOg9pulcguu1Oq0D37t029N-tqsA,9478
35
+ kailash/gateway/enhanced_gateway.py,sha256=WYs56k31VLRbfryeRwuiahDAL59aHk99eGrmGtvuD0A,13389
36
+ kailash/gateway/resource_resolver.py,sha256=IC1dceiKfjfUWToYCIBcrUapuR3LlDG6RJ4o7haLY10,7746
37
+ kailash/gateway/security.py,sha256=kf4Quf6u7dqhs80fQQ982eHbRb4weDKG0DaYNeKntT4,7557
24
38
  kailash/mcp/__init__.py,sha256=jQHP7EVT126QXmi0TqR1mU3QNrUeEB4oIC4sD4B2a8c,1813
25
39
  kailash/mcp/ai_registry_server.py,sha256=9pOzJnJFpxJnZPfLo2QvVZ5yvAq5IRqzXPbQL1rL1ns,28104
26
40
  kailash/mcp/client.py,sha256=sTouSiuiu1nbahMXSWcP8-mr1k7cqdBCzSxm8G7le-s,16058
@@ -39,7 +53,7 @@ kailash/middleware/auth/access_control.py,sha256=u8jlfTXRkRteHXi-kiwSGfFFKzAfabx
39
53
  kailash/middleware/auth/auth_manager.py,sha256=d1XFJ9jOCrOTwV26qO0b7wBOSbroTvTxaJADII-mCz0,14057
40
54
  kailash/middleware/auth/exceptions.py,sha256=tPDQgaX9nMQ9BJZR3Y5tv2LwLy8pZcUz-uFATQjALRA,2496
41
55
  kailash/middleware/auth/jwt_auth.py,sha256=r4dauFKcoARHj0yb4f4WwBmY9YQpLNBGyk4gdBZEI1k,21626
42
- kailash/middleware/auth/models.py,sha256=RSLiP3GeOFgQ6p1ZSV0zIsfo8a_3nkbF9ctPoAKtYEA,3509
56
+ kailash/middleware/auth/models.py,sha256=sMQ1JnEDKPId1kLNCi2fDfhgLZX-YguHPnSMfS_UAmw,3514
43
57
  kailash/middleware/auth/utils.py,sha256=AW4fYJ2opQvOr_1YgSQi_MsC_RoFPq0XVOEgbxoXWtw,6555
44
58
  kailash/middleware/communication/__init__.py,sha256=keQ2db4WI2-oZ_nJ5sLE1Tum_RkUt7M2VLTmqOlt0zA,778
45
59
  kailash/middleware/communication/ai_chat.py,sha256=T4R2dujQ40cFH3mI09FTpc6UCbjTItvFLwG0JGe48BQ,36045
@@ -52,12 +66,18 @@ kailash/middleware/core/schema.py,sha256=uVF-5ZJlLYHOQdsKrG46FnTO1bq_QtDjhUSkIID
52
66
  kailash/middleware/core/workflows.py,sha256=kjwwP69-T6eCY7kWIMLUBwVy2CapoPR34cqCETquq0s,12480
53
67
  kailash/middleware/database/__init__.py,sha256=UMws94L-vja94AjfzPWIgn0h4_5BGQzI3YaSdqtzeLk,1682
54
68
  kailash/middleware/database/base.py,sha256=cWEei9Gb6J-C-bpa4M4T0takfWE3POXWumzYhqX3V4g,2735
55
- kailash/middleware/database/base_models.py,sha256=XBcHEUmcpl2f6zZHCAgHQ_0jqUB3Gl82XARR83lW5GY,18287
69
+ kailash/middleware/database/base_models.py,sha256=t4HfXKGHZkfLkzoRgXXvlO_wdgsqXhm7S0XP4OIdQXc,18262
56
70
  kailash/middleware/database/enums.py,sha256=Yo_wMS7OpsleWtNMESTc2LTf15d93nPnBADIn2EHjeQ,2516
57
71
  kailash/middleware/database/migrations.py,sha256=v5VZxsqciwmOl3rzIBQLp5p6-OP8OG_EL3mu65_yrCM,240
58
72
  kailash/middleware/database/models.py,sha256=CJwwUEdgxqBteXqpFJr1tWskjypJxViZXjODZlByrFk,17784
59
73
  kailash/middleware/database/repositories.py,sha256=7l2OcAem5sMQxbbnmBR4O22P-OcLv5zEo-4r9fIMl1o,23340
60
74
  kailash/middleware/database/session_manager.py,sha256=Pzj7c2TZnM3GRty2igSaxmLOf0-Fs67NVe2Q5lR_C-Q,379
75
+ kailash/middleware/gateway/__init__.py,sha256=3R7HkvAadJKYCkDHEXFnOPHJ6yzdj8HpBOHtafStqSE,588
76
+ kailash/middleware/gateway/checkpoint_manager.py,sha256=kSX90UeSI4gN4aaLa__BOMxIUhNpl0PJ3wGxa7KUCdQ,13606
77
+ kailash/middleware/gateway/deduplicator.py,sha256=CblV3fwc7s4wg6KIvypwyNMYL5AuQi9EwtcxVOy64X8,13265
78
+ kailash/middleware/gateway/durable_gateway.py,sha256=EsIgMNxS_no2W40AXDyE7FmVdnGNU26kBRC5rfnSzoQ,14626
79
+ kailash/middleware/gateway/durable_request.py,sha256=SCnp-bF0tQX9oahr9reqcZjJ_YhyJkeYYl-un9rJ6lo,15437
80
+ kailash/middleware/gateway/event_store.py,sha256=I34ngmHPwy1xb9E1bSdCZ4Mzs6AB6CfMPMosqNKE6FM,14477
61
81
  kailash/middleware/mcp/__init__.py,sha256=EdZB8zOMSBEEmudRzs8ksz9QZJYWQMEx7Tm1MOwIWnI,922
62
82
  kailash/middleware/mcp/client_integration.py,sha256=opzhB5TUts_ND8gARXh93nKCc1u4kwo6SqNMMWqMcSU,18258
63
83
  kailash/middleware/mcp/enhanced_server.py,sha256=ydU265wAoC2d2sFLuuVzmETowzH9qsqvrzJ5mrwEVvU,18458
@@ -70,10 +90,11 @@ kailash/nodes/mixins.py,sha256=ncAdNQPe1sphLByeerP6G_s8mjFLt7dM4baiozzIBPA,12083
70
90
  kailash/nodes/validation.py,sha256=tuBZRZkDiEdvfeU7JaRB7v2-j1vxPYMJ1gVaJ-PKHRk,12117
71
91
  kailash/nodes/admin/__init__.py,sha256=C9_pK2w0rH6JEV_-roypeasAIyIhEFKKnH-npGBeew0,1508
72
92
  kailash/nodes/admin/audit_log.py,sha256=CSSeWwAK-_hGYXs8eess89wNVju8jvsdNKA1A1946to,41066
73
- kailash/nodes/admin/permission_check.py,sha256=yA_vHWzMg3KH27oDnu1M6IWfxXWsRnH0m8x72YKkrFI,32484
74
- kailash/nodes/admin/role_management.py,sha256=2jDQak5jIblP5Dd7vSCKt7h-4vbi6AEhCynu3blQ3vw,30184
93
+ kailash/nodes/admin/permission_check.py,sha256=0SY1PojT3kymhE8hjkXlY6t0OuESDGjJl3IkB8lnUlA,63109
94
+ kailash/nodes/admin/role_management.py,sha256=DVkFJU5yQRf_1TxlvmQBhHzCeE5oJQzIjCKjrEfZb1g,72894
95
+ kailash/nodes/admin/schema_manager.py,sha256=U8W8Xn4H5wamEtSq-I9jh54tWQnrLo4vZDKdX3K4bKs,15073
75
96
  kailash/nodes/admin/security_event.py,sha256=We_nGn6_J004b7LQVd0nKU6LmhJ6vyrl5zySC3xVdfo,56336
76
- kailash/nodes/admin/user_management.py,sha256=g9YUWcxo1Sph2dsCZpiu_f9k3tsEd_rEv6k0njH--vQ,72118
97
+ kailash/nodes/admin/user_management.py,sha256=yoOee8auya9CMiXfDMPH_9A83OdaoJ0B_Sc72sto88w,53702
77
98
  kailash/nodes/ai/__init__.py,sha256=rslxIS8jlovshiNgWqVzQjD_kfT_3h3Ct03sk-iRe6U,2202
78
99
  kailash/nodes/ai/a2a.py,sha256=QpTPl-Cm6mqzM0unLfqPrgEu964QP47g5p2T4clVPMs,70004
79
100
  kailash/nodes/ai/agents.py,sha256=CRA3cdapQjpuvOniXUh6ZVWAlRxUIepVw1BROW6QzdY,20373
@@ -103,14 +124,15 @@ kailash/nodes/auth/mfa.py,sha256=FqeKemNLn1smy8l_A5YxrwKAx19hoer3Wo0WmXP8pCA,853
103
124
  kailash/nodes/auth/risk_assessment.py,sha256=ZVKYCXp8saTBsVxonh2YAM_BkqBPg5HtulRT6PHWspk,30157
104
125
  kailash/nodes/auth/session_management.py,sha256=FzOxic3hjmRlMiAQy7ps8a7XO7AoxYToZL9ywAcwKxY,38694
105
126
  kailash/nodes/auth/sso.py,sha256=m-sYRNGEWwKfpvAzaHikGC3Wy45h0o-JhqgeYLTTV24,38507
106
- kailash/nodes/code/__init__.py,sha256=L3QBfnITPb6v-Wbq2ezNWt8xDlC4uGaTgrkqIJ9vGKU,1191
107
- kailash/nodes/code/python.py,sha256=v5pGJms-0CWKHGn8TI7c_lyPEYrNdl3A9azddTfDFuc,51417
127
+ kailash/nodes/code/__init__.py,sha256=yhEwuMjUEPFfe6hMGMd4E4gZdLUuf2JEQ7knYapiM4o,1283
128
+ kailash/nodes/code/async_python.py,sha256=VPGO4-Xsd-NFyoeE-iBLn1lTg7HuCe8DTijzBG_LkSA,36944
129
+ kailash/nodes/code/python.py,sha256=fu1nIx_AW0CzeOAjQ_d2T5dFE5HLhDQXCYJwuUsLzW4,51481
108
130
  kailash/nodes/compliance/__init__.py,sha256=6a_FL4ofc8MAVuZ-ARW5uYenZLS4mBFVM9AI2QsnoF8,214
109
131
  kailash/nodes/compliance/data_retention.py,sha256=rP85W9mIbbVb4LqxPFYYFySgUJXI5Q5mdoYLY0o3Mnw,69419
110
132
  kailash/nodes/compliance/gdpr.py,sha256=iEAVU7Faqp0HVHk2KLw51oXr6VyJPycvsVL5IQR4ciY,70528
111
133
  kailash/nodes/data/__init__.py,sha256=4UVGZ77ZjCUdDQqwOrhZH60Ka8hGVrZMZCySPk9mFJc,4898
112
134
  kailash/nodes/data/async_connection.py,sha256=wfArHs9svU48bxGZIiixSV2YVn9cukNgEjagwTRu6J4,17250
113
- kailash/nodes/data/async_sql.py,sha256=6DQ7idKe3R6F4Z4Ivmjtb3w0Vl8CAzndDJpCGKSHFho,27155
135
+ kailash/nodes/data/async_sql.py,sha256=QQg-wFzwPlmwjC23H1JgR20EyTAIsR0Zw1e0PHJkP70,27337
114
136
  kailash/nodes/data/async_vector.py,sha256=HtwQLO25IXu8Vq80qzU8rMkUAKPQ2qM0x8YxjXHlygU,21005
115
137
  kailash/nodes/data/directory.py,sha256=fbfLqD_ijRubk-4xew3604QntPsyDxqaF4k6TpfyjDg,9923
116
138
  kailash/nodes/data/event_generation.py,sha256=Bc1se0tPg1IAGCQDrWqlFmgoOpUyfMN9ku4Lm3akhXU,11579
@@ -119,9 +141,10 @@ kailash/nodes/data/readers.py,sha256=fX82yQSLGPUFbSf6krT_-9gybp6IBnBH-Lcr87aNlHQ
119
141
  kailash/nodes/data/retrieval.py,sha256=H8Qb2R64fQ_OeaQBh6jVn7-xLuygiF3fjzbh4ssNOrU,20591
120
142
  kailash/nodes/data/sharepoint_graph.py,sha256=J1_KZQ5s8yXkjGY1PjsMY7T8viKARi3os5P8CXpmn2U,37160
121
143
  kailash/nodes/data/sources.py,sha256=tvgDDDerWELD6QkAm73ciKmNakD_SYMd50idlOjpbF0,3632
122
- kailash/nodes/data/sql.py,sha256=ByBr_IaJuHJahyrgrtixFcWTZjE9A1XkSMCHE1K_9mo,33933
144
+ kailash/nodes/data/sql.py,sha256=3On6JatlXvGrp2D4MdObX_l_H3CIEoHxqoPUoSfXYso,34426
123
145
  kailash/nodes/data/streaming.py,sha256=VE4e3CNuRAdjckV8UXFpkTj3mPLY2cicoZwnkq10ZnE,37163
124
146
  kailash/nodes/data/vector_db.py,sha256=pwCl-3tyk_Cv_VQ8GafgodJ1yM88W1BXCIcYC56XoqU,32056
147
+ kailash/nodes/data/workflow_connection_pool.py,sha256=ZHia_MU2cdXh6ID7_iwivQJJMd6qY45uG3w4J3exOlA,22879
125
148
  kailash/nodes/data/writers.py,sha256=-RPLetKhKAPXOU6YPwMkVRXF8by6ROhgICm3aUnGcFs,17537
126
149
  kailash/nodes/enterprise/__init__.py,sha256=1a6SsEnzozP4MSFDo-Yimzx-e65NwnmGeTDMammSrtk,407
127
150
  kailash/nodes/enterprise/batch_processor.py,sha256=wA9AtBC_roLF040zoFSBo7wqdE2KFWvVLMIRBBR2_cY,27170
@@ -138,7 +161,7 @@ kailash/nodes/mixins/mcp.py,sha256=HSULx66VY-e8h5R4HjcNDI5pPVq3MN9HxD8T9FI9vRo,7
138
161
  kailash/nodes/mixins/security.py,sha256=oxIwfKHd6Sdmd2GIaoNkRcSzVHUusYKyGNA7rM61fvw,5534
139
162
  kailash/nodes/monitoring/__init__.py,sha256=my9X4QK-RPAtdkHpQSdwnFc7kVPi-XXxnc90-p-vu5s,168
140
163
  kailash/nodes/monitoring/performance_benchmark.py,sha256=KPDjsoSZ1TT0Z1teITDdSbdpYXvyJUoPzgsVWdzQybs,87637
141
- kailash/nodes/rag/__init__.py,sha256=0tUkBZoUvRep7O_isRvb8b5HF9OfUeAGo7AMjfJjfp0,8705
164
+ kailash/nodes/rag/__init__.py,sha256=Mv7vOBW-8M4vKDdB3xtW0f8ssIjNXPG-13ZJfFuHfug,8692
142
165
  kailash/nodes/rag/advanced.py,sha256=oPcdS8i4yscJ3NCkwQjv9KCwNhmC_5tp8JZ1_XPQY4I,60265
143
166
  kailash/nodes/rag/agentic.py,sha256=6jmUJphKPYXRH7P3K5fPPFuKy1BYfkgR7Mmkv8JvPaM,24153
144
167
  kailash/nodes/rag/conversational.py,sha256=wmN4dArb1XBYYc2wm-FSDuykqbX8EfsHvA-FVEMjEa0,35498
@@ -169,15 +192,25 @@ kailash/nodes/transform/__init__.py,sha256=JWciUYn9y78-tWiYhc4SCXRoy8YP2O3S2dRp-
169
192
  kailash/nodes/transform/chunkers.py,sha256=StRuS6-eLE67OVsqqJJF8dqA2jngD-4yp_rjZQfMAAA,24621
170
193
  kailash/nodes/transform/formatters.py,sha256=BWb5depTZ23Bbg41A_nZojIeET7in6WxYvi3Bhjg-bk,3072
171
194
  kailash/nodes/transform/processors.py,sha256=lLEujPQfZXEDIpgcDoQG6_5s9UgBwWmf0N6rzLVehAA,38353
195
+ kailash/resources/__init__.py,sha256=JM90kDB7k9wTsd6-2jwm-312SeOaXvavyKnPwQwy4PY,1077
196
+ kailash/resources/factory.py,sha256=CYqBm3EFjTv_Aoqb3AUFT8emJlUrtwAZGCSVLt8K3KA,15824
197
+ kailash/resources/health.py,sha256=i6XS0HdL6pUYq8SBdRjvchf-oj0sy3JoRLszNylfQJc,9702
198
+ kailash/resources/reference.py,sha256=RKfXzJFIdid0cLOwsXSmlXq4NhSEci4GO-q3M3qcjA8,7526
199
+ kailash/resources/registry.py,sha256=4qXk4rdsPeaUgwizLakq1TG9cLCNuKQGd313vCIstnw,13504
172
200
  kailash/runtime/__init__.py,sha256=CvU-qBMESYYISqFOlYlLsYJrXJu0Gqr4x6yr4Ob_Rng,278
173
201
  kailash/runtime/access_controlled.py,sha256=Td8Fa8oPxEqlb74bDiH_HtT6J-ku0AudvN7mrUZOacc,17219
174
- kailash/runtime/async_local.py,sha256=qQWCrdBNoa-E6113UqYQ--C5u8F-wq6p1nESLnshIjg,13699
202
+ kailash/runtime/async_local.py,sha256=Ebk3-pDij804YCQST7izXzqC0QWAS5--X_pnNqiwNxQ,29900
175
203
  kailash/runtime/docker.py,sha256=sZknVl1PCGfAZeyc0-exTuKlllSyjYlFIgJoiB3CRNs,23500
176
204
  kailash/runtime/local.py,sha256=i2hnRrk2Ks0Q5jR9SkBhM6d6plJbpH0i7rNkJ8laLCw,39078
177
205
  kailash/runtime/parallel.py,sha256=mz_wPD13-YVc3Q_8HkOs4nPQPdTjnjCcnRL7ZRM70lo,21070
178
206
  kailash/runtime/parallel_cyclic.py,sha256=yANZHnePjhCPuCFbq3lFQA1K6jbCv5Of5-vIKbCsmZk,19863
179
207
  kailash/runtime/runner.py,sha256=Lt9ugsk56ICD9XLKJjnhejtqdiz0mJNdlqH7sSxIlWU,3214
180
208
  kailash/runtime/testing.py,sha256=-Uiq58evL0jzaT8c0Q1oEqQNjeQhkNe3HGrU0FKQ3rQ,19073
209
+ kailash/testing/__init__.py,sha256=4cqLSbcFz9bDY09vuK5Vpg3UtoAAa93R5tc9zIUvGAE,796
210
+ kailash/testing/async_test_case.py,sha256=3Pdi13zT-_LduJ5Tfe7yuhz8Qz7KQpcER6G2nMe-t5A,12815
211
+ kailash/testing/async_utils.py,sha256=gSHcArDJf98mDi--NPFpCoGmAgKHDZ0__tyKAjDjpm0,10745
212
+ kailash/testing/fixtures.py,sha256=AG_859XGZ5yu517jSX67r9WqHlN_B9aWcE4d-N3RgVM,14064
213
+ kailash/testing/mock_registry.py,sha256=1KsIjZh7ig4dC9Xi_FcpyAruPrQP79a3_hCxWrcZ6Zk,18389
181
214
  kailash/tracking/__init__.py,sha256=nhyecV24JuB_D-veJ3qw7h4oO8Sbdmyb6RvPS6VQktU,305
182
215
  kailash/tracking/manager.py,sha256=OxDgvuObiLLcje7-DF5DRIqi8f5clzvrlean1RrL9KE,28006
183
216
  kailash/tracking/metrics_collector.py,sha256=rvKvm2BzhAwdFazJpEQ87j78AMVDSehoScZK4Tfm3O8,11798
@@ -200,7 +233,9 @@ kailash/visualization/api.py,sha256=AavUemsir_tCQgU-YZxo9RyrZJP5g__RCaE7B8_eJIc,
200
233
  kailash/visualization/dashboard.py,sha256=26uL82scgQEhOhqDTyZ-UJr9rNkW9pLw_iJ9bIu3GSs,32806
201
234
  kailash/visualization/performance.py,sha256=KvB7IG8Un2sM1ZnT1TWOabwj4kK40DlCWUN33Mb89nk,28514
202
235
  kailash/visualization/reports.py,sha256=D7kJ0flHr16d-qSEq8vnw20N8u_dgTrXtKVSXVm886w,52778
203
- kailash/workflow/__init__.py,sha256=eUTrN7nVrbw1VaqGeYUzFjC0Un5YIjzh3-03OWPiFSs,1513
236
+ kailash/workflow/__init__.py,sha256=DDQDE9K6RmbX6479guNLLgjiVVV-gQERRvCEJWSVlsM,1836
237
+ kailash/workflow/async_builder.py,sha256=iv8bDJHdWAUZ77SyMo6sucd92dTdtXesdxycrSE7mM4,20613
238
+ kailash/workflow/async_patterns.py,sha256=X0ZDXwr6UAu0WC1xnCB7-0V1-tRbKs9UI4JqaBCB6tE,22824
204
239
  kailash/workflow/builder.py,sha256=CPnfNHlL4HKsX58BI4kOv-CLNrFa_7cg_0lBqqVByYw,10779
205
240
  kailash/workflow/convergence.py,sha256=vfIDR-uNaQE-LVUEzrRtfgKPgX9gL0nLNH-nTg5ra-c,10031
206
241
  kailash/workflow/cycle_analyzer.py,sha256=BGBpgdB-g0-KRI65sVAvHV4lxfoCzMt4uKOHbw8GXT4,32596
@@ -210,21 +245,21 @@ kailash/workflow/cycle_debugger.py,sha256=eG-Q_kakqyhr1Ts-q4pRnO0EI7mVO9ao1s9WOx
210
245
  kailash/workflow/cycle_exceptions.py,sha256=4_OLnbEXqIiXKzOc3uh8DzFik4wEHwl8bRZhY9Xhf2A,21838
211
246
  kailash/workflow/cycle_profiler.py,sha256=aEWSCm0Xy15SjgLTpPooVJMzpFhtJWt4livR-3Me4N8,28547
212
247
  kailash/workflow/cycle_state.py,sha256=hzRUvciRreWfS56Cf7ZLQPit_mlPTQDoNTawh8yi-2s,10747
213
- kailash/workflow/cyclic_runner.py,sha256=Q3-pwYBYrrqSnv6sbMo2pdq_PUUN0xbIz-QjpEtrSqE,36092
214
- kailash/workflow/graph.py,sha256=Dk-5DuhybQlBprLIkblMEmChc9a-Xci7elDqHa4JEGI,55920
248
+ kailash/workflow/cyclic_runner.py,sha256=NZqK_GTNbvf-pp08_brvzOlDCytrKscr1XRDy8PD8Is,40816
249
+ kailash/workflow/graph.py,sha256=gknGNgv3Z6FyNno90jZLGHZ0tTdiUx0_HAy6bEWh6OQ,56156
215
250
  kailash/workflow/mermaid_visualizer.py,sha256=UsQDvxgIAhy-Th7ZzFnbuziaTx1Cd5yUh6S_25DffoQ,22294
216
251
  kailash/workflow/migration.py,sha256=zsmXgbUtOZdjoOx9YoEY0-x7uOY1T-_yQo4MnZjokCQ,31487
217
252
  kailash/workflow/mock_registry.py,sha256=J4gyH8YdhRyhvORDVxGTya0FgDK8iAA8Nonur6p9s-o,1692
218
- kailash/workflow/resilience.py,sha256=_SvyeTQIY5XYGZMB14-mxeq5KSB4hdt4UwauaWiIJZc,8214
253
+ kailash/workflow/resilience.py,sha256=Ecef4gBg-QWP369a_xfzQnVWhHryvEcO2RSFVSriLJI,8569
219
254
  kailash/workflow/runner.py,sha256=l6jb-H7DwbRlvQ3H3SuTs70rut-u7H3Gi8nybKCEjZU,10795
220
255
  kailash/workflow/safety.py,sha256=pS5GKu7UdkzFZcb16Dn-0jBxjULDU-59_M0CbUVMVyw,11298
221
256
  kailash/workflow/state.py,sha256=UTZxs5-Ona6uvBhx1__i6-RX8gB4qazkBIWE7uyRmWQ,7600
222
257
  kailash/workflow/templates.py,sha256=MTIMHGyQML6omLbqeKDbTVIVykfXG6pIFWTTsGBUHN0,48591
223
258
  kailash/workflow/validation.py,sha256=JIbIajWVIaWHSvWtgZ4WUVJaBaUOCz5B9cyTwM--dL4,33060
224
259
  kailash/workflow/visualization.py,sha256=ICMWCWqh5fOQ7eJygbvu2PMWHxe-H5_0epwdZuz8cMw,19737
225
- kailash-0.5.0.dist-info/licenses/LICENSE,sha256=Axe6g7bTrJkToK9h9j2SpRUKKNaDZDCo2lQ2zPxCE6s,1065
226
- kailash-0.5.0.dist-info/METADATA,sha256=j4mPimtOBR2E8IoFOKKuYYLCNQQMA7-gYIqaPOpPTuQ,25034
227
- kailash-0.5.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
228
- kailash-0.5.0.dist-info/entry_points.txt,sha256=M_q3b8PG5W4XbhSgESzIJjh3_4OBKtZFYFsOdkr2vO4,45
229
- kailash-0.5.0.dist-info/top_level.txt,sha256=z7GzH2mxl66498pVf5HKwo5wwfPtt9Aq95uZUpH6JV0,8
230
- kailash-0.5.0.dist-info/RECORD,,
260
+ kailash-0.6.0.dist-info/licenses/LICENSE,sha256=Axe6g7bTrJkToK9h9j2SpRUKKNaDZDCo2lQ2zPxCE6s,1065
261
+ kailash-0.6.0.dist-info/METADATA,sha256=jLpYDvoVdsZBQlLMe-D-nALsu8cinDxAv0P5rOnekME,25326
262
+ kailash-0.6.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
263
+ kailash-0.6.0.dist-info/entry_points.txt,sha256=M_q3b8PG5W4XbhSgESzIJjh3_4OBKtZFYFsOdkr2vO4,45
264
+ kailash-0.6.0.dist-info/top_level.txt,sha256=z7GzH2mxl66498pVf5HKwo5wwfPtt9Aq95uZUpH6JV0,8
265
+ kailash-0.6.0.dist-info/RECORD,,