kailash 0.6.1__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.
@@ -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.1
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
@@ -64,6 +64,7 @@ Requires-Dist: twilio>=9.6.3
64
64
  Requires-Dist: qrcode>=8.2
65
65
  Requires-Dist: aiofiles>=24.1.0
66
66
  Requires-Dist: bcrypt>=4.3.0
67
+ Requires-Dist: plotly>=6.2.0
67
68
  Provides-Extra: dev
68
69
  Requires-Dist: pytest>=7.0; extra == "dev"
69
70
  Requires-Dist: pytest-cov>=3.0; extra == "dev"
@@ -1,4 +1,4 @@
1
- kailash/__init__.py,sha256=3ymX4NjOkCaHdw8nCAxgzBLwNu5hIc9i8zWgOMBRmEg,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
@@ -23,7 +23,7 @@ kailash/config/__init__.py,sha256=9qNwtvXAVV-KkHbuL1ZbtC6yXDtowH4YoFiOP-Qbe-w,63
23
23
  kailash/config/database_config.py,sha256=rdlqIP9WUzC0kvAdSjno1LMpu_bEy2v5FgFdgJy-qsc,11588
24
24
  kailash/core/actors/__init__.py,sha256=o8CrwZRTPW5uB3UZiiFtz34n1Q-XBoKNwTz5NMTDQgA,433
25
25
  kailash/core/actors/adaptive_pool_controller.py,sha256=tque9heLsLwjrNlM1wZSAYi1RInv19Z3HTjbozc9XtY,22484
26
- kailash/core/actors/connection_actor.py,sha256=TFqlYPEnV8Hjmc706tdRzEw9pBJs2OieH8UeaOrWYIo,18949
26
+ kailash/core/actors/connection_actor.py,sha256=M8fOX1a3jvH5PUkfQyk0eBJqCk0SD9KGZCw0TXLON_o,18979
27
27
  kailash/core/actors/supervisor.py,sha256=7_YXm9o4O_xBs5YxsDFt7RjzaMvTbKcK-jd4KPmSt1M,11968
28
28
  kailash/core/ml/__init__.py,sha256=eaD-bmoxMXtwwtKWePsoX1IkcpysX0bMAGyMR7jaAqI,64
29
29
  kailash/core/ml/query_patterns.py,sha256=4wV1pBOwUiK80UTKuMXSoRgR0pojtjg2BMNoa5qWpc0,20290
@@ -39,8 +39,8 @@ kailash/edge/compliance.py,sha256=tUiKiib7FjNtZ62ThQIRhxkehOddndTGLu-Y4He7iRQ,31
39
39
  kailash/edge/discovery.py,sha256=tEV7W2XVPfEgEOM5oaRAlWAtuXV3M4xM07Z7OcnXZxY,24311
40
40
  kailash/edge/location.py,sha256=ZrG4CqN-taZFo9VDLvZ2z1lNiTHgXcZvzBJS9meXY8k,19717
41
41
  kailash/gateway/__init__.py,sha256=zh2uCsDHi82pZ_tGJklsH_FS-Mx9V31r0hkxk48CM-g,927
42
- kailash/gateway/api.py,sha256=rvbqV85Av1w7b0FsOg9pulcguu1Oq0D37t029N-tqsA,9478
43
- 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
44
44
  kailash/gateway/resource_resolver.py,sha256=IC1dceiKfjfUWToYCIBcrUapuR3LlDG6RJ4o7haLY10,7746
45
45
  kailash/gateway/security.py,sha256=kf4Quf6u7dqhs80fQQ982eHbRb4weDKG0DaYNeKntT4,7557
46
46
  kailash/mcp/__init__.py,sha256=jQHP7EVT126QXmi0TqR1mU3QNrUeEB4oIC4sD4B2a8c,1813
@@ -57,7 +57,7 @@ kailash/mcp/utils/formatters.py,sha256=D-2j1nvmprApiUI13HWY-L2_WPSAcJDtVdHcshAuO
57
57
  kailash/mcp/utils/metrics.py,sha256=MNUjWGQyq1EGdeqzAKCCZJNgcWHOyaYAV8MlS2cb-4k,13754
58
58
  kailash/middleware/__init__.py,sha256=ZGo0qujL-qWn82nIrojY96N1rMPTWFKHumW6CGGpb4Y,10409
