kailash 0.1.4__py3-none-any.whl → 0.2.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. kailash/__init__.py +1 -1
  2. kailash/access_control.py +740 -0
  3. kailash/api/__main__.py +6 -0
  4. kailash/api/auth.py +668 -0
  5. kailash/api/custom_nodes.py +285 -0
  6. kailash/api/custom_nodes_secure.py +377 -0
  7. kailash/api/database.py +620 -0
  8. kailash/api/studio.py +915 -0
  9. kailash/api/studio_secure.py +893 -0
  10. kailash/mcp/__init__.py +53 -0
  11. kailash/mcp/__main__.py +13 -0
  12. kailash/mcp/ai_registry_server.py +712 -0
  13. kailash/mcp/client.py +447 -0
  14. kailash/mcp/client_new.py +334 -0
  15. kailash/mcp/server.py +293 -0
  16. kailash/mcp/server_new.py +336 -0
  17. kailash/mcp/servers/__init__.py +12 -0
  18. kailash/mcp/servers/ai_registry.py +289 -0
  19. kailash/nodes/__init__.py +4 -2
  20. kailash/nodes/ai/__init__.py +38 -0
  21. kailash/nodes/ai/a2a.py +1790 -0
  22. kailash/nodes/ai/agents.py +116 -2
  23. kailash/nodes/ai/ai_providers.py +206 -8
  24. kailash/nodes/ai/intelligent_agent_orchestrator.py +2108 -0
  25. kailash/nodes/ai/iterative_llm_agent.py +1280 -0
  26. kailash/nodes/ai/llm_agent.py +324 -1
  27. kailash/nodes/ai/self_organizing.py +1623 -0
  28. kailash/nodes/api/http.py +106 -25
  29. kailash/nodes/api/rest.py +116 -21
  30. kailash/nodes/base.py +15 -2
  31. kailash/nodes/base_async.py +45 -0
  32. kailash/nodes/base_cycle_aware.py +374 -0
  33. kailash/nodes/base_with_acl.py +338 -0
  34. kailash/nodes/code/python.py +135 -27
  35. kailash/nodes/data/readers.py +116 -53
  36. kailash/nodes/data/writers.py +16 -6
  37. kailash/nodes/logic/__init__.py +8 -0
  38. kailash/nodes/logic/async_operations.py +48 -9
  39. kailash/nodes/logic/convergence.py +642 -0
  40. kailash/nodes/logic/loop.py +153 -0
  41. kailash/nodes/logic/operations.py +212 -27
  42. kailash/nodes/logic/workflow.py +26 -18
  43. kailash/nodes/mixins/__init__.py +11 -0
  44. kailash/nodes/mixins/mcp.py +228 -0
  45. kailash/nodes/mixins.py +387 -0
  46. kailash/nodes/transform/__init__.py +8 -1
  47. kailash/nodes/transform/processors.py +119 -4
  48. kailash/runtime/__init__.py +2 -1
  49. kailash/runtime/access_controlled.py +458 -0
  50. kailash/runtime/local.py +106 -33
  51. kailash/runtime/parallel_cyclic.py +529 -0
  52. kailash/sdk_exceptions.py +90 -5
  53. kailash/security.py +845 -0
  54. kailash/tracking/manager.py +38 -15
  55. kailash/tracking/models.py +1 -1
  56. kailash/tracking/storage/filesystem.py +30 -2
  57. kailash/utils/__init__.py +8 -0
  58. kailash/workflow/__init__.py +18 -0
  59. kailash/workflow/convergence.py +270 -0
  60. kailash/workflow/cycle_analyzer.py +768 -0
  61. kailash/workflow/cycle_builder.py +573 -0
  62. kailash/workflow/cycle_config.py +709 -0
  63. kailash/workflow/cycle_debugger.py +760 -0
  64. kailash/workflow/cycle_exceptions.py +601 -0
  65. kailash/workflow/cycle_profiler.py +671 -0
  66. kailash/workflow/cycle_state.py +338 -0
  67. kailash/workflow/cyclic_runner.py +985 -0
  68. kailash/workflow/graph.py +500 -39
  69. kailash/workflow/migration.py +768 -0
  70. kailash/workflow/safety.py +365 -0
  71. kailash/workflow/templates.py +744 -0
  72. kailash/workflow/validation.py +693 -0
  73. {kailash-0.1.4.dist-info → kailash-0.2.0.dist-info}/METADATA +446 -13
  74. kailash-0.2.0.dist-info/RECORD +125 -0
  75. kailash/nodes/mcp/__init__.py +0 -11
  76. kailash/nodes/mcp/client.py +0 -554
  77. kailash/nodes/mcp/resource.py +0 -682
  78. kailash/nodes/mcp/server.py +0 -577
  79. kailash-0.1.4.dist-info/RECORD +0 -85
  80. {kailash-0.1.4.dist-info → kailash-0.2.0.dist-info}/WHEEL +0 -0
  81. {kailash-0.1.4.dist-info → kailash-0.2.0.dist-info}/entry_points.txt +0 -0
  82. {kailash-0.1.4.dist-info → kailash-0.2.0.dist-info}/licenses/LICENSE +0 -0
  83. {kailash-0.1.4.dist-info → kailash-0.2.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kailash
3
- Version: 0.1.4
3
+ Version: 0.2.0
4
4
  Summary: Python SDK for the Kailash container-node architecture
5
5
  Home-page: https://github.com/integrum/kailash-python-sdk
6
6
  Author: Integrum
@@ -47,6 +47,13 @@ Requires-Dist: pytest-asyncio>=1.0.0
47
47
  Requires-Dist: pre-commit>=4.2.0
48
48
  Requires-Dist: twine>=6.1.0
49
49
  Requires-Dist: ollama>=0.5.1
50
+ Requires-Dist: sqlalchemy>=2.0.0
51
+ Requires-Dist: websockets>=12.0
52
+ Requires-Dist: httpx>=0.25.0
53
+ Requires-Dist: python-jose>=3.5.0
54
+ Requires-Dist: pytest-xdist>=3.6.0
55
+ Requires-Dist: pytest-timeout>=2.3.0
56
+ Requires-Dist: pytest-split>=0.9.0
50
57
  Provides-Extra: dev
51
58
  Requires-Dist: pytest>=7.0; extra == "dev"
52
59
  Requires-Dist: pytest-cov>=3.0; extra == "dev"
@@ -66,7 +73,7 @@ Dynamic: requires-python
66
73
  <a href="https://pepy.tech/project/kailash"><img src="https://static.pepy.tech/badge/kailash" alt="Downloads"></a>
67
74
  <img src="https://img.shields.io/badge/license-MIT-green.svg" alt="MIT License">
68
75
  <img src="https://img.shields.io/badge/code%20style-black-000000.svg" alt="Code style: black">
69
- <img src="https://img.shields.io/badge/tests-753%20passing-brightgreen.svg" alt="Tests: 753 passing">
76
+ <img src="https://img.shields.io/badge/tests-734%20passing-brightgreen.svg" alt="Tests: 734 passing">
70
77
  <img src="https://img.shields.io/badge/coverage-100%25-brightgreen.svg" alt="Coverage: 100%">
71
78
  </p>
72
79
 
@@ -92,6 +99,13 @@ Dynamic: requires-python
92
99
  - 🧠 **Retrieval-Augmented Generation**: Full RAG pipeline with intelligent document processing
93
100
  - 🌐 **REST API Wrapper**: Expose any workflow as a production-ready API in 3 lines
94
101
  - 🚪 **Multi-Workflow Gateway**: Manage multiple workflows through unified API with MCP integration
102
+ - 🤖 **Self-Organizing Agents**: Autonomous agent pools with intelligent team formation and convergence detection
103
+ - 🧠 **Agent-to-Agent Communication**: Shared memory pools and intelligent caching for coordinated multi-agent systems
104
+ - 🔒 **Production Security**: Comprehensive security framework with path traversal prevention, code sandboxing, and audit logging
105
+ - 🎨 **Visual Workflow Builder**: Kailash Workflow Studio - drag-and-drop interface for creating and managing workflows (coming soon)
106
+ - 🔁 **Cyclic Workflows (v0.2.0)**: Universal Hybrid Cyclic Graph Architecture with 30,000+ iterations/second performance
107
+ - 🛠️ **Developer Tools**: CycleAnalyzer, CycleDebugger, CycleProfiler for production-ready cyclic workflows
108
+ - 📈 **High Performance**: Optimized execution engine supporting 100,000+ iteration workflows
95
109
 
96
110
  ## 🎯 Who Is This For?
97
111
 
@@ -276,6 +290,141 @@ results, run_id = runtime.execute(workflow)
276
290
  print("RAG Response:", results["llm_agent"]["response"])
277
291
  ```
278
292
 
293
+ ### Cyclic Workflows - Iterative Processing with Convergence
294
+
295
+ Build workflows that iterate until a condition is met, perfect for optimization, retries, and ML training:
296
+
297
+ ```python
298
+ from kailash.workflow import Workflow
299
+ from kailash.nodes.base_cycle_aware import CycleAwareNode
300
+ from kailash.nodes.base import NodeParameter
301
+ from kailash.runtime.local import LocalRuntime
302
+ from typing import Any, Dict
303
+
304
+ # Create a custom cycle-aware node for data quality improvement
305
+ class DataQualityImproverNode(CycleAwareNode):
306
+ def get_parameters(self) -> Dict[str, NodeParameter]:
307
+ return {
308
+ "data": NodeParameter(name="data", type=list, required=True),
309
+ "target_quality": NodeParameter(name="target_quality", type=float, required=False, default=0.95)
310
+ }
311
+
312
+ def run(self, context: Dict[str, Any], **kwargs) -> Dict[str, Any]:
313
+ """Iteratively improve data quality."""
314
+ data = kwargs["data"]
315
+ target_quality = kwargs.get("target_quality", 0.95)
316
+
317
+ # Get current iteration and previous state
318
+ iteration = self.get_iteration(context)
319
+ prev_state = self.get_previous_state(context)
320
+
321
+ # Calculate current quality
322
+ quality = prev_state.get("quality", 0.5) + 0.1 # Improve by 10% each iteration
323
+ quality = min(quality, 1.0)
324
+
325
+ # Process data (simplified)
326
+ processed_data = [item for item in data if item is not None]
327
+
328
+ # Track quality history
329
+ quality_history = self.accumulate_values(context, "quality_history", quality, max_history=10)
330
+
331
+ # Detect convergence trend
332
+ trend = self.detect_convergence_trend(context, "quality_history", window_size=5)
333
+ converged = quality >= target_quality or (trend and trend["slope"] < 0.01)
334
+
335
+ # Log progress
336
+ self.log_cycle_info(context, f"Iteration {iteration}: Quality={quality:.2%}")
337
+
338
+ # Save state for next iteration
339
+ self.set_cycle_state({"quality": quality, "processed_count": len(processed_data)})
340
+
341
+ return {
342
+ "data": processed_data,
343
+ "quality": quality,
344
+ "converged": converged,
345
+ "iteration": iteration,
346
+ "history": quality_history
347
+ }
348
+
349
+ # Build cyclic workflow
350
+ workflow = Workflow("quality_improvement", "Iterative Data Quality")
351
+ workflow.add_node("improver", DataQualityImproverNode())
352
+
353
+ # Create a cycle - node connects to itself!
354
+ workflow.connect("improver", "improver",
355
+ mapping={"data": "data"}, # Pass data to next iteration
356
+ cycle=True, # This is a cycle
357
+ max_iterations=20, # Safety limit
358
+ convergence_check="converged == True") # Stop condition
359
+
360
+ # Execute with automatic iteration management
361
+ runtime = LocalRuntime()
362
+ results, run_id = runtime.execute(workflow, parameters={
363
+ "improver": {
364
+ "data": [1, None, 3, None, 5, 6, None, 8, 9, 10],
365
+ "target_quality": 0.9
366
+ }
367
+ })
368
+
369
+ print(f"Converged after {results['improver']['iteration']} iterations")
370
+ print(f"Final quality: {results['improver']['quality']:.2%}")
371
+ print(f"Quality history: {results['improver']['history']}")
372
+ ```
373
+
374
+ ### NEW in v0.2.0: CycleBuilder API
375
+
376
+ The new CycleBuilder API provides a fluent interface for creating cyclic workflows:
377
+
378
+ ```python
379
+ # Modern approach with CycleBuilder
380
+ workflow.create_cycle("optimization_loop")
381
+ .connect("gradient", "optimizer")
382
+ .connect("optimizer", "evaluator")
383
+ .connect("evaluator", "gradient")
384
+ .max_iterations(100)
385
+ .converge_when("loss < 0.01")
386
+ .early_stop_when("gradient_norm < 1e-6")
387
+ .checkpoint_every(10)
388
+ .build()
389
+
390
+ # Developer tools for production workflows
391
+ from kailash.workflow import CycleAnalyzer, CycleDebugger, CycleProfiler
392
+
393
+ # Analyze cycle patterns
394
+ analyzer = CycleAnalyzer(workflow)
395
+ report = analyzer.analyze()
396
+ print(f"Found {len(report.cycles)} cycles")
397
+ print(f"Max depth: {report.max_cycle_depth}")
398
+
399
+ # Debug with breakpoints
400
+ debugger = CycleDebugger(workflow)
401
+ debugger.set_breakpoint("optimizer", iteration=50)
402
+ debugger.set_trace("gradient_norm", lambda x: x < 0.001)
403
+
404
+ # Profile performance
405
+ profiler = CycleProfiler(workflow)
406
+ profile_data = profiler.profile(runtime, parameters)
407
+ print(f"Bottleneck: {profile_data.bottleneck_node}")
408
+ print(f"Iterations/sec: {profile_data.iterations_per_second}")
409
+ ```
410
+
411
+ #### Cyclic Workflow Features
412
+
413
+ - **Built-in Iteration Management**: No manual loops or recursion needed
414
+ - **State Persistence**: Maintain state across iterations with `get_previous_state()` and `set_cycle_state()`
415
+ - **Convergence Detection**: Automatic trend analysis with `detect_convergence_trend()`
416
+ - **Value Accumulation**: Track metrics over time with `accumulate_values()`
417
+ - **Safety Limits**: Max iterations prevent infinite loops
418
+ - **Performance**: Optimized execution with ~30,000 iterations/second
419
+ - **Developer Tools**: CycleAnalyzer, CycleDebugger, CycleProfiler for production workflows
420
+
421
+ Common cyclic patterns include:
422
+ - **Retry with Backoff**: ETL pipelines with automatic retry
423
+ - **Optimization Loops**: Iterative parameter tuning
424
+ - **ML Training**: Training until accuracy threshold
425
+ - **Polling**: API polling with rate limiting
426
+ - **Stream Processing**: Windowed data processing
427
+
279
428
  ### Workflow API Wrapper - Expose Workflows as REST APIs
280
429
 
281
430
  Transform any Kailash workflow into a production-ready REST API in just 3 lines of code:
@@ -410,6 +559,173 @@ gateway.run(port=8000)
410
559
 
411
560
  See the [Gateway examples](examples/integration_examples/gateway_comprehensive_demo.py) for complete implementation patterns.
412
561
 
562
+ ### Self-Organizing Agent Pools - Autonomous Multi-Agent Systems
563
+
564
+ Build intelligent agent systems that can autonomously form teams, share information, and solve complex problems collaboratively:
565
+
566
+ ```python
567
+ from kailash import Workflow
568
+ from kailash.runtime import LocalRuntime
569
+ from kailash.nodes.ai.intelligent_agent_orchestrator import (
570
+ OrchestrationManagerNode,
571
+ IntelligentCacheNode,
572
+ ConvergenceDetectorNode
573
+ )
574
+ from kailash.nodes.ai.self_organizing import (
575
+ AgentPoolManagerNode,
576
+ TeamFormationNode,
577
+ ProblemAnalyzerNode
578
+ )
579
+ from kailash.nodes.ai.a2a import SharedMemoryPoolNode, A2AAgentNode
580
+
581
+ # Create self-organizing agent workflow
582
+ workflow = Workflow("self_organizing_research")
583
+
584
+ # Shared infrastructure
585
+ memory_pool = SharedMemoryPoolNode(
586
+ memory_size_limit=1000,
587
+ attention_window=50
588
+ )
589
+ workflow.add_node("memory", memory_pool)
590
+
591
+ # Intelligent caching to prevent redundant operations
592
+ cache = IntelligentCacheNode(
593
+ ttl=3600, # 1 hour cache
594
+ similarity_threshold=0.8,
595
+ max_entries=1000
596
+ )
597
+ workflow.add_node("cache", cache)
598
+
599
+ # Problem analysis and team formation
600
+ problem_analyzer = ProblemAnalyzerNode()
601
+ team_former = TeamFormationNode(
602
+ formation_strategy="capability_matching",
603
+ optimization_rounds=3
604
+ )
605
+ workflow.add_node("analyzer", problem_analyzer)
606
+ workflow.add_node("team_former", team_former)
607
+
608
+ # Self-organizing agent pool
609
+ pool_manager = AgentPoolManagerNode(
610
+ max_active_agents=20,
611
+ agent_timeout=120
612
+ )
613
+ workflow.add_node("pool", pool_manager)
614
+
615
+ # Convergence detection for stopping criteria
616
+ convergence = ConvergenceDetectorNode(
617
+ quality_threshold=0.85,
618
+ improvement_threshold=0.02,
619
+ max_iterations=10
620
+ )
621
+ workflow.add_node("convergence", convergence)
622
+
623
+ # Orchestration manager coordinates the entire system
624
+ orchestrator = OrchestrationManagerNode(
625
+ max_iterations=10,
626
+ quality_threshold=0.85,
627
+ parallel_execution=True
628
+ )
629
+ workflow.add_node("orchestrator", orchestrator)
630
+
631
+ # Execute with complex business problem
632
+ runtime = LocalRuntime()
633
+ result, _ = runtime.execute(workflow, parameters={
634
+ "orchestrator": {
635
+ "query": "Analyze market trends and develop growth strategy for fintech",
636
+ "agent_pool_size": 12,
637
+ "mcp_servers": [
638
+ {"name": "market_data", "command": "python", "args": ["-m", "market_mcp"]},
639
+ {"name": "financial", "command": "python", "args": ["-m", "finance_mcp"]},
640
+ {"name": "research", "command": "python", "args": ["-m", "research_mcp"]}
641
+ ],
642
+ "context": {
643
+ "domain": "fintech",
644
+ "depth": "comprehensive",
645
+ "output_format": "strategic_report"
646
+ }
647
+ }
648
+ })
649
+
650
+ print(f"Solution Quality: {result['orchestrator']['quality_score']:.2%}")
651
+ print(f"Agents Used: {result['orchestrator']['agents_deployed']}")
652
+ print(f"Iterations: {result['orchestrator']['iterations_completed']}")
653
+ print(f"Final Strategy: {result['orchestrator']['final_solution']['strategy']}")
654
+ ```
655
+
656
+ #### Key Self-Organizing Features
657
+
658
+ - **Autonomous Team Formation**: Agents automatically form optimal teams based on:
659
+ - Capability matching for skill-specific tasks
660
+ - Swarm-based formation for exploration
661
+ - Market-based allocation for resource constraints
662
+ - Hierarchical organization for complex problems
663
+
664
+ - **Intelligent Information Sharing**:
665
+ - **SharedMemoryPoolNode**: Selective attention mechanisms for relevant information
666
+ - **IntelligentCacheNode**: Semantic similarity detection prevents redundant operations
667
+ - **A2AAgentNode**: Direct agent-to-agent communication with context awareness
668
+
669
+ - **Convergence Detection**: Automatic termination when:
670
+ - Solution quality exceeds threshold (e.g., 85% confidence)
671
+ - Improvement rate drops below minimum (e.g., <2% per iteration)
672
+ - Maximum iterations reached
673
+ - Time limits exceeded
674
+
675
+ - **MCP Integration**: Agents can access external tools and data sources:
676
+ - File systems, databases, APIs
677
+ - Web scraping and research tools
678
+ - Specialized domain knowledge bases
679
+ - Real-time data streams
680
+
681
+ - **Performance Optimization**:
682
+ - Multi-level caching strategies
683
+ - Parallel agent execution
684
+ - Resource management and monitoring
685
+ - Cost tracking for API usage
686
+
687
+ See the [Self-Organizing Agents examples](examples/integration_examples/) for complete implementation patterns and the [Agent Systems Guide](docs/guides/self_organizing_agents.rst) for detailed documentation.
688
+
689
+ ### Zero-Code MCP Ecosystem - Visual Workflow Builder
690
+
691
+ Build and deploy workflows through an interactive web interface without writing any code:
692
+
693
+ ```python
694
+ from kailash.api.gateway import WorkflowAPIGateway
695
+ from kailash.api.mcp_integration import MCPServerRegistry
696
+
697
+ # Run the MCP ecosystem demo
698
+ # cd examples/integration_examples
699
+ # ./run_ecosystem.sh
700
+
701
+ # Or run programmatically:
702
+ python examples/integration_examples/mcp_ecosystem_demo.py
703
+ ```
704
+
705
+ #### Features
706
+
707
+ - **Drag-and-Drop Builder**: Visual interface for creating workflows
708
+ - Drag nodes from palette (CSV Reader, Python Code, JSON Writer, etc.)
709
+ - Drop onto canvas to build workflows
710
+ - Deploy with one click
711
+
712
+ - **Live Dashboard**: Real-time monitoring and statistics
713
+ - Connected MCP server status
714
+ - Running workflow count
715
+ - Execution logs with timestamps
716
+
717
+ - **Pre-built Templates**: One-click deployment
718
+ - GitHub → Slack Notifier
719
+ - Data Processing Pipeline (CSV → Transform → JSON)
720
+ - AI Research Assistant
721
+
722
+ - **Technology Stack**: Lightweight and fast
723
+ - Backend: FastAPI + Kailash SDK
724
+ - Frontend: Vanilla HTML/CSS/JavaScript (no frameworks)
725
+ - Zero build process required
726
+
727
+ See the [MCP Ecosystem example](examples/integration_examples/) for the complete zero-code workflow deployment platform.
728
+
413
729
  ## 📚 Documentation
414
730
 
415
731
  | Resource | Description |
@@ -471,6 +787,21 @@ The SDK includes a rich set of pre-built nodes for common operations:
471
787
  - `SentimentAnalyzer` - Sentiment analysis
472
788
  - `NamedEntityRecognizer` - NER extraction
473
789
 
790
+ **Self-Organizing Agent Nodes**
791
+ - `SharedMemoryPoolNode` - Agent memory sharing
792
+ - `A2AAgentNode` - Agent-to-agent communication
793
+ - `A2ACoordinatorNode` - Multi-agent coordination
794
+ - `IntelligentCacheNode` - Semantic caching system
795
+ - `MCPAgentNode` - MCP-enabled agents
796
+ - `QueryAnalysisNode` - Query complexity analysis
797
+ - `OrchestrationManagerNode` - System orchestration
798
+ - `ConvergenceDetectorNode` - Solution convergence
799
+ - `AgentPoolManagerNode` - Agent pool management
800
+ - `ProblemAnalyzerNode` - Problem decomposition
801
+ - `TeamFormationNode` - Optimal team creation
802
+ - `SolutionEvaluatorNode` - Multi-criteria evaluation
803
+ - `SelfOrganizingAgentNode` - Adaptive individual agents
804
+
474
805
  </td>
475
806
  <td width="50%">
476
807
 
@@ -918,6 +1249,95 @@ This example demonstrates:
918
1249
  - **Context formatting** for LLM input
919
1250
  - **Answer generation** using Ollama's llama3.2 model
920
1251
 
1252
+ ### 🔒 Access Control and Security
1253
+
1254
+ Kailash SDK provides comprehensive access control and security features for enterprise deployments:
1255
+
1256
+ #### Role-Based Access Control (RBAC)
1257
+ ```python
1258
+ from kailash.access_control import UserContext, PermissionRule, NodePermission
1259
+ from kailash.runtime.access_controlled import AccessControlledRuntime
1260
+
1261
+ # Define user with roles
1262
+ user = UserContext(
1263
+ user_id="analyst_001",
1264
+ tenant_id="company_abc",
1265
+ email="analyst@company.com",
1266
+ roles=["analyst", "viewer"]
1267
+ )
1268
+
1269
+ # Create secure runtime
1270
+ runtime = AccessControlledRuntime(user_context=user)
1271
+
1272
+ # Execute workflow with automatic permission checks
1273
+ results, run_id = runtime.execute(workflow, parameters={})
1274
+ ```
1275
+
1276
+ #### Multi-Tenant Isolation
1277
+ ```python
1278
+ from kailash.access_control import get_access_control_manager, PermissionEffect, WorkflowPermission
1279
+
1280
+ # Configure tenant-based access rules
1281
+ acm = get_access_control_manager()
1282
+ acm.enabled = True
1283
+
1284
+ # Tenant isolation rule
1285
+ acm.add_rule(PermissionRule(
1286
+ id="tenant_isolation",
1287
+ resource_type="workflow",
1288
+ resource_id="customer_analytics",
1289
+ permission=WorkflowPermission.EXECUTE,
1290
+ effect=PermissionEffect.ALLOW,
1291
+ tenant_id="company_abc" # Only this tenant can access
1292
+ ))
1293
+ ```
1294
+
1295
+ #### Data Masking and Field Protection
1296
+ ```python
1297
+ from kailash.nodes.base_with_acl import add_access_control
1298
+
1299
+ # Add access control to sensitive data nodes
1300
+ secure_reader = add_access_control(
1301
+ CSVReaderNode(file_path="customers.csv"),
1302
+ enable_access_control=True,
1303
+ required_permission=NodePermission.READ_OUTPUT,
1304
+ mask_output_fields=["ssn", "phone"] # Mask for non-admin users
1305
+ )
1306
+
1307
+ workflow.add_node("secure_data", secure_reader)
1308
+ ```
1309
+
1310
+ #### Permission-Based Routing
1311
+ ```python
1312
+ # Different execution paths based on user permissions
1313
+ from kailash.access_control import NodePermission
1314
+
1315
+ # Admin users get full processing
1316
+ admin_processor = PythonCodeNode.from_function(
1317
+ lambda data: {"result": process_all_data(data)},
1318
+ name="admin_processor"
1319
+ )
1320
+
1321
+ # Analyst users get limited processing
1322
+ analyst_processor = PythonCodeNode.from_function(
1323
+ lambda data: {"result": process_limited_data(data)},
1324
+ name="analyst_processor"
1325
+ )
1326
+
1327
+ # Runtime automatically routes based on user permissions
1328
+ workflow.add_node("admin_path", admin_processor)
1329
+ workflow.add_node("analyst_path", analyst_processor)
1330
+ ```
1331
+
1332
+ **Security Features:**
1333
+ - 🔐 **JWT Authentication**: Token-based authentication with refresh support
1334
+ - 👥 **Multi-Tenant Isolation**: Complete data separation between tenants
1335
+ - 🛡️ **Field-Level Security**: Mask sensitive data based on user roles
1336
+ - 📊 **Audit Logging**: Complete access attempt logging for compliance
1337
+ - 🚫 **Path Traversal Prevention**: Built-in protection against directory attacks
1338
+ - 🏗️ **Backward Compatibility**: Existing workflows work unchanged
1339
+ - ⚡ **Performance Optimized**: Minimal overhead with caching
1340
+
921
1341
  ## 💻 CLI Commands
922
1342
 
923
1343
  The SDK includes a comprehensive CLI for workflow management:
@@ -1104,7 +1524,7 @@ pre-commit run pytest-check
1104
1524
  <td width="40%">
1105
1525
 
1106
1526
  ### ✅ Completed
1107
- - Core node system with 15+ node types
1527
+ - Core node system with 66+ node types
1108
1528
  - Workflow builder with DAG validation
1109
1529
  - Local & async execution engines
1110
1530
  - Task tracking with metrics
@@ -1114,21 +1534,33 @@ pre-commit run pytest-check
1114
1534
  - Immutable state management
1115
1535
  - API integration with rate limiting
1116
1536
  - OAuth 2.0 authentication
1537
+ - Production security framework
1538
+ - Path traversal prevention
1539
+ - Code execution sandboxing
1540
+ - Comprehensive security testing
1117
1541
  - SharePoint Graph API integration
1542
+ - **Self-organizing agent pools with 13 specialized nodes**
1543
+ - **Agent-to-agent communication and shared memory**
1544
+ - **Intelligent caching and convergence detection**
1545
+ - **MCP integration for external tool access**
1546
+ - **Multi-strategy team formation algorithms**
1118
1547
  - **Real-time performance metrics collection**
1119
1548
  - **Performance visualization dashboards**
1120
1549
  - **Real-time monitoring dashboard with WebSocket streaming**
1121
1550
  - **Comprehensive performance reports (HTML, Markdown, JSON)**
1122
- - **89% test coverage (571 tests)**
1123
- - **15 test categories all passing**
1124
- - 37 working examples
1551
+ - **100% test coverage (591 tests)**
1552
+ - **All test categories passing**
1553
+ - 68 working examples
1125
1554
 
1126
1555
  </td>
1127
1556
  <td width="30%">
1128
1557
 
1129
1558
  ### 🚧 In Progress
1130
- - Comprehensive API documentation
1131
- - Security audit & hardening
1559
+ - **Kailash Workflow Studio** - Visual workflow builder UI
1560
+ - React-based drag-and-drop interface
1561
+ - Multi-tenant architecture with Docker
1562
+ - WorkflowStudioAPI backend
1563
+ - Real-time execution monitoring
1132
1564
  - Performance optimizations
1133
1565
  - Docker runtime finalization
1134
1566
 
@@ -1146,11 +1578,12 @@ pre-commit run pytest-check
1146
1578
  </table>
1147
1579
 
1148
1580
  ### 🎯 Test Suite Status
1149
- - **Total Tests**: 571 passing (89%)
1150
- - **Test Categories**: 15/15 at 100%
1151
- - **Integration Tests**: 65 passing
1152
- - **Examples**: 37/37 working
1153
- - **Code Coverage**: 89%
1581
+ - **Total Tests**: 591 passing (100%)
1582
+ - **Test Categories**: All passing
1583
+ - **Integration Tests**: All passing
1584
+ - **Security Tests**: 10 consolidated comprehensive tests
1585
+ - **Examples**: 68/68 working
1586
+ - **Code Coverage**: 100%
1154
1587
 
1155
1588
  ## ⚠️ Known Issues
1156
1589
 
@@ -0,0 +1,125 @@
1
+ kailash/__init__.py,sha256=18nnQJjpf6wotVZ4nNepy5fR8UVttlbAktoQxTepsgk,902
2
+ kailash/__main__.py,sha256=vr7TVE5o16V6LsTmRFKG6RDKUXHpIWYdZ6Dok2HkHnI,198
3
+ kailash/access_control.py,sha256=zLJ6vrBQj9VDO4SP9Mfci9OOu8II5tYq4ERSmWhycg8,25600
4
+ kailash/manifest.py,sha256=8H4ObT3qvdV0FQDXYUF49ppbmOvnK1PmmpdC6h5npn8,24892
5
+ kailash/sdk_exceptions.py,sha256=_l0_xPjkXeFy_4jDW46gjHw_Rj_TndZ9X7NtnU9a298,10469
6
+ kailash/security.py,sha256=jKBMtVLZ4xjbR7vh8aVW4Fcnp-NGflWIakML9zSL_zE,26585
7
+ kailash/api/__init__.py,sha256=9Ofp4qTZCry_hovrtSjPjqyZbrccoPqyz9za_TfSHVg,445
8
+ kailash/api/__main__.py,sha256=79v7N6eCFQ2Otcv66wAv2iM2hD6mwJ__pNiR9yy_qd4,120
9
+ kailash/api/auth.py,sha256=UTGnslYwQxRsz0-kzLiu_pn0QjUrjwDU1EFVCHv15DI,20167
10
+ kailash/api/custom_nodes.py,sha256=e4xqdm4i8bGMGyt3H3Tv7cXSALdgFFyqRL031IDmI9M,10690
11
+ kailash/api/custom_nodes_secure.py,sha256=GAyH2WTvUnvTfdSa6IWKz5d1DW_gbaSQAWTFYiu4k2M,13258
12
+ kailash/api/database.py,sha256=tBslJjpM6cHdicnQGnGXUuc-V6Qkm6UrEfpFP8WwtsU,19477
13
+ kailash/api/gateway.py,sha256=rp0Doz7HaEgLFXRqZvzMk6EfK-M6HmMHcSAJSv28FL8,12576
14
+ kailash/api/mcp_integration.py,sha256=Pvm65Nb1g4-QGKqweeRE-hMJe0HvqhljHB-UTtItnVc,14541
15
+ kailash/api/studio.py,sha256=HNauboOnWTHNcxyulgng4E8MRiZJGqd80u5d8SxPtXU,35056
16
+ kailash/api/studio_secure.py,sha256=sUqvsaTF7P-d2riviuvfFc_sujhjAnnhGcdhqi0H8Ls,32191
17
+ kailash/api/workflow_api.py,sha256=8e4YSeeTQQT_9GJ_5-kWQFhL8v5-qqVWFv3ToREzBXE,13177
18
+ kailash/cli/__init__.py,sha256=kJaqsBp3fRmagJhqA6LMwMbEa_Vkz93hIPH3W5Mn5r0,97
19
+ kailash/cli/commands.py,sha256=K5slsaoYSw7ZpVgePvobN6K4w9_dXJugBTIY0aifKik,18236
20
+ kailash/mcp/__init__.py,sha256=ZEhYIsPcy3sgywvdcr4w2FBjtqorOGXxHCngxK4sy9k,1804
21
+ kailash/mcp/__main__.py,sha256=ohgrksZZ8Z5IDZToH12IUVtW3dl5NtQ63UmprNzGFZ0,215
22
+ kailash/mcp/ai_registry_server.py,sha256=mOVNyQdtiWIalWzXFILl6rt0TfnbJ4RD5ZiADjT3kdk,28155
23
+ kailash/mcp/client.py,sha256=X914ddaAY7NdOxIin-5lLQKDZOLT86u12q0fxXgzGFk,16121
24
+ kailash/mcp/client_new.py,sha256=I9a68gSMWaBv7WRgvDRvHAfm7fdMO_0sbJL0eM9b3gw,10322
25
+ kailash/mcp/server.py,sha256=ESwOulBkEjHJp22lzmCQt33YCz2CQmMFZzhPL0AV4ac,8250
26
+ kailash/mcp/server_new.py,sha256=97Tugk_mMheDIrQ43o_EDui9yYNYBpMONbLd7bYoYiI,10946
27
+ kailash/mcp/servers/__init__.py,sha256=Ajho8j0chg36_DlMsyP6DLsvODgGesOvO0f95BgLxro,325
28
+ kailash/mcp/servers/ai_registry.py,sha256=NLqhsOTD6L8HFOprY6IwaYD-kkgdZD3eg_sIuUPiAhY,10003
29
+ kailash/nodes/__init__.py,sha256=MO2N1k-lq68CuQvsWiYV2GQG0T15X41E1aRkLFL46kU,650
30
+ kailash/nodes/base.py,sha256=k8sKGsMriENzjg0cUtBZ2rUNuD6cvMNZX-DUfdZXxNg,38189
31
+ kailash/nodes/base_async.py,sha256=t9Hf3F30q6CMDfgd2BFkXYIJMEGdEir8xdWCl9euqAs,6622
32
+ kailash/nodes/base_cycle_aware.py,sha256=NJh-8zOfdgBzAK_3faMl9i2aqCp3f4RG1aQ-IJbSSxo,13293
33
+ kailash/nodes/base_with_acl.py,sha256=aeIhLX3B17twYe_B-tba6e47bj7tZ9CstnlCana0aps,11868
34
+ kailash/nodes/mixins.py,sha256=wIG0No-nUSnk6EBnrW4vQt6m_nDVQHhcR2UOHbIyWRE,12116
35
+ kailash/nodes/ai/__init__.py,sha256=rslxIS8jlovshiNgWqVzQjD_kfT_3h3Ct03sk-iRe6U,2202
36
+ kailash/nodes/ai/a2a.py,sha256=U1nDjWkSxlN98b1EwRN-74HtuONHdOoVc-jYEnpQA80,69303
37
+ kailash/nodes/ai/agents.py,sha256=yygZw8eJPt7iuRm4jZR-I2wtfIVrIH8OxoorgZ2HNrw,20379
38
+ kailash/nodes/ai/ai_providers.py,sha256=rtFOvsyUlcoD0voeiCHyBR7ELcRMfJa5T2T7wFyB5js,53026
39
+ kailash/nodes/ai/embedding_generator.py,sha256=UZagRpoybTlV_LMCt0HMUuc1TYFh5yLfs38mqdLItEI,31846
40
+ kailash/nodes/ai/intelligent_agent_orchestrator.py,sha256=8rlP-xOmqE5Y6imRqrXYvLyMq11uF6uKVG4S7seH8HE,80329
41
+ kailash/nodes/ai/iterative_llm_agent.py,sha256=pUPIPt5TcvfCmw9Tw8fp3gQ6AfrLNAEIH4eRmA_CGOE,52912
42
+ kailash/nodes/ai/llm_agent.py,sha256=huU3GwJVOukn0qyJc6T7Nh2v-y-JvJsK-53bCUAZAg0,60780
43
+ kailash/nodes/ai/models.py,sha256=t90NvEIEJJxdBXwW0DhKACQG1Um-sJPm-lBdPBt8-ZA,16399
44
+ kailash/nodes/ai/self_organizing.py,sha256=NCUoq8y3aYZOJNToZhwgl0ExsE9vQaWN0CWAAWR4U7E,60584
45
+ kailash/nodes/api/__init__.py,sha256=1yFcWVYyc-bsilknBT5aAGV7jcp-Ysu_afRilNJlD0A,1529
46
+ kailash/nodes/api/auth.py,sha256=cpHUIZ6-YFo3jkW0K4-eBP38EZCl7Lrfibg5XTZaPWo,19427
47
+ kailash/nodes/api/graphql.py,sha256=PH1ccwbw-fsBfKHl8L_whkZSRMgGAPKM7kkLTmwci5s,16994
48
+ kailash/nodes/api/http.py,sha256=XTkHmmVnGyvIqpNhmjUsRNuk-qYzvWdyF89cg5zHxI8,38396
49
+ kailash/nodes/api/rate_limiting.py,sha256=f-cY_ee5juWHyKT3FqtaTk-SjEgMWX2DxU10Y41DZG4,19728
50
+ kailash/nodes/api/rest.py,sha256=yRLcNuIGVq5Nc1z759tc3Nqt3c2d7UnMqE7lZ8tVKMM,43357
51
+ kailash/nodes/code/__init__.py,sha256=L3QBfnITPb6v-Wbq2ezNWt8xDlC4uGaTgrkqIJ9vGKU,1191
52
+ kailash/nodes/code/python.py,sha256=hUOdS2_dWEcLWkH5m_VeFgJ8tajY0FjJLmDQfHYbbRs,38775
53
+ kailash/nodes/data/__init__.py,sha256=dIPx7Dfk3ZQ_SZvU4qYhAtYMTDCj4DeeXOSqMMW92mI,4107
54
+ kailash/nodes/data/readers.py,sha256=zVAXHAX8yZp5fomlnjc8eXODjjiO8oaxeRWrg7uRk6s,19375
55
+ kailash/nodes/data/retrieval.py,sha256=ANQXk0h5QI_NX_VdgABJEHbKWI3wtiRXCNgoap27M04,7516
56
+ kailash/nodes/data/sharepoint_graph.py,sha256=UIyy8Q-9bGTzj-hjcxne8DkBJvr6Eig1HgY1JqGZqss,22437
57
+ kailash/nodes/data/sources.py,sha256=MaXFPSDg4VN7TN5iNMZxwhxgj6nNpH43tQYmkxhHxjE,3638
58
+ kailash/nodes/data/sql.py,sha256=agu-ZCdHAJKsJI1GCnNrGv7a5WhudpPGYz650vuCUE0,12860
59
+ kailash/nodes/data/streaming.py,sha256=OAME3quVU9NbQFMBM6X-Yiri8Q5WGlEi91U4oGs78Fw,35223
60
+ kailash/nodes/data/vector_db.py,sha256=rywRU65g7ou9v1QPSZmC5esnqC-O0DezGOJS37wKdJs,30556
61
+ kailash/nodes/data/writers.py,sha256=07gDN44i3k0nRv1qRVJYMWmvhyJxcQ4OiDPZ9dzfDIc,17543
62
+ kailash/nodes/logic/__init__.py,sha256=JKGFXwBDfY3s1MWQkx3ivdvCMm3b3HIXCn-wH9uMoG4,603
63
+ kailash/nodes/logic/async_operations.py,sha256=WLV05FG3u02tuHNFbce-aYhiTL0s45fOrGQcvog3mLU,27512
64
+ kailash/nodes/logic/convergence.py,sha256=TrL8nUCqdUp4UxJwjuI-6BdStLcZbb_nP0xgYBhZnmI,24207
65
+ kailash/nodes/logic/loop.py,sha256=lPlLmwz6iMtY89xNvwx7Icvx75sHE6DzurkNPu0G2Zg,5775
66
+ kailash/nodes/logic/operations.py,sha256=zz2Hn4eUM52EkmqTTjb2ujSs1YfG5dSyPga39rZ-dEs,28179
67
+ kailash/nodes/logic/workflow.py,sha256=xo5IS_dB3bz4ApaCOa0LZXkCoornCcBspQs2laA-eBQ,17178
68
+ kailash/nodes/mixins/__init__.py,sha256=AUYcxnBTLZCc_RHFsfcwLYa88yW3pyQHJqfMdcZV-pE,263
69
+ kailash/nodes/mixins/mcp.py,sha256=kE3qhqHlyfUquPyk13u73zfj9oYWuhfrsjWo6q1xbIM,6892
70
+ kailash/nodes/transform/__init__.py,sha256=sIUk7XMEl3x_XKNiRIyVtHmbLRUa0jHj1fEuUyELT_s,584
71
+ kailash/nodes/transform/chunkers.py,sha256=qh2wYq6bdo5qGoDRLrowDrpl4VinRO4hDOj05DOr3RY,2580
72
+ kailash/nodes/transform/formatters.py,sha256=02T87cQ4nVJoUKV9spEBzKa1YxtbV_KurngbhnfkVao,3078
73
+ kailash/nodes/transform/processors.py,sha256=BZjDigpHD5pFxyZ0sty7-jpdEmD11euQip9N3U4Uzlw,18490
74
+ kailash/runtime/__init__.py,sha256=CvU-qBMESYYISqFOlYlLsYJrXJu0Gqr4x6yr4Ob_Rng,278
75
+ kailash/runtime/access_controlled.py,sha256=hEpLv9hwaaJoD03YTkUnr4rWEatFvgRrhu4sa1RTUU4,17274
76
+ kailash/runtime/async_local.py,sha256=h8NrwgXOEX-pgozPS1_TPLCrWeSorf0AqridKX1yI2w,12264
77
+ kailash/runtime/docker.py,sha256=U0nU4fGTLA59H25mBDFC6EkTXry-5bwXkWUgRw1qBqc,23559
78
+ kailash/runtime/local.py,sha256=HCMOkezJ9L3sTWO1x4dAnLMGroaFWwm42MvU-9PCPZs,19001
79
+ kailash/runtime/parallel.py,sha256=VPVSBglVqdnMyyHMgThDedbghK47f6-2Jx7434BAlz4,21129
80
+ kailash/runtime/parallel_cyclic.py,sha256=vAlg_XvdMrrBuDbdhXhI88FCPYgIJ_t--zjKi1kJB1A,19942
81
+ kailash/runtime/runner.py,sha256=wzTiC8hHoy3dca5NRImaw2qfjH1bkUJR2UaFwCkTV6Y,3246
82
+ kailash/runtime/testing.py,sha256=UJdLD7Eh45sa3oIWy6Pe0LA6yf9NcY_9r8YXWUwSuEQ,11578
83
+ kailash/tracking/__init__.py,sha256=nhyecV24JuB_D-veJ3qw7h4oO8Sbdmyb6RvPS6VQktU,305
84
+ kailash/tracking/manager.py,sha256=C7DEMLJN6oQwKnISHqwRbDuGdYs0_j0ATEE3FJjF8eA,28135
85
+ kailash/tracking/metrics_collector.py,sha256=8CvNK3lUIN7BfGy0Re-2WrNKM3J0vx8vjfd-uyvaJJs,11820
86
+ kailash/tracking/models.py,sha256=iMbD60YYkGUik6-cDd_jxG6uiIttS7iR1ALYRug_FDY,18113
87
+ kailash/tracking/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
88
+ kailash/tracking/storage/base.py,sha256=bw4WWoG40G8zJCS0zVQ18-BiBYbt3fnZPx64xq0BY0c,2468
89
+ kailash/tracking/storage/database.py,sha256=3pHaohN_tuP3bfV2gCD8vOdqJSZhuKlGRjigWVme0FQ,20022
90
+ kailash/tracking/storage/filesystem.py,sha256=7Cmpd1CEWhtQu7Buf71d2Nda0r1btJEa7FuilctDP5w,19891
91
+ kailash/utils/__init__.py,sha256=pFKhHJxU_kyFE9aGT5recw5E-3nbfVF5pMHepBJWB2E,253
92
+ kailash/utils/export.py,sha256=LIahj_qIM0vaC5rFnV_iVGaL92jRp1WkYmi8pEgf6yE,31964
93
+ kailash/utils/templates.py,sha256=WBZMd8-HoGB47nhJTSwxEkJi9etfNppOTiwtlZe2DFI,22049
94
+ kailash/visualization/__init__.py,sha256=6bvgE_Rt8z3Rf4kSvdWvZNaTYvbofRHc_QbGlC0xDYE,1880
95
+ kailash/visualization/api.py,sha256=jKjfxuufSsXZEsEWIu6_FF7XHQsjjO2d5MJfO0F8S20,28890
96
+ kailash/visualization/dashboard.py,sha256=euAyqTu5QWwcUOhLBcdYrKnJdFVX_pQThlNLp-yYbaA,32874
97
+ kailash/visualization/performance.py,sha256=qW4sI8ios8__j5-qXUhN7Pa3mE-9E3JTEBkFkt7fSY8,28053
98
+ kailash/visualization/reports.py,sha256=FKERee_SUm12P3QEBwm4Up_WZYcgXPJfx_0ZAzcUNug,52671
99
+ kailash/workflow/__init__.py,sha256=x-yL8h6tsXq5gZj_fVYKJhyYJOEMFbaVXTNIomE-CDo,1011
100
+ kailash/workflow/builder.py,sha256=zoNQT2LUym1ykkoVz5RK4O2aqsmZWGNXHkAnCi8xyUg,7683
101
+ kailash/workflow/convergence.py,sha256=OFoQvnVfFjjhIjncz_16uG8koKVLQC7QhfLP4G7mmH8,10039
102
+ kailash/workflow/cycle_analyzer.py,sha256=iarNvUysLWWOZuLt01Pnk6lkKgVjAtUPUMeYDe_rafs,31616
103
+ kailash/workflow/cycle_builder.py,sha256=4w5X0417d5xP-LxAYNGNY50dn12N5S5nsLdivT0XbsM,21190
104
+ kailash/workflow/cycle_config.py,sha256=QOG-JHfD7PfVrSCH1ahAfC0Qj2cIgDcSCR53TGcY4dw,28188
105
+ kailash/workflow/cycle_debugger.py,sha256=Zu0lkvrfzP8vQZkD6Q5UJqwwkaBLN-G37yIrxuz0PBs,31024
106
+ kailash/workflow/cycle_exceptions.py,sha256=LBHqRvMqEBvAOdU1bKiGXXxCBxJiNmHuCGYTl7k9udg,21744
107
+ kailash/workflow/cycle_profiler.py,sha256=gWH02JIZSFydqMHT_ijZbo3bo2SMEk7G9hHJTbjIHOw,28204
108
+ kailash/workflow/cycle_state.py,sha256=M7f60R8idkHpgNhziutiZV3TPV-cSCz5K_VChHfkj1o,10834
109
+ kailash/workflow/cyclic_runner.py,sha256=VUPU-OMiZB_hBGBtfFwvMAVgzAONNt62C5HuUeNXO4w,37222
110
+ kailash/workflow/graph.py,sha256=D0FyHlHAg1YVpiJrE-6yl5Tkj1uqk1SgT5ygObuSMLQ,51514
111
+ kailash/workflow/mermaid_visualizer.py,sha256=PU_uVeYqR1m59z-qhbQOJHztf0um3FYw9jpF3j22QYA,22351
112
+ kailash/workflow/migration.py,sha256=WGSR6MVxo1NBF9reKRiDQR17ChyokjcSzC-Tp8jz97Y,31725
113
+ kailash/workflow/mock_registry.py,sha256=oweiPQ-mBuDdzTUbo3qZAW6OaBKNqST_1vX32xMtcL4,1704
114
+ kailash/workflow/runner.py,sha256=QATm4y7botMoOFltcHe8CreeUlobJX0M5nLHQ9usRgo,10839
115
+ kailash/workflow/safety.py,sha256=pWXpl1ED76HejNoTn-M5fY4hVB-_-WBWP2_2uo4WGd0,11364
116
+ kailash/workflow/state.py,sha256=3vZkptVfPYqN-Q9aFwO2sUpmy-l1h5vIMVwh67uTwE4,7722
117
+ kailash/workflow/templates.py,sha256=A8sHsFT6zsj20cAK8pnf8IthXMAVzydAm8QnU4HBRfI,24750
118
+ kailash/workflow/validation.py,sha256=50tt7LCNvU3zqWYGFeumtqv6qwR5PftKt45-cBm8QPE,32024
119
+ kailash/workflow/visualization.py,sha256=gSMT-jaSzQBufV4mDArWVPJj5bpNIxTa_NE796Rm8I8,19536
120
+ kailash-0.2.0.dist-info/licenses/LICENSE,sha256=Axe6g7bTrJkToK9h9j2SpRUKKNaDZDCo2lQ2zPxCE6s,1065
121
+ kailash-0.2.0.dist-info/METADATA,sha256=SMk5X-J_SYfKnlDizdsIVIVsyTafI_pDNy6z5XmIcTo,53406
122
+ kailash-0.2.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
123
+ kailash-0.2.0.dist-info/entry_points.txt,sha256=M_q3b8PG5W4XbhSgESzIJjh3_4OBKtZFYFsOdkr2vO4,45
124
+ kailash-0.2.0.dist-info/top_level.txt,sha256=z7GzH2mxl66498pVf5HKwo5wwfPtt9Aq95uZUpH6JV0,8
125
+ kailash-0.2.0.dist-info/RECORD,,
@@ -1,11 +0,0 @@
1
- """Model Context Protocol (MCP) nodes for the Kailash SDK."""
2
-
3
- from .client import MCPClient
4
- from .resource import MCPResource
5
- from .server import MCPServer
6
-
7
- __all__ = [
8
- "MCPClient",
9
- "MCPServer",
10
- "MCPResource",
11
- ]