kailash 0.1.5__py3-none-any.whl → 0.2.1__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 (77) 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 +2 -0
  21. kailash/nodes/ai/a2a.py +714 -67
  22. kailash/nodes/ai/intelligent_agent_orchestrator.py +31 -37
  23. kailash/nodes/ai/iterative_llm_agent.py +1280 -0
  24. kailash/nodes/ai/llm_agent.py +324 -1
  25. kailash/nodes/ai/self_organizing.py +5 -6
  26. kailash/nodes/base.py +15 -2
  27. kailash/nodes/base_async.py +45 -0
  28. kailash/nodes/base_cycle_aware.py +374 -0
  29. kailash/nodes/base_with_acl.py +338 -0
  30. kailash/nodes/code/python.py +135 -27
  31. kailash/nodes/data/__init__.py +1 -2
  32. kailash/nodes/data/readers.py +16 -6
  33. kailash/nodes/data/sql.py +699 -256
  34. kailash/nodes/data/writers.py +16 -6
  35. kailash/nodes/logic/__init__.py +8 -0
  36. kailash/nodes/logic/convergence.py +642 -0
  37. kailash/nodes/logic/loop.py +153 -0
  38. kailash/nodes/logic/operations.py +187 -27
  39. kailash/nodes/mixins/__init__.py +11 -0
  40. kailash/nodes/mixins/mcp.py +228 -0
  41. kailash/nodes/mixins.py +387 -0
  42. kailash/runtime/__init__.py +2 -1
  43. kailash/runtime/access_controlled.py +458 -0
  44. kailash/runtime/local.py +106 -33
  45. kailash/runtime/parallel_cyclic.py +529 -0
  46. kailash/sdk_exceptions.py +90 -5
  47. kailash/security.py +845 -0
  48. kailash/tracking/manager.py +38 -15
  49. kailash/tracking/models.py +1 -1
  50. kailash/tracking/storage/filesystem.py +30 -2
  51. kailash/utils/__init__.py +8 -0
  52. kailash/workflow/__init__.py +18 -0
  53. kailash/workflow/convergence.py +270 -0
  54. kailash/workflow/cycle_analyzer.py +889 -0
  55. kailash/workflow/cycle_builder.py +579 -0
  56. kailash/workflow/cycle_config.py +725 -0
  57. kailash/workflow/cycle_debugger.py +860 -0
  58. kailash/workflow/cycle_exceptions.py +615 -0
  59. kailash/workflow/cycle_profiler.py +741 -0
  60. kailash/workflow/cycle_state.py +338 -0
  61. kailash/workflow/cyclic_runner.py +985 -0
  62. kailash/workflow/graph.py +500 -39
  63. kailash/workflow/migration.py +809 -0
  64. kailash/workflow/safety.py +365 -0
  65. kailash/workflow/templates.py +763 -0
  66. kailash/workflow/validation.py +751 -0
  67. {kailash-0.1.5.dist-info → kailash-0.2.1.dist-info}/METADATA +259 -12
  68. kailash-0.2.1.dist-info/RECORD +125 -0
  69. kailash/nodes/mcp/__init__.py +0 -11
  70. kailash/nodes/mcp/client.py +0 -554
  71. kailash/nodes/mcp/resource.py +0 -682
  72. kailash/nodes/mcp/server.py +0 -577
  73. kailash-0.1.5.dist-info/RECORD +0 -88
  74. {kailash-0.1.5.dist-info → kailash-0.2.1.dist-info}/WHEEL +0 -0
  75. {kailash-0.1.5.dist-info → kailash-0.2.1.dist-info}/entry_points.txt +0 -0
  76. {kailash-0.1.5.dist-info → kailash-0.2.1.dist-info}/licenses/LICENSE +0 -0
  77. {kailash-0.1.5.dist-info → kailash-0.2.1.dist-info}/top_level.txt +0 -0