59
59
  kailash/middleware/auth/__init__.py,sha256=VkKM8H-zVFx2PLGL7kyxE2IfSiV1HiwveSysbmxMcg0,2077
60
- kailash/middleware/auth/access_control.py,sha256=6Z09mPyeTb1VBi2C4wRlyqNaJN0lR-me6GMwxDaoR5c,14954
60
+ kailash/middleware/auth/access_control.py,sha256=2FwQjp_fZm2fg-V_CIgAN69GGL9YwyZwsbQis0hbW7I,14848
61
61
  kailash/middleware/auth/auth_manager.py,sha256=d1XFJ9jOCrOTwV26qO0b7wBOSbroTvTxaJADII-mCz0,14057
62
62
  kailash/middleware/auth/exceptions.py,sha256=tPDQgaX9nMQ9BJZR3Y5tv2LwLy8pZcUz-uFATQjALRA,2496
63
63
  kailash/middleware/auth/jwt_auth.py,sha256=r4dauFKcoARHj0yb4f4WwBmY9YQpLNBGyk4gdBZEI1k,21626
@@ -81,7 +81,7 @@ kailash/middleware/database/models.py,sha256=CJwwUEdgxqBteXqpFJr1tWskjypJxViZXjO
81
81
  kailash/middleware/database/repositories.py,sha256=7l2OcAem5sMQxbbnmBR4O22P-OcLv5zEo-4r9fIMl1o,23340
82
82
  kailash/middleware/database/session_manager.py,sha256=Pzj7c2TZnM3GRty2igSaxmLOf0-Fs67NVe2Q5lR_C-Q,379
83
83
  kailash/middleware/gateway/__init__.py,sha256=3R7HkvAadJKYCkDHEXFnOPHJ6yzdj8HpBOHtafStqSE,588
84
- kailash/middleware/gateway/checkpoint_manager.py,sha256=kSX90UeSI4gN4aaLa__BOMxIUhNpl0PJ3wGxa7KUCdQ,13606
84
+ kailash/middleware/gateway/checkpoint_manager.py,sha256=zF2ZnHYxQwXmG3d5g7Qwx9pW8tDRTcqV9yh8dvhY95E,15056
85
85
  kailash/middleware/gateway/deduplicator.py,sha256=CblV3fwc7s4wg6KIvypwyNMYL5AuQi9EwtcxVOy64X8,13265
86
86
  kailash/middleware/gateway/durable_gateway.py,sha256=EsIgMNxS_no2W40AXDyE7FmVdnGNU26kBRC5rfnSzoQ,14626
87
87
  kailash/middleware/gateway/durable_request.py,sha256=SCnp-bF0tQX9oahr9reqcZjJ_YhyJkeYYl-un9rJ6lo,15437
@@ -98,19 +98,22 @@ kailash/nodes/mixins.py,sha256=ncAdNQPe1sphLByeerP6G_s8mjFLt7dM4baiozzIBPA,12083
98
98
  kailash/nodes/validation.py,sha256=tuBZRZkDiEdvfeU7JaRB7v2-j1vxPYMJ1gVaJ-PKHRk,12117
99
99
  kailash/nodes/admin/__init__.py,sha256=C9_pK2w0rH6JEV_-roypeasAIyIhEFKKnH-npGBeew0,1508
100
100
  kailash/nodes/admin/audit_log.py,sha256=CSSeWwAK-_hGYXs8eess89wNVju8jvsdNKA1A1946to,41066
101
- kailash/nodes/admin/permission_check.py,sha256=0SY1PojT3kymhE8hjkXlY6t0OuESDGjJl3IkB8lnUlA,63109
101
+ kailash/nodes/admin/permission_check.py,sha256=tLz6aGmNp1xV44Wfy_F1RgvGU4te9qzhNOAEpGo9fdU,66564
102
102
  kailash/nodes/admin/role_management.py,sha256=DVkFJU5yQRf_1TxlvmQBhHzCeE5oJQzIjCKjrEfZb1g,72894
103
+ kailash/nodes/admin/schema.sql,sha256=50V-0NoQmYg66KYVE6rAJxx7LSacCVYs2UvvA1Y9zF0,14028
103
104
  kailash/nodes/admin/schema_manager.py,sha256=U8W8Xn4H5wamEtSq-I9jh54tWQnrLo4vZDKdX3K4bKs,15073
104
105
  kailash/nodes/admin/security_event.py,sha256=We_nGn6_J004b7LQVd0nKU6LmhJ6vyrl5zySC3xVdfo,56336
