kailash 0.6.0__py3-none-any.whl → 0.6.2__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 (45) hide show
  1. kailash/__init__.py +1 -1
  2. kailash/access_control/__init__.py +1 -1
  3. kailash/core/actors/adaptive_pool_controller.py +630 -0
  4. kailash/core/actors/connection_actor.py +3 -3
  5. kailash/core/ml/__init__.py +1 -0
  6. kailash/core/ml/query_patterns.py +544 -0
  7. kailash/core/monitoring/__init__.py +19 -0
  8. kailash/core/monitoring/connection_metrics.py +488 -0
  9. kailash/core/optimization/__init__.py +1 -0
  10. kailash/core/resilience/__init__.py +17 -0
  11. kailash/core/resilience/circuit_breaker.py +382 -0
  12. kailash/gateway/api.py +7 -5
  13. kailash/gateway/enhanced_gateway.py +1 -1
  14. kailash/middleware/auth/access_control.py +11 -11
  15. kailash/middleware/communication/ai_chat.py +7 -7
  16. kailash/middleware/communication/api_gateway.py +5 -15
  17. kailash/middleware/gateway/checkpoint_manager.py +45 -8
  18. kailash/middleware/gateway/event_store.py +66 -26
  19. kailash/middleware/mcp/enhanced_server.py +2 -2
  20. kailash/nodes/admin/permission_check.py +110 -30
  21. kailash/nodes/admin/schema.sql +387 -0
  22. kailash/nodes/admin/tenant_isolation.py +249 -0
  23. kailash/nodes/admin/transaction_utils.py +244 -0
  24. kailash/nodes/admin/user_management.py +37 -9
  25. kailash/nodes/ai/ai_providers.py +55 -3
  26. kailash/nodes/ai/llm_agent.py +115 -13
  27. kailash/nodes/data/query_pipeline.py +641 -0
  28. kailash/nodes/data/query_router.py +895 -0
  29. kailash/nodes/data/sql.py +24 -0
  30. kailash/nodes/data/workflow_connection_pool.py +451 -23
  31. kailash/nodes/monitoring/__init__.py +3 -5
  32. kailash/nodes/monitoring/connection_dashboard.py +822 -0
  33. kailash/nodes/rag/__init__.py +1 -3
  34. kailash/resources/registry.py +6 -0
  35. kailash/runtime/async_local.py +7 -0
  36. kailash/utils/export.py +152 -0
  37. kailash/workflow/builder.py +42 -0
  38. kailash/workflow/graph.py +86 -17
  39. kailash/workflow/templates.py +4 -9
  40. {kailash-0.6.0.dist-info → kailash-0.6.2.dist-info}/METADATA +14 -1
  41. {kailash-0.6.0.dist-info → kailash-0.6.2.dist-info}/RECORD +45 -31
  42. {kailash-0.6.0.dist-info → kailash-0.6.2.dist-info}/WHEEL +0 -0
  43. {kailash-0.6.0.dist-info → kailash-0.6.2.dist-info}/entry_points.txt +0 -0
  44. {kailash-0.6.0.dist-info → kailash-0.6.2.dist-info}/licenses/LICENSE +0 -0
  45. {kailash-0.6.0.dist-info → kailash-0.6.2.dist-info}/top_level.txt +0 -0
