kailash 0.1.5__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 (75) 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/readers.py +16 -6
  32. kailash/nodes/data/writers.py +16 -6
  33. kailash/nodes/logic/__init__.py +8 -0
  34. kailash/nodes/logic/convergence.py +642 -0
  35. kailash/nodes/logic/loop.py +153 -0
  36. kailash/nodes/logic/operations.py +187 -27
  37. kailash/nodes/mixins/__init__.py +11 -0
  38. kailash/nodes/mixins/mcp.py +228 -0
  39. kailash/nodes/mixins.py +387 -0
  40. kailash/runtime/__init__.py +2 -1
  41. kailash/runtime/access_controlled.py +458 -0
  42. kailash/runtime/local.py +106 -33
  43. kailash/runtime/parallel_cyclic.py +529 -0
  44. kailash/sdk_exceptions.py +90 -5
  45. kailash/security.py +845 -0
  46. kailash/tracking/manager.py +38 -15
  47. kailash/tracking/models.py +1 -1
  48. kailash/tracking/storage/filesystem.py +30 -2
  49. kailash/utils/__init__.py +8 -0
  50. kailash/workflow/__init__.py +18 -0
  51. kailash/workflow/convergence.py +270 -0
  52. kailash/workflow/cycle_analyzer.py +768 -0
  53. kailash/workflow/cycle_builder.py +573 -0
  54. kailash/workflow/cycle_config.py +709 -0
  55. kailash/workflow/cycle_debugger.py +760 -0
  56. kailash/workflow/cycle_exceptions.py +601 -0
  57. kailash/workflow/cycle_profiler.py +671 -0
  58. kailash/workflow/cycle_state.py +338 -0
  59. kailash/workflow/cyclic_runner.py +985 -0
  60. kailash/workflow/graph.py +500 -39
  61. kailash/workflow/migration.py +768 -0
  62. kailash/workflow/safety.py +365 -0
  63. kailash/workflow/templates.py +744 -0
  64. kailash/workflow/validation.py +693 -0
  65. {kailash-0.1.5.dist-info → kailash-0.2.0.dist-info}/METADATA +256 -12
  66. kailash-0.2.0.dist-info/RECORD +125 -0
  67. kailash/nodes/mcp/__init__.py +0 -11
  68. kailash/nodes/mcp/client.py +0 -554
  69. kailash/nodes/mcp/resource.py +0 -682
  70. kailash/nodes/mcp/server.py +0 -577
  71. kailash-0.1.5.dist-info/RECORD +0 -88
  72. {kailash-0.1.5.dist-info → kailash-0.2.0.dist-info}/WHEEL +0 -0
  73. {kailash-0.1.5.dist-info → kailash-0.2.0.dist-info}/entry_points.txt +0 -0
  74. {kailash-0.1.5.dist-info → kailash-0.2.0.dist-info}/licenses/LICENSE +0 -0
  75. {kailash-0.1.5.dist-info → kailash-0.2.0.dist-info}/top_level.txt +0 -0