105
- 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
106
109
  kailash/nodes/ai/__init__.py,sha256=rslxIS8jlovshiNgWqVzQjD_kfT_3h3Ct03sk-iRe6U,2202
107
110
  kailash/nodes/ai/a2a.py,sha256=QpTPl-Cm6mqzM0unLfqPrgEu964QP47g5p2T4clVPMs,70004
108
111
  kailash/nodes/ai/agents.py,sha256=CRA3cdapQjpuvOniXUh6ZVWAlRxUIepVw1BROW6QzdY,20373
109
- kailash/nodes/ai/ai_providers.py,sha256=XK7AzC8uL8nIxukZs6bxX4g75vcxCbehefgvR4QJgXk,62824
112
+ kailash/nodes/ai/ai_providers.py,sha256=XeDIaYH7PrX8frWCVV6CYFNQXFjHX_61T3eR1yullqs,65355
110
113
  kailash/nodes/ai/embedding_generator.py,sha256=rsos3B6oWrgGTMIbwSWIBzGH9kq3SFVD_-bEDrujBRs,31860
111
114
  kailash/nodes/ai/intelligent_agent_orchestrator.py,sha256=xw44C-CkcNH3SVmEJ49o4oNV3o4ZqjLE9aLpggwoIXs,83021
112
115
  kailash/nodes/ai/iterative_llm_agent.py,sha256=pv54W_YDfDPDl6DJf0ul9_rs2mL2kE_C59sSAJ4CRn8,52884
113
- kailash/nodes/ai/llm_agent.py,sha256=Beb07UNzCvPjHLTgYG9HeGsmuAXGLPjcExY30DghBfA,77566
116
+ kailash/nodes/ai/llm_agent.py,sha256=-E95jRYZMJzZz7Y4jh4HYHmx7Hoid5ZvZqcEP-OsHqE,82177
114
117
  kailash/nodes/ai/models.py,sha256=wsEeUTuegy87mnLtKgSTg7ggCXvC1n3MsL-iZ4qujHs,16393
115
118
  kailash/nodes/ai/self_organizing.py,sha256=M7yCLkN4I1JCNU7PWuwrqwQSlaG9MJVxYIR44TV52MM,62877
116
119
  kailash/nodes/ai/vision_utils.py,sha256=OHD9cVH_mq0WpJyQkNTj_mpipIVWfSV_bF9eA6CdyeA,4166
@@ -151,7 +154,7 @@ kailash/nodes/data/readers.py,sha256=fX82yQSLGPUFbSf6krT_-9gybp6IBnBH-Lcr87aNlHQ
151
154
  kailash/nodes/data/retrieval.py,sha256=H8Qb2R64fQ_OeaQBh6jVn7-xLuygiF3fjzbh4ssNOrU,20591
152
155
  kailash/nodes/data/sharepoint_graph.py,sha256=J1_KZQ5s8yXkjGY1PjsMY7T8viKARi3os5P8CXpmn2U,37160
153
156
  kailash/nodes/data/sources.py,sha256=tvgDDDerWELD6QkAm73ciKmNakD_SYMd50idlOjpbF0,3632
154
- kailash/nodes/data/sql.py,sha256=3On6JatlXvGrp2D4MdObX_l_H3CIEoHxqoPUoSfXYso,34426
157
+ kailash/nodes/data/sql.py,sha256=0VfOedQ6UwSiBJtwmMLhAvqQWeakrnB1QNrhjan5jIg,35288
155
158
  kailash/nodes/data/streaming.py,sha256=VE4e3CNuRAdjckV8UXFpkTj3mPLY2cicoZwnkq10ZnE,37163
156
159
  kailash/nodes/data/vector_db.py,sha256=pwCl-3tyk_Cv_VQ8GafgodJ1yM88W1BXCIcYC56XoqU,32056
157
160
  kailash/nodes/data/workflow_connection_pool.py,sha256=o-c-gu4HRtD0i7G6eCLZuOVB4CDJMOXFuL5CbXipZtk,40284
@@ -207,10 +210,10 @@ kailash/resources/__init__.py,sha256=JM90kDB7k9wTsd6-2jwm-312SeOaXvavyKnPwQwy4PY
207
210
  kailash/resources/factory.py,sha256=CYqBm3EFjTv_Aoqb3AUFT8emJlUrtwAZGCSVLt8K3KA,15824
