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.
- kailash/__init__.py +1 -1
- kailash/core/actors/connection_actor.py +3 -3
- kailash/gateway/api.py +7 -5
- kailash/gateway/enhanced_gateway.py +1 -1
- kailash/middleware/auth/access_control.py +5 -5
- kailash/middleware/gateway/checkpoint_manager.py +45 -8
- kailash/nodes/admin/permission_check.py +110 -30
- kailash/nodes/admin/schema.sql +387 -0
- kailash/nodes/admin/tenant_isolation.py +249 -0
- kailash/nodes/admin/transaction_utils.py +244 -0
- kailash/nodes/admin/user_management.py +37 -9
- kailash/nodes/ai/ai_providers.py +55 -3
- kailash/nodes/ai/llm_agent.py +115 -13
- kailash/nodes/data/sql.py +24 -0
- kailash/resources/registry.py +6 -0
- kailash/runtime/async_local.py +7 -0
- kailash/utils/export.py +152 -0
- kailash/workflow/builder.py +42 -0
- kailash/workflow/graph.py +86 -17
- kailash/workflow/templates.py +4 -9
- {kailash-0.6.1.dist-info → kailash-0.6.2.dist-info}/METADATA +2 -1
- {kailash-0.6.1.dist-info → kailash-0.6.2.dist-info}/RECORD +26 -23
- {kailash-0.6.1.dist-info → kailash-0.6.2.dist-info}/WHEEL +0 -0
- {kailash-0.6.1.dist-info → kailash-0.6.2.dist-info}/entry_points.txt +0 -0
- {kailash-0.6.1.dist-info → kailash-0.6.2.dist-info}/licenses/LICENSE +0 -0
- {kailash-0.6.1.dist-info → kailash-0.6.2.dist-info}/top_level.txt +0 -0
kailash/resources/registry.py
CHANGED
@@ -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()
|
kailash/runtime/async_local.py
CHANGED
@@ -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]:
|
kailash/workflow/builder.py
CHANGED
@@ -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
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
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
|
-
|
431
|
-
|
432
|
-
|
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
|
-
#
|
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
|
kailash/workflow/templates.py
CHANGED
@@ -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
|
-
|
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.
|
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=
|
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=
|
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=
|
43
|
-
kailash/gateway/enhanced_gateway.py,sha256=
|
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=
|
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=
|
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=
|
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/
|
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=
|
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
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
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.
|
272
|
-
kailash-0.6.
|
273
|
-
kailash-0.6.
|
274
|
-
kailash-0.6.
|
275
|
-
kailash-0.6.
|
276
|
-
kailash-0.6.
|
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,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|