@@ -1,577 +0,0 @@
1
- """MCP Server node for hosting Model Context Protocol resources and tools."""
2
-
3
- import json
4
- from typing import Any, Dict, List
5
-
6
- from kailash.nodes.base import Node, NodeParameter, register_node
7
-
8
-
9
- @register_node()
10
- class MCPServer(Node):
11
- """
12
- Server node for hosting Model Context Protocol (MCP) resources and tools.
13
-
14
- Design Purpose and Philosophy:
15
- The MCPServer node allows workflows to expose their data and functionality as
16
- standardized MCP resources and tools. This enables other AI applications and
17
- agents to discover and interact with workflow capabilities through the MCP protocol.
18
-
19
- Upstream Dependencies:
20
- - Resource data to expose (files, databases, APIs)
21
- - Tool implementations to register with the server
22
- - Prompt templates to make available to clients
23
- - Server configuration and authentication settings
24
-
25
- Downstream Consumers:
26
- - MCP clients that connect to discover resources
27
- - AI applications that need workflow context
28
- - Other Kailash workflows acting as MCP clients
29
- - External tools and services supporting MCP
30
-
31
- Usage Patterns:
32
- 1. Start MCP server with specified resources and tools
33
- 2. Register dynamic resources that update in real-time
34
- 3. Expose workflow capabilities as callable tools
35
- 4. Provide prompt templates for standardized interactions
36
- 5. Handle client connections and protocol compliance
37
-
38
- Implementation Details:
39
- - Uses the FastMCP framework for rapid server development
40
- - Supports stdio, SSE, and HTTP transports automatically
41
- - Implements proper resource discovery and metadata
42
- - Provides authentication and access control mechanisms
43
- - Handles concurrent client connections efficiently
44
-
45
- Error Handling:
46
- - ServerStartupError: When server fails to initialize
47
- - ResourceRegistrationError: When resources cannot be registered
48
- - ToolExecutionError: When tool calls fail during execution
49
- - ClientConnectionError: When client connections are rejected
50
- - ProtocolViolationError: When clients violate MCP protocol
51
-
52
- Side Effects:
53
- - Starts a network server process listening on specified ports
54
- - Registers resources and tools in the MCP protocol registry
55
- - May modify external systems when tools are executed
56
- - Logs server events and client interactions
57
-
58
- Examples:
59
- ```python
60
- # Start a basic MCP server with resources
61
- server = MCPServer()
62
- result = server.run(
63
- server_config={
64
- "name": "workflow-server",
65
- "transport": "stdio"
66
- },
67
- resources=[
68
- {
69
- "uri": "workflow://current/status",
70
- "name": "Workflow Status",
71
- "content": "Running workflow with 5 active nodes"
72
- }
73
- ],
74
- tools=[
75
- {
76
- "name": "execute_node",
77
- "description": "Execute a specific workflow node",
78
- "parameters": {
79
- "node_id": {"type": "string", "required": True}
80
- }
81
- }
82
- ]
83
- )
84
-
85
- # Register dynamic resources
86
- server_with_dynamic = MCPServer()
87
- result = server_with_dynamic.run(
88
- server_config={
89
- "name": "data-server",
90
- "transport": "http",
91
- "port": 8080
92
- },
93
- resource_providers={
94
- "database://tables/*": "list_database_tables",
95
- "file://workspace/*": "list_workspace_files"
96
- }
97
- )
98
- ```
99
- """
100
-
101
- def get_parameters(self) -> Dict[str, NodeParameter]:
102
- return {
103
- "server_config": NodeParameter(
104
- name="server_config",
105
- type=dict,
106
- required=False,
107
- default={},
108
- description="MCP server configuration (name, transport, port, etc.)",
109
- ),
110
- "resources": NodeParameter(
111
- name="resources",
112
- type=list,
113
- required=False,
114
- default=[],
115
- description="Static resources to expose (list of resource objects)",
116
- ),
117
- "tools": NodeParameter(
118
- name="tools",
119
- type=list,
120
- required=False,
121
- default=[],
122
- description="Tools to register with the server (list of tool definitions)",
123
- ),
124
- "prompts": NodeParameter(
125
- name="prompts",
126
- type=list,
127
- required=False,
128
- default=[],
129
- description="Prompt templates to make available (list of prompt objects)",
130
- ),
131
- "resource_providers": NodeParameter(
132
- name="resource_providers",
133
- type=dict,
134
- required=False,
135
- default={},
136
- description="Dynamic resource providers (URI pattern -> provider function)",
137
- ),
138
- "authentication": NodeParameter(
139
- name="authentication",
140
- type=dict,
141
- required=False,
142
- default={},
143
- description="Authentication configuration (type, credentials, etc.)",
144
- ),
145
- "auto_start": NodeParameter(
146
- name="auto_start",
147
- type=bool,
148
- required=False,
149
- default=True,
150
- description="Whether to automatically start the server",
151
- ),
152
- "max_connections": NodeParameter(
153
- name="max_connections",
154
- type=int,
155
- required=False,
156
- default=10,
157
- description="Maximum number of concurrent client connections",
158
- ),
159
- }
160
-
161
- def run(self, **kwargs) -> Dict[str, Any]:
162
- server_config = kwargs["server_config"]
163
- resources = kwargs.get("resources", [])
164
- tools = kwargs.get("tools", [])
165
- prompts = kwargs.get("prompts", [])
166
- resource_providers = kwargs.get("resource_providers", {})
167
- authentication = kwargs.get("authentication", {})
168
- auto_start = kwargs.get("auto_start", True)
169
- max_connections = kwargs.get("max_connections", 10)
170
-
171
- try:
172
- # Import MCP SDK (graceful fallback if not installed)
173
- try:
174
- import importlib.util
175
-
176
- mcp_spec = importlib.util.find_spec("mcp")
177
- if mcp_spec is not None:
178
- from mcp.server import Server # noqa: F401
179
- from mcp.server.fastmcp import FastMCP # noqa: F401
180
- from mcp.types import Prompt, Resource, Tool # noqa: F401
181
-
182
- mcp_available = True
183
- else:
184
- mcp_available = False
185
- except ImportError:
186
- mcp_available = False
187
-
188
- if not mcp_available:
189
- # Provide mock functionality when MCP SDK is not available
190
- return self._mock_mcp_server(
191
- server_config,
192
- resources,
193
- tools,
194
- prompts,
195
- resource_providers,
196
- authentication,
197
- auto_start,
198
- max_connections,
199
- )
200
-
201
- # Extract server configuration
202
- server_name = server_config.get("name", "kailash-server")
203
- transport_type = server_config.get("transport", "stdio")
204
- port = server_config.get("port", 8080)
205
- host = server_config.get("host", "localhost")
206
-
207
- # For now, provide mock implementation as we need proper MCP server setup
208
- return self._mock_fastmcp_server(
209
- server_name,
210
- transport_type,
211
- host,
212
- port,
213
- resources,
214
- tools,
215
- prompts,
216
- resource_providers,
217
- authentication,
218
- auto_start,
219
- max_connections,
220
- )
221
-
222
- except Exception as e:
223
- return {
224
- "success": False,
225
- "error": str(e),
226
- "error_type": type(e).__name__,
227
- "server_config": server_config,
228
- }
229
-
230
- def _mock_mcp_server(
231
- self,
232
- server_config: dict,
233
- resources: List[dict],
234
- tools: List[dict],
235
- prompts: List[dict],
236
- resource_providers: dict,
237
- authentication: dict,
238
- auto_start: bool,
239
- max_connections: int,
240
- ) -> Dict[str, Any]:
241
- """Mock MCP server when SDK is not available."""
242
- server_name = server_config.get("name", "mock-server")
243
- transport = server_config.get("transport", "stdio")
244
-
245
- # Validate resources
246
- validated_resources = []
247
- for resource in resources:
248
- if not isinstance(resource, dict):
249
- continue
250
-
251
- uri = resource.get("uri")
252
- name = resource.get("name", uri)
253
- description = resource.get("description", f"Resource: {name}")
254
-
255
- if uri:
256
- validated_resources.append(
257
- {
258
- "uri": uri,
259
- "name": name,
260
- "description": description,
261
- "mimeType": resource.get("mimeType", "text/plain"),
262
- "content": resource.get("content"),
263
- }
264
- )
265
-
266
- # Validate tools
267
- validated_tools = []
268
- for tool in tools:
269
- if not isinstance(tool, dict):
270
- continue
271
-
272
- name = tool.get("name")
273
- description = tool.get("description", f"Tool: {name}")
274
-
275
- if name:
276
- validated_tools.append(
277
- {
278
- "name": name,
279
- "description": description,
280
- "inputSchema": tool.get("parameters", {}),
281
- "handler": tool.get("handler", f"mock_handler_{name}"),
282
- }
283
- )
284
-
285
- # Validate prompts
286
- validated_prompts = []
287
- for prompt in prompts:
288
- if not isinstance(prompt, dict):
289
- continue
290
-
291
- name = prompt.get("name")
292
- description = prompt.get("description", f"Prompt: {name}")
293
-
294
- if name:
295
- validated_prompts.append(
296
- {
297
- "name": name,
298
- "description": description,
299
- "arguments": prompt.get("arguments", []),
300
- "template": prompt.get("template", f"Mock template for {name}"),
301
- }
302
- )
303
-
304
- # Mock server status
305
- server_status = {
306
- "name": server_name,
307
- "transport": transport,
308
- "status": "running" if auto_start else "configured",
309
- "pid": 12345, # Mock process ID
310
- "started_at": "2025-06-01T12:00:00Z",
311
- "uptime": "0:00:05",
312
- "connections": {"active": 0, "total": 0, "max": max_connections},
313
- "capabilities": {
314
- "resources": True,
315
- "tools": True,
316
- "prompts": True,
317
- "logging": True,
318
- },
319
- }
320
-
321
- if transport == "http":
322
- host = server_config.get("host", "localhost")
323
- port = server_config.get("port", 8080)
324
- server_status.update(
325
- {
326
- "host": host,
327
- "port": port,
328
- "url": f"http://{host}:{port}",
329
- "endpoints": {
330
- "sse": f"http://{host}:{port}/sse",
331
- "resources": f"http://{host}:{port}/resources",
332
- "tools": f"http://{host}:{port}/tools",
333
- "prompts": f"http://{host}:{port}/prompts",
334
- },
335
- }
336
- )
337
-
338
- return {
339
- "success": True,
340
- "server": server_status,
341
- "resources": {
342
- "registered": validated_resources,
343
- "count": len(validated_resources),
344
- "providers": (
345
- list(resource_providers.keys()) if resource_providers else []
346
- ),
347
- },
348
- "tools": {"registered": validated_tools, "count": len(validated_tools)},
349
- "prompts": {
350
- "registered": validated_prompts,
351
- "count": len(validated_prompts),
352
- },
353
- "authentication": {
354
- "enabled": bool(authentication),
355
- "type": authentication.get("type", "none"),
356
- },
357
- "mock": True,
358
- "message": f"Mock MCP server '{server_name}' configured successfully",
359
- }
360
-
361
- def _mock_fastmcp_server(
362
- self,
363
- server_name: str,
364
- transport_type: str,
365
- host: str,
366
- port: int,
367
- resources: List[dict],
368
- tools: List[dict],
369
- prompts: List[dict],
370
- resource_providers: dict,
371
- authentication: dict,
372
- auto_start: bool,
373
- max_connections: int,
374
- ) -> Dict[str, Any]:
375
- """Mock FastMCP server implementation."""
376
-
377
- # Create mock FastMCP server configuration
378
- server_code = f"""
379
- # Mock FastMCP server code for {server_name}
380
- from mcp.server.fastmcp import FastMCP
381
-
382
- # Create server instance
383
- mcp = FastMCP("{server_name}")
384
-
385
- # Register resources
386
- {self._generate_resource_code(resources)}
387
-
388
- # Register tools
389
- {self._generate_tool_code(tools)}
390
-
391
- # Register prompts
392
- {self._generate_prompt_code(prompts)}
393
-
394
- # Dynamic resource providers
395
- {self._generate_provider_code(resource_providers)}
396
-
397
- if __name__ == "__main__":
398
- mcp.run()
399
- """
400
-
401
- # Mock server startup
402
- startup_info = {
403
- "server_name": server_name,
404
- "transport": transport_type,
405
- "generated_code": server_code,
406
- "status": "ready" if auto_start else "configured",
407
- "resources_count": len(resources),
408
- "tools_count": len(tools),
409
- "prompts_count": len(prompts),
410
- "providers_count": len(resource_providers),
411
- }
412
-
413
- if transport_type == "http":
414
- startup_info.update(
415
- {
416
- "host": host,
417
- "port": port,
418
- "url": f"http://{host}:{port}",
419
- "sse_endpoint": f"http://{host}:{port}/sse",
420
- }
421
- )
422
-
423
- return {
424
- "success": True,
425
- "server": startup_info,
426
- "code": server_code,
427
- "mock": True,
428
- "next_steps": [
429
- "Save the generated code to a Python file",
430
- "Install MCP dependencies: pip install 'mcp[cli]'",
431
- "Run the server: python server_file.py",
432
- "Connect clients using the specified transport",
433
- ],
434
- }
435
-
436
- def _generate_resource_code(self, resources: List[dict]) -> str:
437
- """Generate Python code for resource registration."""
438
- if not resources:
439
- return "# No static resources defined"
440
-
441
- code_lines = []
442
- for resource in resources:
443
- uri = resource.get("uri", "")
444
- content = resource.get("content", "")
445
- name = resource.get("name", uri)
446
-
447
- # Escape strings for Python code
448
- content_escaped = json.dumps(content) if content else '""'
449
-
450
- code_lines.append(f'@mcp.resource("{uri}")')
451
- code_lines.append(f"def get_{self._sanitize_name(uri)}():")
452
- code_lines.append(f' """Resource: {name}"""')
453
- code_lines.append(f" return {content_escaped}")
454
- code_lines.append("")
455
-
456
- return "\n".join(code_lines)
457
-
458
- def _generate_tool_code(self, tools: List[dict]) -> str:
459
- """Generate Python code for tool registration."""
460
- if not tools:
461
- return "# No tools defined"
462
-
463
- code_lines = []
464
- for tool in tools:
465
- name = tool.get("name", "")
466
- description = tool.get("description", "")
467
- parameters = tool.get("parameters", {})
468
-
469
- # Generate function parameters from schema
470
- param_list = []
471
-
472
- # Handle OpenAPI schema format
473
- if isinstance(parameters, dict) and "properties" in parameters:
474
- properties = parameters.get("properties", {})
475
- required = parameters.get("required", [])
476
-
477
- for param_name, param_info in properties.items():
478
- param_type = (
479
- param_info.get("type", "str")
480
- if isinstance(param_info, dict)
481
- else "str"
482
- )
483
- if param_name in required:
484
- param_list.append(f"{param_name}: {param_type}")
485
- else:
486
- param_list.append(f"{param_name}: {param_type} = None")
487
- # Handle simple parameter format
488
- elif isinstance(parameters, dict):
489
- for param_name, param_info in parameters.items():
490
- if isinstance(param_info, dict):
491
- param_type = param_info.get("type", "str")
492
- if param_info.get("required", False):
493
- param_list.append(f"{param_name}: {param_type}")
494
- else:
495
- param_list.append(f"{param_name}: {param_type} = None")
496
- else:
497
- param_list.append(f"{param_name}: str = None")
498
-
499
- param_str = ", ".join(param_list) if param_list else ""
500
-
501
- code_lines.append("@mcp.tool()")
502
- code_lines.append(f"def {name}({param_str}):")
503
- code_lines.append(f' """{description}"""')
504
- code_lines.append(" # Mock tool implementation")
505
- code_lines.append(
506
- f' return {{"tool": "{name}", "status": "executed", "parameters": locals()}}'
507
- )
508
- code_lines.append("")
509
-
510
- return "\n".join(code_lines)
511
-
512
- def _generate_prompt_code(self, prompts: List[dict]) -> str:
513
- """Generate Python code for prompt registration."""
514
- if not prompts:
515
- return "# No prompts defined"
516
-
517
- code_lines = []
518
- for prompt in prompts:
519
- name = prompt.get("name", "")
520
- template = prompt.get("template", "")
521
- arguments = prompt.get("arguments", [])
522
-
523
- # Generate function parameters from arguments
524
- param_list = []
525
- for arg in arguments:
526
- if isinstance(arg, dict):
527
- arg_name = arg.get("name", "")
528
- if arg.get("required", False):
529
- param_list.append(f"{arg_name}: str")
530
- else:
531
- param_list.append(f"{arg_name}: str = ''")
532
-
533
- param_str = ", ".join(param_list) if param_list else ""
534
-
535
- code_lines.append(f'@mcp.prompt("{name}")')
536
- code_lines.append(f"def {name}_prompt({param_str}):")
537
- code_lines.append(f' """Prompt: {name}"""')
538
- if template:
539
- template_escaped = json.dumps(template)
540
- code_lines.append(f" template = {template_escaped}")
541
- code_lines.append(" return template.format(**locals())")
542
- else:
543
- code_lines.append(
544
- f' return f"Mock prompt: {name} with args: {{locals()}}"'
545
- )
546
- code_lines.append("")
547
-
548
- return "\n".join(code_lines)
549
-
550
- def _generate_provider_code(self, providers: dict) -> str:
551
- """Generate Python code for dynamic resource providers."""
552
- if not providers:
553
- return "# No dynamic resource providers defined"
554
-
555
- code_lines = []
556
- for pattern, provider_func in providers.items():
557
- sanitized_pattern = self._sanitize_name(pattern)
558
-
559
- code_lines.append(f'@mcp.resource("{pattern}")')
560
- code_lines.append(f"def dynamic_{sanitized_pattern}(**kwargs):")
561
- code_lines.append(f' """Dynamic resource provider for {pattern}"""')
562
- code_lines.append(" # Mock dynamic resource implementation")
563
- code_lines.append(' return f"Dynamic content for {kwargs}"')
564
- code_lines.append("")
565
-
566
- return "\n".join(code_lines)
567
-
568
- def _sanitize_name(self, name: str) -> str:
569
- """Sanitize a name for use as Python identifier."""
570
- import re
571
-
572
- # Replace non-alphanumeric characters with underscores
573
- sanitized = re.sub(r"[^a-zA-Z0-9_]", "_", name)
574
- # Ensure it starts with a letter or underscore
575
- if sanitized and sanitized[0].isdigit():
576
- sanitized = f"r_{sanitized}"
577
- return sanitized or "unnamed"
@@ -1,88 +0,0 @@
1
- kailash/__init__.py,sha256=7XGjhqUBqULYrT7-nZ7UM9dd7SAOiZs7o-pUmxuHaaQ,902
2
- kailash/__main__.py,sha256=vr7TVE5o16V6LsTmRFKG6RDKUXHpIWYdZ6Dok2HkHnI,198
3
- kailash/manifest.py,sha256=8H4ObT3qvdV0FQDXYUF49ppbmOvnK1PmmpdC6h5npn8,24892
4
- kailash/sdk_exceptions.py,sha256=l2AWF2BB7cLLPi95CRAxKWUQmD-cCBVgnbgztgn4H_s,6967
5
- kailash/api/__init__.py,sha256=9Ofp4qTZCry_hovrtSjPjqyZbrccoPqyz9za_TfSHVg,445
6
- kailash/api/gateway.py,sha256=rp0Doz7HaEgLFXRqZvzMk6EfK-M6HmMHcSAJSv28FL8,12576
7
- kailash/api/mcp_integration.py,sha256=Pvm65Nb1g4-QGKqweeRE-hMJe0HvqhljHB-UTtItnVc,14541
8
- kailash/api/workflow_api.py,sha256=8e4YSeeTQQT_9GJ_5-kWQFhL8v5-qqVWFv3ToREzBXE,13177
9
- kailash/cli/__init__.py,sha256=kJaqsBp3fRmagJhqA6LMwMbEa_Vkz93hIPH3W5Mn5r0,97
10
- kailash/cli/commands.py,sha256=K5slsaoYSw7ZpVgePvobN6K4w9_dXJugBTIY0aifKik,18236
11
- kailash/nodes/__init__.py,sha256=dy36thqtYzTWkyLpmV93e7G0RXslzCtByLZvib4WYPM,564
12
- kailash/nodes/base.py,sha256=Q2gUtyFYQOtq9Y1blikLAm030Ccn-lWtIVp1Q8UNDhI,37823
13
- kailash/nodes/base_async.py,sha256=7tHM14qSxbZxbqCZeI-Ac4WR-NwpBPOLX5QUfW2HlBQ,4867
14
- kailash/nodes/ai/__init__.py,sha256=Pct4gxsTFFbS37VWpQruGw8rA7n-Oqh4LUWGDpzdh50,2118
15
- kailash/nodes/ai/a2a.py,sha256=_gs7avm16SjzvQ2Fw-BdMWjDbTuTUgDdmL4Ehzo9368,43595
16
- kailash/nodes/ai/agents.py,sha256=yygZw8eJPt7iuRm4jZR-I2wtfIVrIH8OxoorgZ2HNrw,20379
17
- kailash/nodes/ai/ai_providers.py,sha256=rtFOvsyUlcoD0voeiCHyBR7ELcRMfJa5T2T7wFyB5js,53026
18
- kailash/nodes/ai/embedding_generator.py,sha256=UZagRpoybTlV_LMCt0HMUuc1TYFh5yLfs38mqdLItEI,31846
19
- kailash/nodes/ai/intelligent_agent_orchestrator.py,sha256=7fmvG_QA6Rpy56kR1MaTQOgON3TvEFbXx4srBqy_PIw,80518
20
- kailash/nodes/ai/llm_agent.py,sha256=wRNAiwzxJGcvC0_O-dqeNy7aZ_gmzvac0DLjBqS3vC8,46607
21
- kailash/nodes/ai/models.py,sha256=t90NvEIEJJxdBXwW0DhKACQG1Um-sJPm-lBdPBt8-ZA,16399
22
- kailash/nodes/ai/self_organizing.py,sha256=BBjgVoXKKjMYLZoBW6diRqHsSZoPD63poce0tRv6lR4,60692
23
- kailash/nodes/api/__init__.py,sha256=1yFcWVYyc-bsilknBT5aAGV7jcp-Ysu_afRilNJlD0A,1529
24
- kailash/nodes/api/auth.py,sha256=cpHUIZ6-YFo3jkW0K4-eBP38EZCl7Lrfibg5XTZaPWo,19427
25
- kailash/nodes/api/graphql.py,sha256=PH1ccwbw-fsBfKHl8L_whkZSRMgGAPKM7kkLTmwci5s,16994
26
- kailash/nodes/api/http.py,sha256=XTkHmmVnGyvIqpNhmjUsRNuk-qYzvWdyF89cg5zHxI8,38396
27
- kailash/nodes/api/rate_limiting.py,sha256=f-cY_ee5juWHyKT3FqtaTk-SjEgMWX2DxU10Y41DZG4,19728
28
- kailash/nodes/api/rest.py,sha256=yRLcNuIGVq5Nc1z759tc3Nqt3c2d7UnMqE7lZ8tVKMM,43357
29
- kailash/nodes/code/__init__.py,sha256=L3QBfnITPb6v-Wbq2ezNWt8xDlC4uGaTgrkqIJ9vGKU,1191
30
- kailash/nodes/code/python.py,sha256=HD1a8sIR6yTTjlm6B7x_fzBOqUE8QU_ybBz1lMrEVpY,35536
31
- kailash/nodes/data/__init__.py,sha256=dIPx7Dfk3ZQ_SZvU4qYhAtYMTDCj4DeeXOSqMMW92mI,4107
32
- kailash/nodes/data/readers.py,sha256=_tAxmOsSGLph91Zwj9R98SGSui9K0hd4JinsXQyJyrM,18816
33
- kailash/nodes/data/retrieval.py,sha256=ANQXk0h5QI_NX_VdgABJEHbKWI3wtiRXCNgoap27M04,7516
34
- kailash/nodes/data/sharepoint_graph.py,sha256=UIyy8Q-9bGTzj-hjcxne8DkBJvr6Eig1HgY1JqGZqss,22437
35
- kailash/nodes/data/sources.py,sha256=MaXFPSDg4VN7TN5iNMZxwhxgj6nNpH43tQYmkxhHxjE,3638
36
- kailash/nodes/data/sql.py,sha256=agu-ZCdHAJKsJI1GCnNrGv7a5WhudpPGYz650vuCUE0,12860
37
- kailash/nodes/data/streaming.py,sha256=OAME3quVU9NbQFMBM6X-Yiri8Q5WGlEi91U4oGs78Fw,35223
38
- kailash/nodes/data/vector_db.py,sha256=rywRU65g7ou9v1QPSZmC5esnqC-O0DezGOJS37wKdJs,30556
39
- kailash/nodes/data/writers.py,sha256=5tv0Qf-Wjhsd03epDUafvlTTLd5Q1NeCYaR-hQfIeJU,16981
40
- kailash/nodes/logic/__init__.py,sha256=kP24cdxLPdguL1a2GkTkP_bp_mU7MbhveeMLm5-Y8oA,365
41
- kailash/nodes/logic/async_operations.py,sha256=WLV05FG3u02tuHNFbce-aYhiTL0s45fOrGQcvog3mLU,27512
42
- kailash/nodes/logic/operations.py,sha256=EYZ6YGx0clCwt7dLadCICBDVaOEoF9D8LBVUUvpkAeI,21840
43
- kailash/nodes/logic/workflow.py,sha256=xo5IS_dB3bz4ApaCOa0LZXkCoornCcBspQs2laA-eBQ,17178
44
- kailash/nodes/mcp/__init__.py,sha256=Ea1vtdGpVRGTL4QrRGsrh9mhKIprXFWWBN68E9ljqps,225
45
- kailash/nodes/mcp/client.py,sha256=YVJlfjnY-DzyxY3AqcgtNcSH5RPAcTUuR703R_SEiTg,20674
46
- kailash/nodes/mcp/resource.py,sha256=A5luATUYGNiO1ESXmaInpvuGrPwLOk6ioBw_tIhXB0M,24469
47
- kailash/nodes/mcp/server.py,sha256=jZEIA6xqvsboeqQGT3tn-26pu8y9R46VQOKUmSpxQPk,20836
48
- kailash/nodes/transform/__init__.py,sha256=sIUk7XMEl3x_XKNiRIyVtHmbLRUa0jHj1fEuUyELT_s,584
49
- kailash/nodes/transform/chunkers.py,sha256=qh2wYq6bdo5qGoDRLrowDrpl4VinRO4hDOj05DOr3RY,2580
50
- kailash/nodes/transform/formatters.py,sha256=02T87cQ4nVJoUKV9spEBzKa1YxtbV_KurngbhnfkVao,3078
51
- kailash/nodes/transform/processors.py,sha256=BZjDigpHD5pFxyZ0sty7-jpdEmD11euQip9N3U4Uzlw,18490
52
- kailash/runtime/__init__.py,sha256=jDdjbnUKyNnLx8Fc3fydaBERG2MuBN-NBvU_V2_4kmg,187
53
- kailash/runtime/async_local.py,sha256=h8NrwgXOEX-pgozPS1_TPLCrWeSorf0AqridKX1yI2w,12264
54
- kailash/runtime/docker.py,sha256=U0nU4fGTLA59H25mBDFC6EkTXry-5bwXkWUgRw1qBqc,23559
55
- kailash/runtime/local.py,sha256=XiDTiCCAtow9N_kcg68QVdEBHkEsqpG7lVeH0kmh1aI,15944
56
- kailash/runtime/parallel.py,sha256=VPVSBglVqdnMyyHMgThDedbghK47f6-2Jx7434BAlz4,21129
57
- kailash/runtime/runner.py,sha256=wzTiC8hHoy3dca5NRImaw2qfjH1bkUJR2UaFwCkTV6Y,3246
58
- kailash/runtime/testing.py,sha256=UJdLD7Eh45sa3oIWy6Pe0LA6yf9NcY_9r8YXWUwSuEQ,11578
59
- kailash/tracking/__init__.py,sha256=nhyecV24JuB_D-veJ3qw7h4oO8Sbdmyb6RvPS6VQktU,305
60
- kailash/tracking/manager.py,sha256=ERzs2qkFSsqZjNEbQhO1lXZm1aipjMeP1PmQIcwgSSE,27069
61
- kailash/tracking/metrics_collector.py,sha256=8CvNK3lUIN7BfGy0Re-2WrNKM3J0vx8vjfd-uyvaJJs,11820
62
- kailash/tracking/models.py,sha256=Yt0lgBwTx1ldAKdOh6wKaq6e9XIcGg6X1jUrHEVb8uw,18094
63
- kailash/tracking/storage/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
- kailash/tracking/storage/base.py,sha256=bw4WWoG40G8zJCS0zVQ18-BiBYbt3fnZPx64xq0BY0c,2468
65
- kailash/tracking/storage/database.py,sha256=3pHaohN_tuP3bfV2gCD8vOdqJSZhuKlGRjigWVme0FQ,20022
66
- kailash/tracking/storage/filesystem.py,sha256=hOifk6bmJozKpMyRHfiPFJ62KOZcXoRwXnKgC9jvCMI,18745
67
- kailash/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
- kailash/utils/export.py,sha256=LIahj_qIM0vaC5rFnV_iVGaL92jRp1WkYmi8pEgf6yE,31964
69
- kailash/utils/templates.py,sha256=WBZMd8-HoGB47nhJTSwxEkJi9etfNppOTiwtlZe2DFI,22049
70
- kailash/visualization/__init__.py,sha256=6bvgE_Rt8z3Rf4kSvdWvZNaTYvbofRHc_QbGlC0xDYE,1880
71
- kailash/visualization/api.py,sha256=jKjfxuufSsXZEsEWIu6_FF7XHQsjjO2d5MJfO0F8S20,28890
72
- kailash/visualization/dashboard.py,sha256=euAyqTu5QWwcUOhLBcdYrKnJdFVX_pQThlNLp-yYbaA,32874
73
- kailash/visualization/performance.py,sha256=qW4sI8ios8__j5-qXUhN7Pa3mE-9E3JTEBkFkt7fSY8,28053
74
- kailash/visualization/reports.py,sha256=FKERee_SUm12P3QEBwm4Up_WZYcgXPJfx_0ZAzcUNug,52671
75
- kailash/workflow/__init__.py,sha256=RyXoTH1WJRXO6gK6oorQI7iWC-yeevEnF6q1ZBVWGKc,438
76
- kailash/workflow/builder.py,sha256=zoNQT2LUym1ykkoVz5RK4O2aqsmZWGNXHkAnCi8xyUg,7683
77
- kailash/workflow/graph.py,sha256=WbL8Oq84Kukhzrv75gdxiWJkIt6h7GkHIk0xEI18Ug8,30294
78
- kailash/workflow/mermaid_visualizer.py,sha256=PU_uVeYqR1m59z-qhbQOJHztf0um3FYw9jpF3j22QYA,22351
79
- kailash/workflow/mock_registry.py,sha256=oweiPQ-mBuDdzTUbo3qZAW6OaBKNqST_1vX32xMtcL4,1704
80
- kailash/workflow/runner.py,sha256=QATm4y7botMoOFltcHe8CreeUlobJX0M5nLHQ9usRgo,10839
81
- kailash/workflow/state.py,sha256=3vZkptVfPYqN-Q9aFwO2sUpmy-l1h5vIMVwh67uTwE4,7722
82
- kailash/workflow/visualization.py,sha256=gSMT-jaSzQBufV4mDArWVPJj5bpNIxTa_NE796Rm8I8,19536
83
- kailash-0.1.5.dist-info/licenses/LICENSE,sha256=Axe6g7bTrJkToK9h9j2SpRUKKNaDZDCo2lQ2zPxCE6s,1065
84
- kailash-0.1.5.dist-info/METADATA,sha256=ypGNmh_M3h3OJq2Zfd3UpiYTLVPHe7XSe5MZlLKXnyY,44188
85
- kailash-0.1.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
86
- kailash-0.1.5.dist-info/entry_points.txt,sha256=M_q3b8PG5W4XbhSgESzIJjh3_4OBKtZFYFsOdkr2vO4,45
87
- kailash-0.1.5.dist-info/top_level.txt,sha256=z7GzH2mxl66498pVf5HKwo5wwfPtt9Aq95uZUpH6JV0,8
88
- kailash-0.1.5.dist-info/RECORD,,