208
211
  kailash/resources/health.py,sha256=i6XS0HdL6pUYq8SBdRjvchf-oj0sy3JoRLszNylfQJc,9702
209
212
  kailash/resources/reference.py,sha256=RKfXzJFIdid0cLOwsXSmlXq4NhSEci4GO-q3M3qcjA8,7526
210
- kailash/resources/registry.py,sha256=4qXk4rdsPeaUgwizLakq1TG9cLCNuKQGd313vCIstnw,13504
213
+ kailash/resources/registry.py,sha256=5978e9VcUq0XBi9LRN89swptBSOAOAyNmwe2pxFHMxM,13789
211
214
  kailash/runtime/__init__.py,sha256=CvU-qBMESYYISqFOlYlLsYJrXJu0Gqr4x6yr4Ob_Rng,278
212
215
  kailash/runtime/access_controlled.py,sha256=Td8Fa8oPxEqlb74bDiH_HtT6J-ku0AudvN7mrUZOacc,17219
213
- kailash/runtime/async_local.py,sha256=Ebk3-pDij804YCQST7izXzqC0QWAS5--X_pnNqiwNxQ,29900
216
+ kailash/runtime/async_local.py,sha256=XJyJYWmsezZBmAB8Y8xfAbiytPaY1j_zYU_moABP-3E,30313
214
217
  kailash/runtime/docker.py,sha256=sZknVl1PCGfAZeyc0-exTuKlllSyjYlFIgJoiB3CRNs,23500
215
218
  kailash/runtime/local.py,sha256=i2hnRrk2Ks0Q5jR9SkBhM6d6plJbpH0i7rNkJ8laLCw,39078
216
219
  kailash/runtime/parallel.py,sha256=mz_wPD13-YVc3Q_8HkOs4nPQPdTjnjCcnRL7ZRM70lo,21070
@@ -231,7 +234,7 @@ kailash/tracking/storage/base.py,sha256=wWkK1XdrMV0EGxlbFDyfuVnDoIG0tdSPPwz_8iwz
231
234
  kailash/tracking/storage/database.py,sha256=O3-qYmgwTccq9jYl25C0L6R398pXPsWkIAoWLL1aZvQ,20048
232
235
  kailash/tracking/storage/filesystem.py,sha256=VhWxNvqf_Ta3mIaGqKuOrcCqQiEvJj7S8NK5yRd1V68,19627
233
236
  kailash/utils/__init__.py,sha256=pFKhHJxU_kyFE9aGT5recw5E-3nbfVF5pMHepBJWB2E,253
234
- kailash/utils/export.py,sha256=HViwFBtg20VnGBC9gQjHcnu44wQ1u2vOZMXR8EtfGvw,31913
237
+ kailash/utils/export.py,sha256=WBazN03LOCI03TsIElNv31wSZ_uTLPl8THnqdohgyTk,37361
235
238
  kailash/utils/resource_manager.py,sha256=xMgcSogLofUIRpRMXzmK4gxBi2lIqEJ7rn2rsBBm9xo,13209
236
239
  kailash/utils/secure_logging.py,sha256=3iEJt7sXnIgvdiRz8qsx0JbcygrsUf0_C8UHFXLNfcs,11325
237
240
  kailash/utils/templates.py,sha256=1O9mniUTJmZZFkC1gFaWy73pDIZxcawljDIQpPj6G9Q,21977
@@ -247,7 +250,7 @@ kailash/visualization/reports.py,sha256=D7kJ0flHr16d-qSEq8vnw20N8u_dgTrXtKVSXVm8
247
250
  kailash/workflow/__init__.py,sha256=DDQDE9K6RmbX6479guNLLgjiVVV-gQERRvCEJWSVlsM,1836
248
251
  kailash/workflow/async_builder.py,sha256=iv8bDJHdWAUZ77SyMo6sucd92dTdtXesdxycrSE7mM4,20613
249
252
  kailash/workflow/async_patterns.py,sha256=X0ZDXwr6UAu0WC1xnCB7-0V1-tRbKs9UI4JqaBCB6tE,22824
250
- kailash/workflow/builder.py,sha256=CPnfNHlL4HKsX58BI4kOv-CLNrFa_7cg_0lBqqVByYw,10779
253
+ kailash/workflow/builder.py,sha256=FTzvso-FWVAcPYs2DOvL3CSEvbxaVbMP3L2T8_wtzbM,12356
251
254
  kailash/workflow/convergence.py,sha256=vfIDR-uNaQE-LVUEzrRtfgKPgX9gL0nLNH-nTg5ra-c,10031