@@ -174,9 +174,7 @@ from .query_processing import (
174
174
 
175
175
  # Real-time RAG
176
176
  from .realtime import IncrementalIndexNode, RealtimeRAGNode
177
- from .realtime import (
178
- StreamingRAGNode as RealtimeStreamingRAGNode, # Avoid name conflict
179
- )
177
+ from .realtime import StreamingRAGNode as RealtimeStreamingRAGNode
180
178
  from .registry import RAGWorkflowRegistry
181
179
  from .router import (
182
180
  RAGPerformanceMonitorNode,
@@ -266,6 +266,12 @@ class ResourceRegistry:
266
266
  )
267
267
 
268
268
  # Try generic cleanup methods
269
+ elif hasattr(resource, "aclose"):
270
+ # Use aclose for modern async resources (e.g., Redis)
271
+ if asyncio.iscoroutinefunction(resource.aclose):
272
+ await resource.aclose()
273
+ else:
274
+ resource.aclose()
269
275
  elif hasattr(resource, "close"):
270
276
  if asyncio.iscoroutinefunction(resource.close):
271
277
  await resource.close()
@@ -717,6 +717,13 @@ class AsyncLocalRuntime(LocalRuntime):
717
717
  # Navigate the path (e.g., "result.data")
718
718
  path_parts = source_path.split(".")
719
719
  current_data = source_data
720
+
721
+ # CRITICAL FIX: Handle paths starting with "result"
722
+ # When source_path is "result.field", the node output IS the result
723
+ if path_parts[0] == "result" and len(path_parts) > 1:
724
+ # Skip the "result" prefix and navigate from the actual data
725
+ path_parts = path_parts[1:]
726
+
720
727
  for part in path_parts:
721
728
  if (
722
729
  isinstance(current_data, dict)
kailash/utils/export.py CHANGED
@@ -4,6 +4,7 @@ import json
4
4
  import logging
5
5
  import re
6
6
  from copy import deepcopy
7
+ from datetime import UTC, datetime
7
8
  from pathlib import Path
8
9
  from typing import Any
9
10
 
@@ -643,6 +644,157 @@ class WorkflowExporter:
643
644
  except Exception as e:
644
645
  raise ExportException(f"Failed to export workflow manifest: {e}") from e
645
646
 
647
+ def export_as_code(self, workflow: Workflow, output_path: str | None = None) -> str:
648
+ """Export workflow as executable Python code.
649
+
650
+ Args:
651
+ workflow: Workflow to export
652
+ output_path: Optional path to write Python file
653
+
654
+ Returns:
655
+ Python code string
656
+
657
+ Raises:
658
+ ExportException: If export fails
659
+ """
660
+ if not workflow:
661
+ raise ExportException("Workflow is required")
662
+
663
+ try:
664
+ if self.pre_export_hook:
665
+ self.pre_export_hook(workflow, "python")
666
+
667
+ # Generate Python code
668
+ metadata = workflow.metadata if hasattr(workflow, "metadata") else {}
669
+ if isinstance(metadata, dict):
670
+ name = metadata.get("name", "workflow")
671
+ description = metadata.get("description", "Generated workflow")
672
+ else:
673
+ name = getattr(metadata, "name", "workflow")
674
+ description = getattr(metadata, "description", "Generated workflow")
675
+
676
+ code_lines = [
677
+ "#!/usr/bin/env python3",
678
+ '"""',
679
+ f"Generated workflow: {name}",
680
+ f"Description: {description}",
681
+ f"Generated at: {datetime.now(UTC).isoformat()}",
682
+ '"""',
683
+ "",
684
+ "from kailash import WorkflowBuilder",
685
+ "from kailash.runtime.local import LocalRuntime",
686
+ "",
687
+ "",
688
+ "def build_workflow():",
689
+ ' """Build the workflow."""',
690
+ " builder = WorkflowBuilder()",
691
+ "",
692
+ ]
693
+
694
+ # Add nodes
695
+ for node_id, node in workflow.nodes.items():
696
+ node_type = node.node_type
697
+ config = node.config
698
+
699
+ # Format config as Python dict
700
+ config_str = self._format_dict_for_code(config, indent=8)
701
+
702
+ code_lines.extend(
703
+ [
704
+ f" # Add {node_type} node",
705
+ f' builder.add_node("{node_type}", "{node_id}", config={config_str})',
706
+ "",
707
+ ]
708
+ )
709
+
710
+ # Add connections
711
+ if workflow.connections:
712
+ code_lines.append(" # Add connections")
713
+ for conn in workflow.connections:
714
+ code_lines.append(
715
+ f' builder.add_connection("{conn.source_node}", "{conn.source_output}", '
716
+ f'"{conn.target_node}", "{conn.target_input}")'
717
+ )
718
+ code_lines.append("")
719
+
720
+ # Build workflow
721
+ code_lines.extend(
722
+ [
723
+ f' return builder.build("{name}")',
724
+ "",
725
+ "",
726
+ "def main():",
727
+ ' """Execute the workflow."""',
728
+ " # Build workflow",
729
+ " workflow = build_workflow()",
730
+ " ",
731
+ " # Create runtime",
732
+ " runtime = LocalRuntime()",
733
+ " ",
734
+ " # Execute workflow",
735
+ " result = runtime.execute(workflow)",
736
+ " ",
737
+ " # Print results",
738
+ ' print("Workflow execution completed!")',
739
+ ' print(f"Result: {result}")',
740
+ "",
741
+ "",
742
+ 'if __name__ == "__main__":',
743
+ " main()",
744
+ "",
745
+ ]
746
+ )
747
+
748
+ python_code = "\n".join(code_lines)
749
+
750
+ if output_path:
751
+ try:
752
+ Path(output_path).parent.mkdir(parents=True, exist_ok=True)
753
+ Path(output_path).write_text(python_code)
754
+ # Make executable
755
+ Path(output_path).chmod(0o755)
756
+ except Exception as e:
757
+ raise ExportException(
758
+ f"Failed to write Python code to '{output_path}': {e}"
759
+ ) from e
760
+
761
+ if self.post_export_hook:
762
+ self.post_export_hook(workflow, "python", python_code)
763
+
764
+ return python_code
765
+
766
+ except ExportException:
767
+ raise
768
+ except Exception as e:
769
+ raise ExportException(f"Failed to export workflow as code: {e}") from e
770
+
771
+ def _format_dict_for_code(self, data: dict, indent: int = 0) -> str:
772
+ """Format dictionary for Python code generation."""
773
+ if not data:
774
+ return "{}"
775
+
776
+ lines = ["{"]
777
+ indent_str = " " * indent
778
+ inner_indent = " " * (indent + 4)
779
+
780
+ for i, (key, value) in enumerate(data.items()):
781
+ if isinstance(value, str):
782
+ value_str = f'"{value}"'
783
+ elif isinstance(value, dict):
784
+ value_str = self._format_dict_for_code(value, indent + 4)
785
+ elif isinstance(value, list):
786
+ value_str = str(value)
787
+ else:
788
+ value_str = str(value)
789
+
790
+ line = f'{inner_indent}"{key}": {value_str}'
791
+ if i < len(data) - 1:
792
+ line += ","
793
+ lines.append(line)
794
+
795
+ lines.append(indent_str + "}")
796
+ return "\n".join(lines)
797
+
646
798
  def export_with_templates(
647
799
  self, workflow: Workflow, template_name: str, output_dir: str
648
800
  ) -> dict[str, str]:
@@ -162,6 +162,48 @@ class WorkflowBuilder:
162
162
 
163
163
  logger.info(f"Connected '{from_node}.{from_output}' to '{to_node}.{to_input}'")
164
164
 
165
+ def connect(
166
+ self,
167
+ from_node: str,
168
+ to_node: str,
169
+ mapping: dict = None,
170
+ from_output: str = None,
171
+ to_input: str = None,
172
+ ) -> None:
173
+ """
174
+ Connect two nodes in the workflow with flexible parameter formats.
175
+
176
+ This method provides a more intuitive API for connecting nodes and supports
177
+ both simple connections and complex mapping-based connections.
178
+
179
+ Args:
180
+ from_node: Source node ID
181
+ to_node: Target node ID
182
+ mapping: Dict mapping from_output to to_input (e.g., {"data": "input"})
183
+ from_output: Single output field (alternative to mapping)
184
+ to_input: Single input field (alternative to mapping)
185
+
186
+ Examples:
187
+ # Simple connection
188
+ workflow.connect("node1", "node2", from_output="data", to_input="input")
189
+
190
+ # Mapping-based connection
191
+ workflow.connect("node1", "node2", mapping={"data": "input"})
192
+
193
+ # Default data flow
194
+ workflow.connect("node1", "node2") # Uses "data" -> "data"
195
+ """
196
+ if mapping:
197
+ # Handle mapping-based connections
198
+ for from_out, to_in in mapping.items():
199
+ self.add_connection(from_node, from_out, to_node, to_in)
200
+ elif from_output and to_input:
201
+ # Handle explicit parameter connections
202
+ self.add_connection(from_node, from_output, to_node, to_input)
203
+ else:
204
+ # Default data flow
205
+ self.add_connection(from_node, "data", to_node, "data")
206
+
165
207
  def set_metadata(self, **kwargs) -> "WorkflowBuilder":
166
208
  """
167
209
  Set workflow metadata.
kailash/workflow/graph.py CHANGED
@@ -346,18 +346,27 @@ class Workflow:
346
346
  # Validate cycle parameters and issue deprecation warning
347
347
  if cycle:
348
348
  # Issue deprecation warning for cycle usage via connect()
349
- warnings.warn(
350
- "Using workflow.connect() with cycle=True is deprecated and will be removed in v0.2.0. "
351
- "Use the new CycleBuilder API instead:\n"
352
- " workflow.create_cycle('cycle_name')\\\n"
353
- " .connect(source_node, target_node)\\\n"
354
- " .max_iterations(N)\\\n"
355
- " .converge_when('condition')\\\n"
356
- " .build()\n"
357
- "See Phase 5 API documentation for details.",
358
- DeprecationWarning,
359
- stacklevel=2,
360
- )
349
+ # Skip warning if called from CycleBuilder (check stack)
350
+ import inspect
351
+
352
+ frame = inspect.currentframe()
353
+ caller_frame = frame.f_back if frame else None
354
+ caller_filename = caller_frame.f_code.co_filename if caller_frame else ""
355
+
356
+ # Only warn if NOT called from CycleBuilder
357
+ if "cycle_builder.py" not in caller_filename:
358
+ warnings.warn(
359
+ "Using workflow.connect() with cycle=True is deprecated and will be removed in v0.2.0. "
360
+ "Use the new CycleBuilder API instead:\n"
361
+ " workflow.create_cycle('cycle_name')\\\n"
362
+ " .connect(source_node, target_node)\\\n"
363
+ " .max_iterations(N)\\\n"
364
+ " .converge_when('condition')\\\n"
365
+ " .build()\n"
366
+ "See Phase 5 API documentation for details.",
367
+ DeprecationWarning,
368
+ stacklevel=2,
369
+ )
361
370
 
362
371
  # Import enhanced exceptions for better error messaging
363
372
  try:
@@ -426,11 +435,20 @@ class Workflow:
426
435
  for c in self.connections
427
436
  if c.source_node == source_node and c.target_node == target_node
428
437
  ]
438
+ # Allow multiple connections between same nodes for different mappings
439
+ # Only reject if it's a duplicate mapping, not just any existing connection
429
440
  if existing_connections and not cycle:
430
- raise ConnectionError(
431
- f"Connection already exists between '{source_node}' and '{target_node}'. "
432
- f"Existing mappings: {[c.model_dump() for c in existing_connections]}"
433
- )
441
+ # Check if any of the new mappings already exist
442
+ existing_mappings = set()
443
+ for conn in existing_connections:
444
+ existing_mappings.add((conn.source_output, conn.target_input))
445
+
446
+ for source_output, target_input in mapping.items():
447
+ if (source_output, target_input) in existing_mappings:
448
+ raise ConnectionError(
449
+ f"Duplicate connection already exists: '{source_node}.{source_output}' -> '{target_node}.{target_input}'. "
450
+ f"Existing mappings: {[c.model_dump() for c in existing_connections]}"
451
+ )
434
452
 
435
453
  # Create connections (store in self.connections list)
436
454
  for source_output, target_input in mapping.items():
@@ -495,7 +513,58 @@ class Workflow:
495
513
  }
496
514
  )
497
515
 
498
- # Add or update the edge (NetworkX will update if edge exists)
516
+ # CRITICAL FIX: Merge edge data for multiple connections between same nodes
517
+ # Check if edge already exists and merge mappings
518
+ existing_edge_data = None
519
+ if self.graph.has_edge(source_node, target_node):
520
+ existing_edge_data = self.graph.get_edge_data(source_node, target_node)
521
+
522
+ if existing_edge_data and "mapping" in existing_edge_data:
523
+ # Merge with existing mapping
524
+ merged_mapping = existing_edge_data["mapping"].copy()
525
+ merged_mapping.update(mapping)
526
+ edge_data = {
527
+ "mapping": merged_mapping, # Merged mapping dictionary
528
+ }
529
+
530
+ # Update backward compatibility fields
531
+ if len(merged_mapping) == 1:
532
+ edge_data["from_output"] = list(merged_mapping.keys())[0]
533
+ edge_data["to_input"] = list(merged_mapping.values())[0]
534
+ else:
535
+ edge_data["from_output"] = list(merged_mapping.keys())
536
+ edge_data["to_input"] = list(merged_mapping.values())
537
+
538
+ # Preserve any existing cycle metadata
539
+ if existing_edge_data.get("cycle"):
540
+ edge_data.update(
541
+ {
542
+ k: v
543
+ for k, v in existing_edge_data.items()
544
+ if k not in ["mapping", "from_output", "to_input"]
545
+ }
546
+ )
547
+ else:
548
+ # No existing edge or no mapping, use new mapping as-is
549
+ # (edge_data was already set above)
550
+ pass
551
+
552
+ # Add cycle metadata to edge if this is a cycle connection
553
+ if cycle:
554
+ edge_data.update(
555
+ {
556
+ "cycle": cycle,
557
+ "max_iterations": max_iterations,
558
+ "convergence_check": convergence_check,
559
+ "cycle_id": cycle_id,
560
+ "timeout": timeout,
561
+ "memory_limit": memory_limit,
562
+ "condition": condition,
563
+ "parent_cycle": parent_cycle,
564
+ }
565
+ )
566
+
567
+ # Add or update the edge with merged data
499
568
  self.graph.add_edge(source_node, target_node, **edge_data)
500
569
 
501
570
  # Enhanced logging for cycles
@@ -176,15 +176,10 @@ class CycleTemplates:
176
176
  # Connect processor to evaluator
177
177
  workflow.connect(processor_node, evaluator_node)
178
178
 
179
- # Close the cycle with convergence condition
180
- workflow.connect(
181
- evaluator_node,
182
- processor_node,
183
- cycle=True,
184
- max_iterations=max_iterations,
185
- convergence_check=convergence,
186
- cycle_id=cycle_id,
187
- )
179
+ # Close the cycle with convergence condition using new API
180
+ workflow.create_cycle(cycle_id).connect(
181
+ evaluator_node, processor_node
182
+ ).max_iterations(max_iterations).converge_when(convergence).build()
188
183
 
189
184
  return cycle_id
190
185
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kailash
3
- Version: 0.6.0
3
+ Version: 0.6.2
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
@@ -30,6 +30,7 @@ Requires-Dist: requests>=2.32.3
30
30
  Requires-Dist: pytest-cov>=6.1.1
31
31
  Requires-Dist: isort>=6.0.1
32
32
  Requires-Dist: aiohttp>=3.12.4
33
+ Requires-Dist: aiohttp-cors>=0.7.0
33
34
  Requires-Dist: ruff>=0.11.12
34
35
  Requires-Dist: msal>=1.32.3
35
36
  Requires-Dist: sphinx>=8.2.3
@@ -63,6 +64,7 @@ Requires-Dist: twilio>=9.6.3
63
64
  Requires-Dist: qrcode>=8.2
64
65
  Requires-Dist: aiofiles>=24.1.0
65
66
  Requires-Dist: bcrypt>=4.3.0
67
+ Requires-Dist: plotly>=6.2.0
66
68
  Provides-Extra: dev
67
69
  Requires-Dist: pytest>=7.0; extra == "dev"
68
70
  Requires-Dist: pytest-cov>=3.0; extra == "dev"
@@ -97,6 +99,17 @@ Dynamic: requires-python
97
99
 
98
100
  ---
99
101
 
102
+ ## 🔥 Latest Release: v0.6.1 (January 26, 2025)
103
+
104
+ **Critical patch fixing middleware compatibility issues from v0.6.0**
105
+
106
+ - 🚨 **Fixed**: All middleware components now use `.execute()` method
107
+ - 🔧 **Fixed**: DataTransformer string transformation validation
108
+ - 🧹 **Fixed**: EventStore async task cleanup preventing crashes
109
+ - 🐳 **New**: Standardized Docker test environment (`./test-env`)
110
+
111
+ [Full Changelog](changelogs/releases/v0.6.1-2025-01-26.md) | [Migration Guide](sdk-users/migration-guides/v0.6.0-to-v0.6.1-migration.md)
112
+
100
113
  ## ✨ Highlights
101
114
 
102
115
  - 🚀 **Rapid Prototyping**: Create and test workflows locally without containerization
@@ -1,11 +1,11 @@
1
- kailash/__init__.py,sha256=sYi59rDLq7hzsiA5ayT8JQ9SVfZLgbXV2WTK4xvg7Nc,1724
1
+ kailash/__init__.py,sha256=ZV1hjURaVjSCN-pI1JcNDbpBxyaYv5DYgnhgupZRzSc,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
5
5
  kailash/manifest.py,sha256=qzOmeMGWz20Sp4IJitSH9gTVbGng7hlimc96VTW4KI8,24814
6
6
  kailash/sdk_exceptions.py,sha256=dueSUxUYqKXmHS5mwl6QtEzP6a0rMGXcBFGCh5sT0tg,10179
7
7
  kailash/security.py,sha256=eTb5rq92vFz7xU1Ov5gM5izRIAi2JQO3Pmf0xe2U3ls,26433
8
- kailash/access_control/__init__.py,sha256=6ZKYHe8SqEdiog369KMmqXBPKM77eBuncwIRbBG8ij4,3958
8
+ kailash/access_control/__init__.py,sha256=ykR_zGJXQoCU_4gGNFbYzhVdUemxeAAoDQLhKIPVBGE,4018
9
9
  kailash/access_control/managers.py,sha256=Vg2inaZqR2GBXsySvPZcEqQtFHgF94z7A_wUHMtA3qA,14431
10
10
  kailash/access_control/rule_evaluators.py,sha256=niguhjThBjA0jIXvdKdGAXzdSM_bAd0ebphGgRrDFKU,15337
11
11
  kailash/api/auth.py,sha256=SnEgCJ2AkFQORDiFHW4-DsMf2HZ4Ox2qfi1iL75wdG0,19913
@@ -22,8 +22,16 @@ kailash/client/enhanced_client.py,sha256=trcDWQsON0Hphj14WozVMbfU7HKuxauknzDfoy1
22
22
  kailash/config/__init__.py,sha256=9qNwtvXAVV-KkHbuL1ZbtC6yXDtowH4YoFiOP-Qbe-w,638
23
23
  kailash/config/database_config.py,sha256=rdlqIP9WUzC0kvAdSjno1LMpu_bEy2v5FgFdgJy-qsc,11588
24
24
  kailash/core/actors/__init__.py,sha256=o8CrwZRTPW5uB3UZiiFtz34n1Q-XBoKNwTz5NMTDQgA,433
25
- kailash/core/actors/connection_actor.py,sha256=TFqlYPEnV8Hjmc706tdRzEw9pBJs2OieH8UeaOrWYIo,18949
25
+ kailash/core/actors/adaptive_pool_controller.py,sha256=tque9heLsLwjrNlM1wZSAYi1RInv19Z3HTjbozc9XtY,22484
26
+ kailash/core/actors/connection_actor.py,sha256=M8fOX1a3jvH5PUkfQyk0eBJqCk0SD9KGZCw0TXLON_o,18979
26
27
  kailash/core/actors/supervisor.py,sha256=7_YXm9o4O_xBs5YxsDFt7RjzaMvTbKcK-jd4KPmSt1M,11968
28
+ kailash/core/ml/__init__.py,sha256=eaD-bmoxMXtwwtKWePsoX1IkcpysX0bMAGyMR7jaAqI,64
29
+ kailash/core/ml/query_patterns.py,sha256=4wV1pBOwUiK80UTKuMXSoRgR0pojtjg2BMNoa5qWpc0,20290
30
+ kailash/core/monitoring/__init__.py,sha256=Qua4i50JYUQcRkWHy1wGyuXGqzqsDVMmdPtud746xts,371
31
+ kailash/core/monitoring/connection_metrics.py,sha256=fvFyHOgMU5lgRB2EB7d-D_F5XERjlmcGAfkrIL0I_OQ,16805
32
+ kailash/core/optimization/__init__.py,sha256=FY5SLLNedH0_aawLYdXHj2rsGdBaaB49QuJ_R9ctHOE,65
33
+ kailash/core/resilience/__init__.py,sha256=nYfMU_hK0CHeK_ZZGZWM3oeI2YjcNg5Wop7bnjPt28c,364
34
+ kailash/core/resilience/circuit_breaker.py,sha256=4fVyTTaz_O4hnPScPK_OKr8MFAltBIuhjQTJd4EGRuQ,14532
27
35
  kailash/database/__init__.py,sha256=keUIl-BhRMSR7ohW4kojaEYCzKmeb_pb4IpWqDqfnOk,686
28
36
  kailash/database/execution_pipeline.py,sha256=1Y-iVXKPoCED3dRoQvOZe1lQyff92NJ__q77NPI0CRQ,16453
29
37
  kailash/edge/__init__.py,sha256=-jhM4xaDAUCbwrq6jJjRCdlf49XDULVTcvfsUiqz_qg,447
@@ -31,8 +39,8 @@ kailash/edge/compliance.py,sha256=tUiKiib7FjNtZ62ThQIRhxkehOddndTGLu-Y4He7iRQ,31
31
39
  kailash/edge/discovery.py,sha256=tEV7W2XVPfEgEOM5oaRAlWAtuXV3M4xM07Z7OcnXZxY,24311
32
40
  kailash/edge/location.py,sha256=ZrG4CqN-taZFo9VDLvZ2z1lNiTHgXcZvzBJS9meXY8k,19717
33
41
  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
42
+ kailash/gateway/api.py,sha256=xpK8PIamsqQPpKAJwacyV7RA_Snjv2pc_0ljnnU9Oy4,9534
43
+ kailash/gateway/enhanced_gateway.py,sha256=IlN1XV01FQrF4rGcq_z9LE4uUHAAAQoVsRNToXENen0,13399
36
44
  kailash/gateway/resource_resolver.py,sha256=IC1dceiKfjfUWToYCIBcrUapuR3LlDG6RJ4o7haLY10,7746
37
45
  kailash/gateway/security.py,sha256=kf4Quf6u7dqhs80fQQ982eHbRb4weDKG0DaYNeKntT4,7557
38
46
  kailash/mcp/__init__.py,sha256=jQHP7EVT126QXmi0TqR1mU3QNrUeEB4oIC4sD4B2a8c,1813
@@ -49,15 +57,15 @@ kailash/mcp/utils/formatters.py,sha256=D-2j1nvmprApiUI13HWY-L2_WPSAcJDtVdHcshAuO
49
57
  kailash/mcp/utils/metrics.py,sha256=MNUjWGQyq1EGdeqzAKCCZJNgcWHOyaYAV8MlS2cb-4k,13754
50
58
  kailash/middleware/__init__.py,sha256=ZGo0qujL-qWn82nIrojY96N1rMPTWFKHumW6CGGpb4Y,10409
51
59
  kailash/middleware/auth/__init__.py,sha256=VkKM8H-zVFx2PLGL7kyxE2IfSiV1HiwveSysbmxMcg0,2077
52
- kailash/middleware/auth/access_control.py,sha256=u8jlfTXRkRteHXi-kiwSGfFFKzAfabxWR6t6L4dU2bk,14954
60
+ kailash/middleware/auth/access_control.py,sha256=2FwQjp_fZm2fg-V_CIgAN69GGL9YwyZwsbQis0hbW7I,14848
53
61
  kailash/middleware/auth/auth_manager.py,sha256=d1XFJ9jOCrOTwV26qO0b7wBOSbroTvTxaJADII-mCz0,14057
54
62
  kailash/middleware/auth/exceptions.py,sha256=tPDQgaX9nMQ9BJZR3Y5tv2LwLy8pZcUz-uFATQjALRA,2496
55
63
  kailash/middleware/auth/jwt_auth.py,sha256=r4dauFKcoARHj0yb4f4WwBmY9YQpLNBGyk4gdBZEI1k,21626
56
64
  kailash/middleware/auth/models.py,sha256=sMQ1JnEDKPId1kLNCi2fDfhgLZX-YguHPnSMfS_UAmw,3514
57
65
  kailash/middleware/auth/utils.py,sha256=AW4fYJ2opQvOr_1YgSQi_MsC_RoFPq0XVOEgbxoXWtw,6555
58
66
  kailash/middleware/communication/__init__.py,sha256=keQ2db4WI2-oZ_nJ5sLE1Tum_RkUt7M2VLTmqOlt0zA,778
59
- kailash/middleware/communication/ai_chat.py,sha256=T4R2dujQ40cFH3mI09FTpc6UCbjTItvFLwG0JGe48BQ,36045
60
- kailash/middleware/communication/api_gateway.py,sha256=NMO-Kysvv_z0c8LORvPViPj31nTnkExV0vvlieVni9w,31724
67
+ kailash/middleware/communication/ai_chat.py,sha256=2XmnJB2Nz2xm2darsF2DYnSLGLAYdyYooHok5GrHKb8,35994
68
+ kailash/middleware/communication/api_gateway.py,sha256=xj81IdaGSG7WIS7klzpYC_iYXsjLICUleBzRCeuLzzQ,31359
61
69
  kailash/middleware/communication/events.py,sha256=MEjgcibNyjA4tSFK8CeXDn1oCE75My7K_saxdCBz2HY,15367
62
70
  kailash/middleware/communication/realtime.py,sha256=JS7lMV1_Ta5orvTJPQsetdCdvIiUdsgYt7M7NSQu6fs,24951
63
71
  kailash/middleware/core/__init__.py,sha256=4yQkOWC4b88zSogs1YVqtKG1PugbncqNCwNNWxTdIZA,545
@@ -73,14 +81,14 @@ kailash/middleware/database/models.py,sha256=CJwwUEdgxqBteXqpFJr1tWskjypJxViZXjO
73
81
  kailash/middleware/database/repositories.py,sha256=7l2OcAem5sMQxbbnmBR4O22P-OcLv5zEo-4r9fIMl1o,23340
74
82
  kailash/middleware/database/session_manager.py,sha256=Pzj7c2TZnM3GRty2igSaxmLOf0-Fs67NVe2Q5lR_C-Q,379
75
83
  kailash/middleware/gateway/__init__.py,sha256=3R7HkvAadJKYCkDHEXFnOPHJ6yzdj8HpBOHtafStqSE,588
76
- kailash/middleware/gateway/checkpoint_manager.py,sha256=kSX90UeSI4gN4aaLa__BOMxIUhNpl0PJ3wGxa7KUCdQ,13606
84
+ kailash/middleware/gateway/checkpoint_manager.py,sha256=zF2ZnHYxQwXmG3d5g7Qwx9pW8tDRTcqV9yh8dvhY95E,15056
77
85
  kailash/middleware/gateway/deduplicator.py,sha256=CblV3fwc7s4wg6KIvypwyNMYL5AuQi9EwtcxVOy64X8,13265
78
86
  kailash/middleware/gateway/durable_gateway.py,sha256=EsIgMNxS_no2W40AXDyE7FmVdnGNU26kBRC5rfnSzoQ,14626
79
87
  kailash/middleware/gateway/durable_request.py,sha256=SCnp-bF0tQX9oahr9reqcZjJ_YhyJkeYYl-un9rJ6lo,15437
80
- kailash/middleware/gateway/event_store.py,sha256=I34ngmHPwy1xb9E1bSdCZ4Mzs6AB6CfMPMosqNKE6FM,14477
88
+ kailash/middleware/gateway/event_store.py,sha256=A3Kh2MhVVPbXWvjeo550SqEGPiJYyspAfu6Gv7UZzo4,16131
81
89
  kailash/middleware/mcp/__init__.py,sha256=EdZB8zOMSBEEmudRzs8ksz9QZJYWQMEx7Tm1MOwIWnI,922
82
90
  kailash/middleware/mcp/client_integration.py,sha256=opzhB5TUts_ND8gARXh93nKCc1u4kwo6SqNMMWqMcSU,18258
83
- kailash/middleware/mcp/enhanced_server.py,sha256=ydU265wAoC2d2sFLuuVzmETowzH9qsqvrzJ5mrwEVvU,18458
91
+ kailash/middleware/mcp/enhanced_server.py,sha256=XUjQt0KyRX207FVYAFenkYHa_K8FWWKquROgXQWkoOQ,18453
84
92
  kailash/nodes/__init__.py,sha256=E6CEp1ooq4GgFhKtwVAczOhPt5N3x-AVQ-R0n3_IFyA,936
85
93
  kailash/nodes/base.py,sha256=Fu9c2I5k_Ke192y4fj2NVhf-Y_I0nPr0sDE1zMSRCJY,55417
86
94
  kailash/nodes/base_async.py,sha256=mpntaeFMbUYLIyTvjsb221mXckx_H2dGX2LhxeKhhfA,6569
@@ -90,19 +98,22 @@ kailash/nodes/mixins.py,sha256=ncAdNQPe1sphLByeerP6G_s8mjFLt7dM4baiozzIBPA,12083
90
98
  kailash/nodes/validation.py,sha256=tuBZRZkDiEdvfeU7JaRB7v2-j1vxPYMJ1gVaJ-PKHRk,12117
91
99
  kailash/nodes/admin/__init__.py,sha256=C9_pK2w0rH6JEV_-roypeasAIyIhEFKKnH-npGBeew0,1508
92
100
  kailash/nodes/admin/audit_log.py,sha256=CSSeWwAK-_hGYXs8eess89wNVju8jvsdNKA1A1946to,41066
93
- kailash/nodes/admin/permission_check.py,sha256=0SY1PojT3kymhE8hjkXlY6t0OuESDGjJl3IkB8lnUlA,63109
101
+ kailash/nodes/admin/permission_check.py,sha256=tLz6aGmNp1xV44Wfy_F1RgvGU4te9qzhNOAEpGo9fdU,66564
94
102
  kailash/nodes/admin/role_management.py,sha256=DVkFJU5yQRf_1TxlvmQBhHzCeE5oJQzIjCKjrEfZb1g,72894
103
+ kailash/nodes/admin/schema.sql,sha256=50V-0NoQmYg66KYVE6rAJxx7LSacCVYs2UvvA1Y9zF0,14028
95
104
  kailash/nodes/admin/schema_manager.py,sha256=U8W8Xn4H5wamEtSq-I9jh54tWQnrLo4vZDKdX3K4bKs,15073
96
105
  kailash/nodes/admin/security_event.py,sha256=We_nGn6_J004b7LQVd0nKU6LmhJ6vyrl5zySC3xVdfo,56336
97
- kailash/nodes/admin/user_management.py,sha256=yoOee8auya9CMiXfDMPH_9A83OdaoJ0B_Sc72sto88w,53702
106
+ kailash/nodes/admin/tenant_isolation.py,sha256=jztFmChohj4ZpwAUdM_z2tKYcFopFtCJ2ViXnlMuvzA,8270
107
+ kailash/nodes/admin/transaction_utils.py,sha256=La3BLwT2XrYtKesiFRGEYL0dXop6JM5TqPUHLx5DYVs,7884
108
+ kailash/nodes/admin/user_management.py,sha256=6u0iMyFKvb_zyaQdiKuGemQM65gEeax9wwEjoadb4Ro,54623
98
109
  kailash/nodes/ai/__init__.py,sha256=rslxIS8jlovshiNgWqVzQjD_kfT_3h3Ct03sk-iRe6U,2202
99
110
  kailash/nodes/ai/a2a.py,sha256=QpTPl-Cm6mqzM0unLfqPrgEu964QP47g5p2T4clVPMs,70004
100
111
  kailash/nodes/ai/agents.py,sha256=CRA3cdapQjpuvOniXUh6ZVWAlRxUIepVw1BROW6QzdY,20373
101
- kailash/nodes/ai/ai_providers.py,sha256=XK7AzC8uL8nIxukZs6bxX4g75vcxCbehefgvR4QJgXk,62824
112
+ kailash/nodes/ai/ai_providers.py,sha256=XeDIaYH7PrX8frWCVV6CYFNQXFjHX_61T3eR1yullqs,65355
102
113
  kailash/nodes/ai/embedding_generator.py,sha256=rsos3B6oWrgGTMIbwSWIBzGH9kq3SFVD_-bEDrujBRs,31860
103
114
  kailash/nodes/ai/intelligent_agent_orchestrator.py,sha256=xw44C-CkcNH3SVmEJ49o4oNV3o4ZqjLE9aLpggwoIXs,83021
104
115
  kailash/nodes/ai/iterative_llm_agent.py,sha256=pv54W_YDfDPDl6DJf0ul9_rs2mL2kE_C59sSAJ4CRn8,52884
105
- kailash/nodes/ai/llm_agent.py,sha256=Beb07UNzCvPjHLTgYG9HeGsmuAXGLPjcExY30DghBfA,77566
116
+ kailash/nodes/ai/llm_agent.py,sha256=-E95jRYZMJzZz7Y4jh4HYHmx7Hoid5ZvZqcEP-OsHqE,82177
106
117
  kailash/nodes/ai/models.py,sha256=wsEeUTuegy87mnLtKgSTg7ggCXvC1n3MsL-iZ4qujHs,16393
107
118
  kailash/nodes/ai/self_organizing.py,sha256=M7yCLkN4I1JCNU7PWuwrqwQSlaG9MJVxYIR44TV52MM,62877
108
119
  kailash/nodes/ai/vision_utils.py,sha256=OHD9cVH_mq0WpJyQkNTj_mpipIVWfSV_bF9eA6CdyeA,4166
@@ -137,14 +148,16 @@ kailash/nodes/data/async_vector.py,sha256=HtwQLO25IXu8Vq80qzU8rMkUAKPQ2qM0x8YxjX
137
148
  kailash/nodes/data/directory.py,sha256=fbfLqD_ijRubk-4xew3604QntPsyDxqaF4k6TpfyjDg,9923
138
149
  kailash/nodes/data/event_generation.py,sha256=Bc1se0tPg1IAGCQDrWqlFmgoOpUyfMN9ku4Lm3akhXU,11579
139
150
  kailash/nodes/data/file_discovery.py,sha256=njLLusndwBFwbaWP8rcaiE0UQ49RpDlNQ-3SXH7Jhi4,21733
151
+ kailash/nodes/data/query_pipeline.py,sha256=qX9QdszpMyjTRrljFLtcY_CytSJRDTpGjt4DhwAdPlk,21710
152
+ kailash/nodes/data/query_router.py,sha256=HExyJlOoz4p5gCYh1zonlFls4Y0r19VvM2TjRztzmqg,32005
140
153
  kailash/nodes/data/readers.py,sha256=fX82yQSLGPUFbSf6krT_-9gybp6IBnBH-Lcr87aNlHQ,45962
141
154
  kailash/nodes/data/retrieval.py,sha256=H8Qb2R64fQ_OeaQBh6jVn7-xLuygiF3fjzbh4ssNOrU,20591
142
155
  kailash/nodes/data/sharepoint_graph.py,sha256=J1_KZQ5s8yXkjGY1PjsMY7T8viKARi3os5P8CXpmn2U,37160
143
156
  kailash/nodes/data/sources.py,sha256=tvgDDDerWELD6QkAm73ciKmNakD_SYMd50idlOjpbF0,3632
144
- kailash/nodes/data/sql.py,sha256=3On6JatlXvGrp2D4MdObX_l_H3CIEoHxqoPUoSfXYso,34426
157
+ kailash/nodes/data/sql.py,sha256=0VfOedQ6UwSiBJtwmMLhAvqQWeakrnB1QNrhjan5jIg,35288
145
158
  kailash/nodes/data/streaming.py,sha256=VE4e3CNuRAdjckV8UXFpkTj3mPLY2cicoZwnkq10ZnE,37163
146
159
  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
160
+ kailash/nodes/data/workflow_connection_pool.py,sha256=o-c-gu4HRtD0i7G6eCLZuOVB4CDJMOXFuL5CbXipZtk,40284
148
161
  kailash/nodes/data/writers.py,sha256=-RPLetKhKAPXOU6YPwMkVRXF8by6ROhgICm3aUnGcFs,17537
149
162
  kailash/nodes/enterprise/__init__.py,sha256=1a6SsEnzozP4MSFDo-Yimzx-e65NwnmGeTDMammSrtk,407
150
163
  kailash/nodes/enterprise/batch_processor.py,sha256=wA9AtBC_roLF040zoFSBo7wqdE2KFWvVLMIRBBR2_cY,27170
@@ -159,9 +172,10 @@ kailash/nodes/mixins/__init__.py,sha256=0WYfu5kj-lHbFwP9g5vmlbsG8UzvI-vhOyHMEUzX
159
172
  kailash/nodes/mixins/event_emitter.py,sha256=xTeNrBWmuWIf8qYA5DZekymjjrTAD1sboW9dKbAP40w,7492
160
173
  kailash/nodes/mixins/mcp.py,sha256=HSULx66VY-e8h5R4HjcNDI5pPVq3MN9HxD8T9FI9vRo,7040
161
174
  kailash/nodes/mixins/security.py,sha256=oxIwfKHd6Sdmd2GIaoNkRcSzVHUusYKyGNA7rM61fvw,5534
162
- kailash/nodes/monitoring/__init__.py,sha256=my9X4QK-RPAtdkHpQSdwnFc7kVPi-XXxnc90-p-vu5s,168
175
+ kailash/nodes/monitoring/__init__.py,sha256=FvNERJPXZbIDeeBGhfhG6L4Q0WV2ritdhIsrig8rfko,164
176
+ kailash/nodes/monitoring/connection_dashboard.py,sha256=mvrBt081SGZ8xNrc_8kdTFQcphxBHUVAPf8xrW4z-3o,29074
163
177
  kailash/nodes/monitoring/performance_benchmark.py,sha256=KPDjsoSZ1TT0Z1teITDdSbdpYXvyJUoPzgsVWdzQybs,87637
164
- kailash/nodes/rag/__init__.py,sha256=Mv7vOBW-8M4vKDdB3xtW0f8ssIjNXPG-13ZJfFuHfug,8692
178
+ kailash/nodes/rag/__init__.py,sha256=3UdByxZHfz2jtrYtUKYcffYdc9Xtd7skoUbKsA2vtfA,8660
165
179
  kailash/nodes/rag/advanced.py,sha256=oPcdS8i4yscJ3NCkwQjv9KCwNhmC_5tp8JZ1_XPQY4I,60265
166
180
  kailash/nodes/rag/agentic.py,sha256=6jmUJphKPYXRH7P3K5fPPFuKy1BYfkgR7Mmkv8JvPaM,24153
167
181
  kailash/nodes/rag/conversational.py,sha256=wmN4dArb1XBYYc2wm-FSDuykqbX8EfsHvA-FVEMjEa0,35498
@@ -196,10 +210,10 @@ kailash/resources/__init__.py,sha256=JM90kDB7k9wTsd6-2jwm-312SeOaXvavyKnPwQwy4PY
196
210
  kailash/resources/factory.py,sha256=CYqBm3EFjTv_Aoqb3AUFT8emJlUrtwAZGCSVLt8K3KA,15824
197
211
  kailash/resources/health.py,sha256=i6XS0HdL6pUYq8SBdRjvchf-oj0sy3JoRLszNylfQJc,9702
198
212
  kailash/resources/reference.py,sha256=RKfXzJFIdid0cLOwsXSmlXq4NhSEci4GO-q3M3qcjA8,7526
199
- kailash/resources/registry.py,sha256=4qXk4rdsPeaUgwizLakq1TG9cLCNuKQGd313vCIstnw,13504
213
+ kailash/resources/registry.py,sha256=5978e9VcUq0XBi9LRN89swptBSOAOAyNmwe2pxFHMxM,13789
200
214
  kailash/runtime/__init__.py,sha256=CvU-qBMESYYISqFOlYlLsYJrXJu0Gqr4x6yr4Ob_Rng,278
201
215
  kailash/runtime/access_controlled.py,sha256=Td8Fa8oPxEqlb74bDiH_HtT6J-ku0AudvN7mrUZOacc,17219
202
- kailash/runtime/async_local.py,sha256=Ebk3-pDij804YCQST7izXzqC0QWAS5--X_pnNqiwNxQ,29900
216
+ kailash/runtime/async_local.py,sha256=XJyJYWmsezZBmAB8Y8xfAbiytPaY1j_zYU_moABP-3E,30313
203
217
  kailash/runtime/docker.py,sha256=sZknVl1PCGfAZeyc0-exTuKlllSyjYlFIgJoiB3CRNs,23500
204
218
  kailash/runtime/local.py,sha256=i2hnRrk2Ks0Q5jR9SkBhM6d6plJbpH0i7rNkJ8laLCw,39078
205
219
  kailash/runtime/parallel.py,sha256=mz_wPD13-YVc3Q_8HkOs4nPQPdTjnjCcnRL7ZRM70lo,21070
@@ -220,7 +234,7 @@ kailash/tracking/storage/base.py,sha256=wWkK1XdrMV0EGxlbFDyfuVnDoIG0tdSPPwz_8iwz
220
234
  kailash/tracking/storage/database.py,sha256=O3-qYmgwTccq9jYl25C0L6R398pXPsWkIAoWLL1aZvQ,20048
221
235
  kailash/tracking/storage/filesystem.py,sha256=VhWxNvqf_Ta3mIaGqKuOrcCqQiEvJj7S8NK5yRd1V68,19627
222
236
  kailash/utils/__init__.py,sha256=pFKhHJxU_kyFE9aGT5recw5E-3nbfVF5pMHepBJWB2E,253
223
- kailash/utils/export.py,sha256=HViwFBtg20VnGBC9gQjHcnu44wQ1u2vOZMXR8EtfGvw,31913
237
+ kailash/utils/export.py,sha256=WBazN03LOCI03TsIElNv31wSZ_uTLPl8THnqdohgyTk,37361
224
238
  kailash/utils/resource_manager.py,sha256=xMgcSogLofUIRpRMXzmK4gxBi2lIqEJ7rn2rsBBm9xo,13209
225
239
  kailash/utils/secure_logging.py,sha256=3iEJt7sXnIgvdiRz8qsx0JbcygrsUf0_C8UHFXLNfcs,11325
226
240
  kailash/utils/templates.py,sha256=1O9mniUTJmZZFkC1gFaWy73pDIZxcawljDIQpPj6G9Q,21977
@@ -236,7 +250,7 @@ kailash/visualization/reports.py,sha256=D7kJ0flHr16d-qSEq8vnw20N8u_dgTrXtKVSXVm8
236
250
  kailash/workflow/__init__.py,sha256=DDQDE9K6RmbX6479guNLLgjiVVV-gQERRvCEJWSVlsM,1836
237
251
  kailash/workflow/async_builder.py,sha256=iv8bDJHdWAUZ77SyMo6sucd92dTdtXesdxycrSE7mM4,20613
238
252
  kailash/workflow/async_patterns.py,sha256=X0ZDXwr6UAu0WC1xnCB7-0V1-tRbKs9UI4JqaBCB6tE,22824
239
- kailash/workflow/builder.py,sha256=CPnfNHlL4HKsX58BI4kOv-CLNrFa_7cg_0lBqqVByYw,10779
253
+ kailash/workflow/builder.py,sha256=FTzvso-FWVAcPYs2DOvL3CSEvbxaVbMP3L2T8_wtzbM,12356
240
254
  kailash/workflow/convergence.py,sha256=vfIDR-uNaQE-LVUEzrRtfgKPgX9gL0nLNH-nTg5ra-c,10031
241
255
  kailash/workflow/cycle_analyzer.py,sha256=BGBpgdB-g0-KRI65sVAvHV4lxfoCzMt4uKOHbw8GXT4,32596
242
256
  kailash/workflow/cycle_builder.py,sha256=uWAx8K4ZKMtFC3mWylK4gHT03xeu0xChJlhw50hVqEE,20883
@@ -246,7 +260,7 @@ kailash/workflow/cycle_exceptions.py,sha256=4_OLnbEXqIiXKzOc3uh8DzFik4wEHwl8bRZh
246
260
  kailash/workflow/cycle_profiler.py,sha256=aEWSCm0Xy15SjgLTpPooVJMzpFhtJWt4livR-3Me4N8,28547
247
261
  kailash/workflow/cycle_state.py,sha256=hzRUvciRreWfS56Cf7ZLQPit_mlPTQDoNTawh8yi-2s,10747
248
262
  kailash/workflow/cyclic_runner.py,sha256=NZqK_GTNbvf-pp08_brvzOlDCytrKscr1XRDy8PD8Is,40816
249
- kailash/workflow/graph.py,sha256=gknGNgv3Z6FyNno90jZLGHZ0tTdiUx0_HAy6bEWh6OQ,56156
263
+ kailash/workflow/graph.py,sha256=zRpGLXeuwtuxFBvE7_16c_bB9yqZirM_uwtfD1_MY4g,59272
250
264
  kailash/workflow/mermaid_visualizer.py,sha256=UsQDvxgIAhy-Th7ZzFnbuziaTx1Cd5yUh6S_25DffoQ,22294
251
265
  kailash/workflow/migration.py,sha256=zsmXgbUtOZdjoOx9YoEY0-x7uOY1T-_yQo4MnZjokCQ,31487
252
266
  kailash/workflow/mock_registry.py,sha256=J4gyH8YdhRyhvORDVxGTya0FgDK8iAA8Nonur6p9s-o,1692
@@ -254,12 +268,12 @@ kailash/workflow/resilience.py,sha256=Ecef4gBg-QWP369a_xfzQnVWhHryvEcO2RSFVSriLJ
254
268
  kailash/workflow/runner.py,sha256=l6jb-H7DwbRlvQ3H3SuTs70rut-u7H3Gi8nybKCEjZU,10795
255
269
  kailash/workflow/safety.py,sha256=pS5GKu7UdkzFZcb16Dn-0jBxjULDU-59_M0CbUVMVyw,11298
256
270
  kailash/workflow/state.py,sha256=UTZxs5-Ona6uvBhx1__i6-RX8gB4qazkBIWE7uyRmWQ,7600
257
- kailash/workflow/templates.py,sha256=MTIMHGyQML6omLbqeKDbTVIVykfXG6pIFWTTsGBUHN0,48591
271
+ kailash/workflow/templates.py,sha256=98EN5H4fO9b4xeczk20Hu5L8hNcAuRQNGayT6vnZYCw,48540
258
272
  kailash/workflow/validation.py,sha256=JIbIajWVIaWHSvWtgZ4WUVJaBaUOCz5B9cyTwM--dL4,33060
259
273
  kailash/workflow/visualization.py,sha256=ICMWCWqh5fOQ7eJygbvu2PMWHxe-H5_0epwdZuz8cMw,19737
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,,
274
+ kailash-0.6.2.dist-info/licenses/LICENSE,sha256=Axe6g7bTrJkToK9h9j2SpRUKKNaDZDCo2lQ2zPxCE6s,1065
275
+ kailash-0.6.2.dist-info/METADATA,sha256=lksSZ5ngxdJDTik-awxRlqV87v3BoZe82PPS6biRnww,25925
276
+ kailash-0.6.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
277
+ kailash-0.6.2.dist-info/entry_points.txt,sha256=M_q3b8PG5W4XbhSgESzIJjh3_4OBKtZFYFsOdkr2vO4,45
278
+ kailash-0.6.2.dist-info/top_level.txt,sha256=z7GzH2mxl66498pVf5HKwo5wwfPtt9Aq95uZUpH6JV0,8
279
+ kailash-0.6.2.dist-info/RECORD,,