@@ -34,6 +34,7 @@ import json
34
34
  from typing import Any, Dict
35
35
 
36
36
  from kailash.nodes.base import Node, NodeParameter, register_node
37
+ from kailash.security import safe_open, validate_file_path
37
38
 
38
39
 
39
40
  @register_node()
@@ -190,7 +191,7 @@ class CSVWriterNode(Node):
190
191
  - External tools can process output
191
192
  - Metrics available for monitoring
192
193
  """
193
- file_path = kwargs["file_path"]
194
+ file_path = kwargs.get("file_path") or self.config.get("file_path")
194
195
  data = kwargs["data"]
195
196
  headers = kwargs.get("headers")
196
197
  delimiter = kwargs.get("delimiter", ",")
@@ -198,7 +199,10 @@ class CSVWriterNode(Node):
198
199
  if not data:
199
200
  return {"rows_written": 0}
200
201
 
201
- with open(file_path, "w", newline="", encoding="utf-8") as f:
202
+ # Validate file path for security
203
+ validated_path = validate_file_path(file_path, operation="CSV write")
204
+
205
+ with safe_open(validated_path, "w", newline="", encoding="utf-8") as f:
202
206
  if isinstance(data[0], dict):
203
207
  # Writing dictionaries
204
208
  if not headers:
@@ -357,11 +361,14 @@ class JSONWriterNode(Node):
357
361
  - Version control can track
358
362
  - APIs can import data
359
363
  """
360
- file_path = kwargs["file_path"]
364
+ file_path = kwargs.get("file_path") or self.config.get("file_path")
361
365
  data = kwargs["data"]
362
366
  indent = kwargs.get("indent", 2)
363
367
 
364
- with open(file_path, "w", encoding="utf-8") as f:
368
+ # Validate file path for security
369
+ validated_path = validate_file_path(file_path, operation="JSON write")
370
+
371
+ with safe_open(validated_path, "w", encoding="utf-8") as f:
365
372
  json.dump(data, f, indent=indent, ensure_ascii=False)
366
373
 
367
374
  return {"file_path": file_path}
@@ -517,13 +524,16 @@ class TextWriterNode(Node):
517
524
  - Log analyzers can process
518
525
  - Metrics available for monitoring
519
526
  """
520
- file_path = kwargs["file_path"]
527
+ file_path = kwargs.get("file_path") or self.config.get("file_path")
521
528
  text = kwargs["text"]
522
529
  encoding = kwargs.get("encoding", "utf-8")
523
530
  append = kwargs.get("append", False)
524
531
 
525
532
  mode = "a" if append else "w"
526
- with open(file_path, mode, encoding=encoding) as f:
533
+ # Validate file path for security
534
+ validated_path = validate_file_path(file_path, operation="text write")
535
+
536
+ with safe_open(validated_path, mode, encoding=encoding) as f:
527
537
  f.write(text)
528
538
 
529
539
  return {"file_path": file_path, "bytes_written": len(text.encode(encoding))}
@@ -1,6 +1,11 @@
1
1
  """Logic operation nodes for the Kailash SDK."""
2
2
 
3
3
  from kailash.nodes.logic.async_operations import AsyncMergeNode, AsyncSwitchNode
4
+ from kailash.nodes.logic.convergence import (
5
+ ConvergenceCheckerNode,
6
+ MultiCriteriaConvergenceNode,
7
+ )
8
+ from kailash.nodes.logic.loop import LoopNode
4
9
  from kailash.nodes.logic.operations import MergeNode, SwitchNode
5
10
  from kailash.nodes.logic.workflow import WorkflowNode
6
11
 
@@ -10,4 +15,7 @@ __all__ = [
10
15
  "AsyncSwitchNode",
11
16
  "AsyncMergeNode",
12
17
  "WorkflowNode",
18
+ "LoopNode",
19
+ "ConvergenceCheckerNode",
20
+ "MultiCriteriaConvergenceNode",
13
21
  ]