252
255
  kailash/workflow/cycle_analyzer.py,sha256=BGBpgdB-g0-KRI65sVAvHV4lxfoCzMt4uKOHbw8GXT4,32596
253
256
  kailash/workflow/cycle_builder.py,sha256=uWAx8K4ZKMtFC3mWylK4gHT03xeu0xChJlhw50hVqEE,20883
@@ -257,7 +260,7 @@ kailash/workflow/cycle_exceptions.py,sha256=4_OLnbEXqIiXKzOc3uh8DzFik4wEHwl8bRZh
257
260
  kailash/workflow/cycle_profiler.py,sha256=aEWSCm0Xy15SjgLTpPooVJMzpFhtJWt4livR-3Me4N8,28547
258
261
  kailash/workflow/cycle_state.py,sha256=hzRUvciRreWfS56Cf7ZLQPit_mlPTQDoNTawh8yi-2s,10747
259
262
  kailash/workflow/cyclic_runner.py,sha256=NZqK_GTNbvf-pp08_brvzOlDCytrKscr1XRDy8PD8Is,40816
260
- kailash/workflow/graph.py,sha256=gknGNgv3Z6FyNno90jZLGHZ0tTdiUx0_HAy6bEWh6OQ,56156
263
+ kailash/workflow/graph.py,sha256=zRpGLXeuwtuxFBvE7_16c_bB9yqZirM_uwtfD1_MY4g,59272
261
264
  kailash/workflow/mermaid_visualizer.py,sha256=UsQDvxgIAhy-Th7ZzFnbuziaTx1Cd5yUh6S_25DffoQ,22294
262
265
  kailash/workflow/migration.py,sha256=zsmXgbUtOZdjoOx9YoEY0-x7uOY1T-_yQo4MnZjokCQ,31487
263
266
  kailash/workflow/mock_registry.py,sha256=J4gyH8YdhRyhvORDVxGTya0FgDK8iAA8Nonur6p9s-o,1692
@@ -265,12 +268,12 @@ kailash/workflow/resilience.py,sha256=Ecef4gBg-QWP369a_xfzQnVWhHryvEcO2RSFVSriLJ
265
268
  kailash/workflow/runner.py,sha256=l6jb-H7DwbRlvQ3H3SuTs70rut-u7H3Gi8nybKCEjZU,10795
266
269
  kailash/workflow/safety.py,sha256=pS5GKu7UdkzFZcb16Dn-0jBxjULDU-59_M0CbUVMVyw,11298
267
270
  kailash/workflow/state.py,sha256=UTZxs5-Ona6uvBhx1__i6-RX8gB4qazkBIWE7uyRmWQ,7600
268
- kailash/workflow/templates.py,sha256=MTIMHGyQML6omLbqeKDbTVIVykfXG6pIFWTTsGBUHN0,48591
271
+ kailash/workflow/templates.py,sha256=98EN5H4fO9b4xeczk20Hu5L8hNcAuRQNGayT6vnZYCw,48540
269
272
  kailash/workflow/validation.py,sha256=JIbIajWVIaWHSvWtgZ4WUVJaBaUOCz5B9cyTwM--dL4,33060
270
273
  kailash/workflow/visualization.py,sha256=ICMWCWqh5fOQ7eJygbvu2PMWHxe-H5_0epwdZuz8cMw,19737
271
- kailash-0.6.1.dist-info/licenses/LICENSE,sha256=Axe6g7bTrJkToK9h9j2SpRUKKNaDZDCo2lQ2zPxCE6s,1065
272
- kailash-0.6.1.dist-info/METADATA,sha256=uYAx8RZ-rKdgoXsNC0jOUmdDIJ8or0CTEm7eWW6z2BA,25896
273
- kailash-0.6.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
274
- kailash-0.6.1.dist-info/entry_points.txt,sha256=M_q3b8PG5W4XbhSgESzIJjh3_4OBKtZFYFsOdkr2vO4,45
275
- kailash-0.6.1.dist-info/top_level.txt,sha256=z7GzH2mxl66498pVf5HKwo5wwfPtt9Aq95uZUpH6JV0,8
276
- kailash-0.6.1.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,,