agent_os_kernel 3.1.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.
- agent_control_plane/__init__.py +662 -0
- agent_control_plane/a2a_adapter.py +543 -0
- agent_control_plane/adapter.py +417 -0
- agent_control_plane/agent_hibernation.py +394 -0
- agent_control_plane/agent_kernel.py +470 -0
- agent_control_plane/compliance.py +720 -0
- agent_control_plane/constraint_graphs.py +478 -0
- agent_control_plane/control_plane.py +854 -0
- agent_control_plane/example_executors.py +195 -0
- agent_control_plane/execution_engine.py +231 -0
- agent_control_plane/flight_recorder.py +846 -0
- agent_control_plane/governance_layer.py +435 -0
- agent_control_plane/hf_utils.py +563 -0
- agent_control_plane/interfaces/__init__.py +55 -0
- agent_control_plane/interfaces/kernel_interface.py +361 -0
- agent_control_plane/interfaces/plugin_interface.py +497 -0
- agent_control_plane/interfaces/protocol_interfaces.py +387 -0
- agent_control_plane/kernel_space.py +1009 -0
- agent_control_plane/langchain_adapter.py +424 -0
- agent_control_plane/lifecycle.py +3113 -0
- agent_control_plane/mcp_adapter.py +653 -0
- agent_control_plane/ml_safety.py +563 -0
- agent_control_plane/multimodal.py +727 -0
- agent_control_plane/mute_agent.py +422 -0
- agent_control_plane/observability.py +787 -0
- agent_control_plane/orchestrator.py +482 -0
- agent_control_plane/plugin_registry.py +750 -0
- agent_control_plane/policy_engine.py +954 -0
- agent_control_plane/process_isolation.py +777 -0
- agent_control_plane/shadow_mode.py +310 -0
- agent_control_plane/signals.py +493 -0
- agent_control_plane/supervisor_agents.py +430 -0
- agent_control_plane/time_travel_debugger.py +557 -0
- agent_control_plane/tool_registry.py +452 -0
- agent_control_plane/vfs.py +697 -0
- agent_kernel/__init__.py +69 -0
- agent_kernel/analyzer.py +435 -0
- agent_kernel/auditor.py +36 -0
- agent_kernel/completeness_auditor.py +237 -0
- agent_kernel/detector.py +203 -0
- agent_kernel/kernel.py +744 -0
- agent_kernel/memory_manager.py +85 -0
- agent_kernel/models.py +374 -0
- agent_kernel/nudge_mechanism.py +263 -0
- agent_kernel/outcome_analyzer.py +338 -0
- agent_kernel/patcher.py +582 -0
- agent_kernel/semantic_analyzer.py +316 -0
- agent_kernel/semantic_purge.py +349 -0
- agent_kernel/simulator.py +449 -0
- agent_kernel/teacher.py +85 -0
- agent_kernel/triage.py +152 -0
- agent_os/__init__.py +409 -0
- agent_os/_adversarial_impl.py +200 -0
- agent_os/_circuit_breaker_impl.py +232 -0
- agent_os/_mcp_metrics.py +193 -0
- agent_os/adversarial.py +20 -0
- agent_os/agents_compat.py +490 -0
- agent_os/audit_logger.py +135 -0
- agent_os/base_agent.py +651 -0
- agent_os/circuit_breaker.py +34 -0
- agent_os/cli/__init__.py +659 -0
- agent_os/cli/cmd_audit.py +128 -0
- agent_os/cli/cmd_init.py +152 -0
- agent_os/cli/cmd_policy.py +41 -0
- agent_os/cli/cmd_policy_gen.py +180 -0
- agent_os/cli/cmd_validate.py +258 -0
- agent_os/cli/mcp_scan.py +265 -0
- agent_os/cli/output.py +192 -0
- agent_os/cli/policy_checker.py +330 -0
- agent_os/compat.py +74 -0
- agent_os/constraint_graph.py +234 -0
- agent_os/content_governance.py +140 -0
- agent_os/context_budget.py +305 -0
- agent_os/credential_redactor.py +224 -0
- agent_os/diff_policy.py +89 -0
- agent_os/egress_policy.py +159 -0
- agent_os/escalation.py +276 -0
- agent_os/event_bus.py +124 -0
- agent_os/exceptions.py +180 -0
- agent_os/execution_context_policy.py +141 -0
- agent_os/github_enterprise.py +96 -0
- agent_os/health.py +20 -0
- agent_os/integrations/__init__.py +279 -0
- agent_os/integrations/a2a_adapter.py +279 -0
- agent_os/integrations/agent_lightning/__init__.py +30 -0
- agent_os/integrations/anthropic_adapter.py +420 -0
- agent_os/integrations/autogen_adapter.py +620 -0
- agent_os/integrations/base.py +1137 -0
- agent_os/integrations/compat.py +229 -0
- agent_os/integrations/config.py +98 -0
- agent_os/integrations/conversation_guardian.py +957 -0
- agent_os/integrations/crewai_adapter.py +467 -0
- agent_os/integrations/drift_detector.py +425 -0
- agent_os/integrations/dry_run.py +124 -0
- agent_os/integrations/escalation.py +582 -0
- agent_os/integrations/gemini_adapter.py +364 -0
- agent_os/integrations/google_adk_adapter.py +633 -0
- agent_os/integrations/guardrails_adapter.py +394 -0
- agent_os/integrations/health.py +197 -0
- agent_os/integrations/langchain_adapter.py +654 -0
- agent_os/integrations/llamafirewall.py +343 -0
- agent_os/integrations/llamaindex_adapter.py +188 -0
- agent_os/integrations/logging.py +191 -0
- agent_os/integrations/maf_adapter.py +631 -0
- agent_os/integrations/mistral_adapter.py +365 -0
- agent_os/integrations/openai_adapter.py +816 -0
- agent_os/integrations/openai_agents_sdk.py +406 -0
- agent_os/integrations/policy_compose.py +171 -0
- agent_os/integrations/profiling.py +144 -0
- agent_os/integrations/pydantic_ai_adapter.py +420 -0
- agent_os/integrations/rate_limiter.py +130 -0
- agent_os/integrations/rbac.py +143 -0
- agent_os/integrations/registry.py +113 -0
- agent_os/integrations/scope_guard.py +303 -0
- agent_os/integrations/semantic_kernel_adapter.py +769 -0
- agent_os/integrations/smolagents_adapter.py +629 -0
- agent_os/integrations/templates.py +178 -0
- agent_os/integrations/token_budget.py +134 -0
- agent_os/integrations/tool_aliases.py +190 -0
- agent_os/integrations/webhooks.py +177 -0
- agent_os/lite.py +208 -0
- agent_os/mcp_gateway.py +385 -0
- agent_os/mcp_message_signer.py +273 -0
- agent_os/mcp_protocols.py +161 -0
- agent_os/mcp_response_scanner.py +232 -0
- agent_os/mcp_security.py +924 -0
- agent_os/mcp_session_auth.py +231 -0
- agent_os/mcp_sliding_rate_limiter.py +184 -0
- agent_os/memory_guard.py +409 -0
- agent_os/metrics.py +134 -0
- agent_os/mute.py +428 -0
- agent_os/mute_agent.py +209 -0
- agent_os/policies/__init__.py +77 -0
- agent_os/policies/async_evaluator.py +275 -0
- agent_os/policies/backends.py +670 -0
- agent_os/policies/bridge.py +169 -0
- agent_os/policies/budget.py +85 -0
- agent_os/policies/cli.py +294 -0
- agent_os/policies/conflict_resolution.py +270 -0
- agent_os/policies/data_classification.py +252 -0
- agent_os/policies/evaluator.py +239 -0
- agent_os/policies/policy_schema.json +228 -0
- agent_os/policies/rate_limiting.py +145 -0
- agent_os/policies/schema.py +115 -0
- agent_os/policies/shared.py +331 -0
- agent_os/prompt_injection.py +694 -0
- agent_os/providers.py +182 -0
- agent_os/py.typed +0 -0
- agent_os/retry.py +81 -0
- agent_os/reversibility.py +251 -0
- agent_os/sandbox.py +432 -0
- agent_os/sandbox_provider.py +140 -0
- agent_os/secure_codegen.py +525 -0
- agent_os/security_skills.py +538 -0
- agent_os/semantic_policy.py +422 -0
- agent_os/server/__init__.py +15 -0
- agent_os/server/__main__.py +25 -0
- agent_os/server/app.py +277 -0
- agent_os/server/models.py +104 -0
- agent_os/shift_left_metrics.py +130 -0
- agent_os/stateless.py +742 -0
- agent_os/supervisor.py +148 -0
- agent_os/task_outcome.py +148 -0
- agent_os/transparency.py +181 -0
- agent_os/trust_root.py +128 -0
- agent_os_kernel-3.1.0.dist-info/METADATA +1269 -0
- agent_os_kernel-3.1.0.dist-info/RECORD +337 -0
- agent_os_kernel-3.1.0.dist-info/WHEEL +4 -0
- agent_os_kernel-3.1.0.dist-info/entry_points.txt +2 -0
- agent_os_kernel-3.1.0.dist-info/licenses/LICENSE +21 -0
- agent_os_observability/__init__.py +27 -0
- agent_os_observability/dashboards.py +898 -0
- agent_os_observability/metrics.py +398 -0
- agent_os_observability/server.py +223 -0
- agent_os_observability/tracer.py +232 -0
- agent_primitives/__init__.py +24 -0
- agent_primitives/failures.py +84 -0
- agent_primitives/py.typed +0 -0
- amb_core/__init__.py +177 -0
- amb_core/adapters/__init__.py +57 -0
- amb_core/adapters/aws_sqs_broker.py +376 -0
- amb_core/adapters/azure_servicebus_broker.py +340 -0
- amb_core/adapters/kafka_broker.py +260 -0
- amb_core/adapters/nats_broker.py +285 -0
- amb_core/adapters/rabbitmq_broker.py +235 -0
- amb_core/adapters/redis_broker.py +262 -0
- amb_core/broker.py +145 -0
- amb_core/bus.py +481 -0
- amb_core/cloudevents.py +509 -0
- amb_core/dlq.py +345 -0
- amb_core/hf_utils.py +536 -0
- amb_core/memory_broker.py +410 -0
- amb_core/models.py +141 -0
- amb_core/persistence.py +529 -0
- amb_core/schema.py +294 -0
- amb_core/tracing.py +358 -0
- atr/__init__.py +640 -0
- atr/access.py +348 -0
- atr/composition.py +645 -0
- atr/decorator.py +357 -0
- atr/executor.py +384 -0
- atr/health.py +557 -0
- atr/hf_utils.py +449 -0
- atr/injection.py +422 -0
- atr/metrics.py +440 -0
- atr/policies.py +403 -0
- atr/py.typed +2 -0
- atr/registry.py +452 -0
- atr/schema.py +480 -0
- atr/tools/safe/__init__.py +75 -0
- atr/tools/safe/calculator.py +467 -0
- atr/tools/safe/datetime_tool.py +443 -0
- atr/tools/safe/file_reader.py +402 -0
- atr/tools/safe/http_client.py +316 -0
- atr/tools/safe/json_parser.py +374 -0
- atr/tools/safe/text_tool.py +537 -0
- atr/tools/safe/toolkit.py +175 -0
- caas/__init__.py +162 -0
- caas/api/__init__.py +7 -0
- caas/api/server.py +1328 -0
- caas/caching.py +834 -0
- caas/cli.py +210 -0
- caas/conversation.py +223 -0
- caas/decay.py +72 -0
- caas/detection/__init__.py +9 -0
- caas/detection/detector.py +238 -0
- caas/enrichment.py +130 -0
- caas/gateway/__init__.py +27 -0
- caas/gateway/trust_gateway.py +474 -0
- caas/hf_utils.py +479 -0
- caas/ingestion/__init__.py +23 -0
- caas/ingestion/processors.py +253 -0
- caas/ingestion/structure_parser.py +188 -0
- caas/models.py +356 -0
- caas/pragmatic_truth.py +444 -0
- caas/routing/__init__.py +10 -0
- caas/routing/heuristic_router.py +58 -0
- caas/storage/__init__.py +9 -0
- caas/storage/store.py +389 -0
- caas/triad.py +213 -0
- caas/tuning/__init__.py +9 -0
- caas/tuning/tuner.py +329 -0
- caas/vfs/__init__.py +14 -0
- caas/vfs/filesystem.py +452 -0
- cmvk/__init__.py +218 -0
- cmvk/audit.py +402 -0
- cmvk/benchmarks.py +478 -0
- cmvk/constitutional.py +904 -0
- cmvk/hf_utils.py +301 -0
- cmvk/metrics.py +473 -0
- cmvk/profiles.py +300 -0
- cmvk/py.typed +0 -0
- cmvk/types.py +12 -0
- cmvk/verification.py +956 -0
- emk/__init__.py +89 -0
- emk/causal.py +352 -0
- emk/hf_utils.py +421 -0
- emk/indexer.py +83 -0
- emk/py.typed +0 -0
- emk/schema.py +204 -0
- emk/sleep_cycle.py +347 -0
- emk/store.py +281 -0
- iatp/__init__.py +166 -0
- iatp/attestation.py +461 -0
- iatp/cli.py +317 -0
- iatp/hf_utils.py +472 -0
- iatp/ipc_pipes.py +580 -0
- iatp/main.py +412 -0
- iatp/models/__init__.py +447 -0
- iatp/policy_engine.py +337 -0
- iatp/py.typed +2 -0
- iatp/recovery.py +321 -0
- iatp/security/__init__.py +270 -0
- iatp/sidecar/__init__.py +519 -0
- iatp/telemetry/__init__.py +164 -0
- iatp/tests/__init__.py +1 -0
- iatp/tests/test_attestation.py +370 -0
- iatp/tests/test_cli.py +131 -0
- iatp/tests/test_ed25519_attestation.py +211 -0
- iatp/tests/test_models.py +130 -0
- iatp/tests/test_policy_engine.py +347 -0
- iatp/tests/test_recovery.py +281 -0
- iatp/tests/test_security.py +222 -0
- iatp/tests/test_sidecar.py +167 -0
- iatp/tests/test_telemetry.py +175 -0
- mcp_kernel_server/__init__.py +28 -0
- mcp_kernel_server/cli.py +274 -0
- mcp_kernel_server/resources.py +217 -0
- mcp_kernel_server/server.py +564 -0
- mcp_kernel_server/tools.py +1174 -0
- mute_agent/__init__.py +68 -0
- mute_agent/core/__init__.py +1 -0
- mute_agent/core/execution_agent.py +166 -0
- mute_agent/core/handshake_protocol.py +201 -0
- mute_agent/core/reasoning_agent.py +238 -0
- mute_agent/knowledge_graph/__init__.py +1 -0
- mute_agent/knowledge_graph/graph_elements.py +65 -0
- mute_agent/knowledge_graph/multidimensional_graph.py +170 -0
- mute_agent/knowledge_graph/subgraph.py +224 -0
- mute_agent/listener/__init__.py +43 -0
- mute_agent/listener/adapters/__init__.py +31 -0
- mute_agent/listener/adapters/base_adapter.py +189 -0
- mute_agent/listener/adapters/caas_adapter.py +344 -0
- mute_agent/listener/adapters/control_plane_adapter.py +436 -0
- mute_agent/listener/adapters/iatp_adapter.py +332 -0
- mute_agent/listener/adapters/scak_adapter.py +251 -0
- mute_agent/listener/listener.py +610 -0
- mute_agent/listener/state_observer.py +436 -0
- mute_agent/listener/threshold_config.py +313 -0
- mute_agent/super_system/__init__.py +1 -0
- mute_agent/super_system/router.py +204 -0
- mute_agent/visualization/__init__.py +10 -0
- mute_agent/visualization/graph_debugger.py +502 -0
- nexus/README.md +60 -0
- nexus/__init__.py +51 -0
- nexus/arbiter.py +359 -0
- nexus/client.py +466 -0
- nexus/dmz.py +444 -0
- nexus/escrow.py +430 -0
- nexus/exceptions.py +286 -0
- nexus/pyproject.toml +36 -0
- nexus/registry.py +393 -0
- nexus/reputation.py +425 -0
- nexus/schemas/__init__.py +51 -0
- nexus/schemas/compliance.py +276 -0
- nexus/schemas/escrow.py +251 -0
- nexus/schemas/manifest.py +225 -0
- nexus/schemas/receipt.py +208 -0
- nexus/tests/__init__.py +0 -0
- nexus/tests/conftest.py +146 -0
- nexus/tests/test_arbiter.py +192 -0
- nexus/tests/test_dmz.py +194 -0
- nexus/tests/test_escrow.py +276 -0
- nexus/tests/test_exceptions.py +225 -0
- nexus/tests/test_registry.py +232 -0
- nexus/tests/test_reputation.py +328 -0
- nexus/tests/test_schemas.py +295 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Example Executors for Agent Control Plane
|
|
5
|
+
|
|
6
|
+
These are example/demonstration executors showing how to implement
|
|
7
|
+
action handlers. In production, these would be replaced with actual
|
|
8
|
+
implementations that interface with real systems.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from typing import Dict, Any
|
|
12
|
+
from .execution_engine import ExecutionContext
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def file_read_executor(parameters: Dict[str, Any], context: ExecutionContext) -> Any:
|
|
16
|
+
"""
|
|
17
|
+
Example executor for file read operations
|
|
18
|
+
|
|
19
|
+
In production, this would:
|
|
20
|
+
- Actually read files from the filesystem
|
|
21
|
+
- Apply additional security checks
|
|
22
|
+
- Handle errors appropriately
|
|
23
|
+
"""
|
|
24
|
+
path = parameters.get('path')
|
|
25
|
+
if not path:
|
|
26
|
+
raise ValueError("Missing 'path' parameter")
|
|
27
|
+
|
|
28
|
+
# This is a simulation - real implementation would read actual files
|
|
29
|
+
return {
|
|
30
|
+
"action": "file_read",
|
|
31
|
+
"path": path,
|
|
32
|
+
"content": f"[Simulated content of {path}]",
|
|
33
|
+
"sandbox_level": context.sandbox_level.value,
|
|
34
|
+
"note": "This is a simulated response. Replace with actual file reading in production."
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def file_write_executor(parameters: Dict[str, Any], context: ExecutionContext) -> Any:
|
|
39
|
+
"""
|
|
40
|
+
Example executor for file write operations
|
|
41
|
+
|
|
42
|
+
In production, this would:
|
|
43
|
+
- Actually write files to the filesystem
|
|
44
|
+
- Verify write permissions
|
|
45
|
+
- Handle atomic writes
|
|
46
|
+
"""
|
|
47
|
+
path = parameters.get('path')
|
|
48
|
+
content = parameters.get('content')
|
|
49
|
+
|
|
50
|
+
if not path:
|
|
51
|
+
raise ValueError("Missing 'path' parameter")
|
|
52
|
+
if not content:
|
|
53
|
+
raise ValueError("Missing 'content' parameter")
|
|
54
|
+
|
|
55
|
+
# This is a simulation - real implementation would write actual files
|
|
56
|
+
return {
|
|
57
|
+
"action": "file_write",
|
|
58
|
+
"path": path,
|
|
59
|
+
"bytes_written": len(str(content)),
|
|
60
|
+
"sandbox_level": context.sandbox_level.value,
|
|
61
|
+
"note": "This is a simulated response. Replace with actual file writing in production."
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def code_execution_executor(parameters: Dict[str, Any], context: ExecutionContext) -> Any:
|
|
66
|
+
"""
|
|
67
|
+
Example executor for code execution
|
|
68
|
+
|
|
69
|
+
In production, this would:
|
|
70
|
+
- Execute code in an isolated container
|
|
71
|
+
- Capture stdout/stderr
|
|
72
|
+
- Enforce resource limits
|
|
73
|
+
- Handle timeouts
|
|
74
|
+
"""
|
|
75
|
+
code = parameters.get('code')
|
|
76
|
+
language = parameters.get('language', 'python')
|
|
77
|
+
|
|
78
|
+
if not code:
|
|
79
|
+
raise ValueError("Missing 'code' parameter")
|
|
80
|
+
|
|
81
|
+
# This is a simulation - real implementation would execute in container
|
|
82
|
+
return {
|
|
83
|
+
"action": "code_execution",
|
|
84
|
+
"language": language,
|
|
85
|
+
"output": "[Simulated execution output]",
|
|
86
|
+
"exit_code": 0,
|
|
87
|
+
"sandbox_level": context.sandbox_level.value,
|
|
88
|
+
"note": "This is a simulated response. Replace with actual code execution in production."
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def api_call_executor(parameters: Dict[str, Any], context: ExecutionContext) -> Any:
|
|
93
|
+
"""
|
|
94
|
+
Example executor for API calls
|
|
95
|
+
|
|
96
|
+
In production, this would:
|
|
97
|
+
- Make actual HTTP requests
|
|
98
|
+
- Apply rate limiting
|
|
99
|
+
- Handle retries
|
|
100
|
+
- Validate SSL certificates
|
|
101
|
+
"""
|
|
102
|
+
url = parameters.get('url')
|
|
103
|
+
method = parameters.get('method', 'GET')
|
|
104
|
+
|
|
105
|
+
if not url:
|
|
106
|
+
raise ValueError("Missing 'url' parameter")
|
|
107
|
+
|
|
108
|
+
if not context.allowed_network:
|
|
109
|
+
raise PermissionError("Network access not allowed in this context")
|
|
110
|
+
|
|
111
|
+
# This is a simulation - real implementation would make actual HTTP requests
|
|
112
|
+
return {
|
|
113
|
+
"action": "api_call",
|
|
114
|
+
"url": url,
|
|
115
|
+
"method": method,
|
|
116
|
+
"status_code": 200,
|
|
117
|
+
"response": "[Simulated API response]",
|
|
118
|
+
"note": "This is a simulated response. Replace with actual HTTP requests in production."
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
def database_query_executor(parameters: Dict[str, Any], context: ExecutionContext) -> Any:
|
|
123
|
+
"""
|
|
124
|
+
Example executor for database queries
|
|
125
|
+
|
|
126
|
+
In production, this would:
|
|
127
|
+
- Execute actual SQL queries
|
|
128
|
+
- Use connection pooling
|
|
129
|
+
- Apply query timeouts
|
|
130
|
+
- Sanitize inputs
|
|
131
|
+
"""
|
|
132
|
+
query = parameters.get('query')
|
|
133
|
+
database = parameters.get('database', 'default')
|
|
134
|
+
|
|
135
|
+
if not query:
|
|
136
|
+
raise ValueError("Missing 'query' parameter")
|
|
137
|
+
|
|
138
|
+
# This is a simulation - real implementation would execute actual queries
|
|
139
|
+
return {
|
|
140
|
+
"action": "database_query",
|
|
141
|
+
"database": database,
|
|
142
|
+
"rows": "[Simulated query results]",
|
|
143
|
+
"row_count": 0,
|
|
144
|
+
"note": "This is a simulated response. Replace with actual database queries in production."
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def database_write_executor(parameters: Dict[str, Any], context: ExecutionContext) -> Any:
|
|
149
|
+
"""
|
|
150
|
+
Example executor for database writes
|
|
151
|
+
|
|
152
|
+
In production, this would:
|
|
153
|
+
- Execute actual write operations
|
|
154
|
+
- Use transactions
|
|
155
|
+
- Handle rollbacks
|
|
156
|
+
- Validate data integrity
|
|
157
|
+
"""
|
|
158
|
+
query = parameters.get('query')
|
|
159
|
+
database = parameters.get('database', 'default')
|
|
160
|
+
|
|
161
|
+
if not query:
|
|
162
|
+
raise ValueError("Missing 'query' parameter")
|
|
163
|
+
|
|
164
|
+
# This is a simulation - real implementation would execute actual writes
|
|
165
|
+
return {
|
|
166
|
+
"action": "database_write",
|
|
167
|
+
"database": database,
|
|
168
|
+
"rows_affected": 0,
|
|
169
|
+
"note": "This is a simulated response. Replace with actual database writes in production."
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def workflow_trigger_executor(parameters: Dict[str, Any], context: ExecutionContext) -> Any:
|
|
174
|
+
"""
|
|
175
|
+
Example executor for workflow triggers
|
|
176
|
+
|
|
177
|
+
In production, this would:
|
|
178
|
+
- Trigger actual workflows
|
|
179
|
+
- Track workflow execution
|
|
180
|
+
- Handle callbacks
|
|
181
|
+
"""
|
|
182
|
+
workflow_id = parameters.get('workflow_id')
|
|
183
|
+
workflow_params = parameters.get('params', {})
|
|
184
|
+
|
|
185
|
+
if not workflow_id:
|
|
186
|
+
raise ValueError("Missing 'workflow_id' parameter")
|
|
187
|
+
|
|
188
|
+
# This is a simulation - real implementation would trigger actual workflows
|
|
189
|
+
return {
|
|
190
|
+
"action": "workflow_trigger",
|
|
191
|
+
"workflow_id": workflow_id,
|
|
192
|
+
"execution_id": "[Simulated execution ID]",
|
|
193
|
+
"status": "started",
|
|
194
|
+
"note": "This is a simulated response. Replace with actual workflow triggers in production."
|
|
195
|
+
}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Copyright (c) Microsoft Corporation.
|
|
2
|
+
# Licensed under the MIT License.
|
|
3
|
+
"""
|
|
4
|
+
Execution Engine - Safe execution of agent actions
|
|
5
|
+
|
|
6
|
+
Provides sandboxed execution, resource monitoring, and error handling
|
|
7
|
+
for agent actions.
|
|
8
|
+
|
|
9
|
+
Research Foundations:
|
|
10
|
+
- Sandbox isolation levels informed by container security best practices
|
|
11
|
+
- Timeout and resource limits from "Fault-Tolerant Multi-Agent Systems"
|
|
12
|
+
(IEEE Trans. SMC, 2024) - failure recovery patterns
|
|
13
|
+
- Transaction rollback patterns from distributed systems research
|
|
14
|
+
- Circuit breaker and retry policies for resilience
|
|
15
|
+
|
|
16
|
+
See docs/RESEARCH_FOUNDATION.md for complete references.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from typing import Any, Dict, Optional, Callable, List
|
|
20
|
+
from dataclasses import dataclass, field
|
|
21
|
+
from datetime import datetime
|
|
22
|
+
from enum import Enum
|
|
23
|
+
import time
|
|
24
|
+
from .agent_kernel import ExecutionRequest, ActionType
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class SandboxLevel(Enum):
|
|
28
|
+
"""Sandbox isolation levels"""
|
|
29
|
+
NONE = 0
|
|
30
|
+
BASIC = 1
|
|
31
|
+
STRICT = 2
|
|
32
|
+
ISOLATED = 3
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass
|
|
36
|
+
class ExecutionContext:
|
|
37
|
+
"""Context for executing an agent action"""
|
|
38
|
+
request_id: str
|
|
39
|
+
sandbox_level: SandboxLevel
|
|
40
|
+
timeout_seconds: float = 30.0
|
|
41
|
+
max_memory_mb: int = 512
|
|
42
|
+
allowed_network: bool = False
|
|
43
|
+
environment_vars: Dict[str, str] = field(default_factory=dict)
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
@dataclass
|
|
47
|
+
class ExecutionMetrics:
|
|
48
|
+
"""Metrics collected during execution"""
|
|
49
|
+
start_time: datetime
|
|
50
|
+
end_time: Optional[datetime] = None
|
|
51
|
+
cpu_time_ms: float = 0.0
|
|
52
|
+
memory_used_mb: float = 0.0
|
|
53
|
+
network_calls: int = 0
|
|
54
|
+
files_accessed: List[str] = field(default_factory=list)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class ExecutionEngine:
|
|
58
|
+
"""
|
|
59
|
+
Execution Engine - Safely executes agent actions
|
|
60
|
+
|
|
61
|
+
Provides:
|
|
62
|
+
- Sandboxed execution
|
|
63
|
+
- Resource monitoring
|
|
64
|
+
- Timeout enforcement
|
|
65
|
+
- Error handling and recovery
|
|
66
|
+
- Transaction management
|
|
67
|
+
"""
|
|
68
|
+
|
|
69
|
+
def __init__(self):
|
|
70
|
+
self.executors: Dict[ActionType, Callable] = {}
|
|
71
|
+
self.active_executions: Dict[str, ExecutionContext] = {}
|
|
72
|
+
self.execution_history: List[Dict[str, Any]] = []
|
|
73
|
+
|
|
74
|
+
def register_executor(self, action_type: ActionType, executor: Callable):
|
|
75
|
+
"""Register an executor for a specific action type"""
|
|
76
|
+
self.executors[action_type] = executor
|
|
77
|
+
|
|
78
|
+
def execute(
|
|
79
|
+
self,
|
|
80
|
+
request: ExecutionRequest,
|
|
81
|
+
context: Optional[ExecutionContext] = None
|
|
82
|
+
) -> Dict[str, Any]:
|
|
83
|
+
"""Execute a request in a controlled environment"""
|
|
84
|
+
if context is None:
|
|
85
|
+
context = self._create_default_context(request)
|
|
86
|
+
|
|
87
|
+
self.active_executions[request.request_id] = context
|
|
88
|
+
metrics = ExecutionMetrics(start_time=datetime.now())
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
# Get the appropriate executor
|
|
92
|
+
executor = self.executors.get(request.action_type)
|
|
93
|
+
if not executor:
|
|
94
|
+
executor = self._default_executor
|
|
95
|
+
|
|
96
|
+
# Execute with timeout
|
|
97
|
+
result = self._execute_with_timeout(
|
|
98
|
+
executor,
|
|
99
|
+
request,
|
|
100
|
+
context,
|
|
101
|
+
metrics
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
metrics.end_time = datetime.now()
|
|
105
|
+
|
|
106
|
+
# Record execution
|
|
107
|
+
self._record_execution(request, context, metrics, result, None)
|
|
108
|
+
|
|
109
|
+
return {
|
|
110
|
+
"success": True,
|
|
111
|
+
"result": result,
|
|
112
|
+
"metrics": {
|
|
113
|
+
"execution_time_ms": (metrics.end_time - metrics.start_time).total_seconds() * 1000,
|
|
114
|
+
"cpu_time_ms": metrics.cpu_time_ms,
|
|
115
|
+
"memory_used_mb": metrics.memory_used_mb,
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
except TimeoutError as e:
|
|
120
|
+
metrics.end_time = datetime.now()
|
|
121
|
+
self._record_execution(request, context, metrics, None, f"Timeout: {str(e)}")
|
|
122
|
+
return {
|
|
123
|
+
"success": False,
|
|
124
|
+
"error": f"Execution timeout after {context.timeout_seconds}s",
|
|
125
|
+
"error_type": "timeout"
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
except Exception as e:
|
|
129
|
+
metrics.end_time = datetime.now()
|
|
130
|
+
self._record_execution(request, context, metrics, None, str(e))
|
|
131
|
+
return {
|
|
132
|
+
"success": False,
|
|
133
|
+
"error": str(e),
|
|
134
|
+
"error_type": type(e).__name__
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
finally:
|
|
138
|
+
if request.request_id in self.active_executions:
|
|
139
|
+
del self.active_executions[request.request_id]
|
|
140
|
+
|
|
141
|
+
def _execute_with_timeout(
|
|
142
|
+
self,
|
|
143
|
+
executor: Callable,
|
|
144
|
+
request: ExecutionRequest,
|
|
145
|
+
context: ExecutionContext,
|
|
146
|
+
metrics: ExecutionMetrics
|
|
147
|
+
) -> Any:
|
|
148
|
+
"""Execute with timeout enforcement"""
|
|
149
|
+
start_time = time.time()
|
|
150
|
+
|
|
151
|
+
# In a real implementation, this would use proper process isolation
|
|
152
|
+
# and actual timeout mechanisms (e.g., threading with timeouts, subprocesses)
|
|
153
|
+
result = executor(request.parameters, context)
|
|
154
|
+
|
|
155
|
+
elapsed = time.time() - start_time
|
|
156
|
+
if elapsed > context.timeout_seconds:
|
|
157
|
+
raise TimeoutError(f"Execution exceeded {context.timeout_seconds}s")
|
|
158
|
+
|
|
159
|
+
metrics.cpu_time_ms = elapsed * 1000
|
|
160
|
+
return result
|
|
161
|
+
|
|
162
|
+
def _default_executor(self, parameters: Dict[str, Any], context: ExecutionContext) -> Any:
|
|
163
|
+
"""Default executor for unregistered action types"""
|
|
164
|
+
return {
|
|
165
|
+
"status": "executed",
|
|
166
|
+
"parameters": parameters,
|
|
167
|
+
"note": "Using default executor (no specific executor registered)"
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
def _create_default_context(self, request: ExecutionRequest) -> ExecutionContext:
|
|
171
|
+
"""Create default execution context based on action type"""
|
|
172
|
+
# More sensitive actions get stricter sandboxing
|
|
173
|
+
sandbox_map = {
|
|
174
|
+
ActionType.FILE_READ: SandboxLevel.BASIC,
|
|
175
|
+
ActionType.FILE_WRITE: SandboxLevel.STRICT,
|
|
176
|
+
ActionType.CODE_EXECUTION: SandboxLevel.ISOLATED,
|
|
177
|
+
ActionType.DATABASE_QUERY: SandboxLevel.BASIC,
|
|
178
|
+
ActionType.DATABASE_WRITE: SandboxLevel.STRICT,
|
|
179
|
+
ActionType.API_CALL: SandboxLevel.BASIC,
|
|
180
|
+
ActionType.WORKFLOW_TRIGGER: SandboxLevel.BASIC,
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
return ExecutionContext(
|
|
184
|
+
request_id=request.request_id,
|
|
185
|
+
sandbox_level=sandbox_map.get(request.action_type, SandboxLevel.STRICT),
|
|
186
|
+
timeout_seconds=30.0,
|
|
187
|
+
max_memory_mb=512,
|
|
188
|
+
allowed_network=request.action_type in [ActionType.API_CALL],
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
def _record_execution(
|
|
192
|
+
self,
|
|
193
|
+
request: ExecutionRequest,
|
|
194
|
+
context: ExecutionContext,
|
|
195
|
+
metrics: ExecutionMetrics,
|
|
196
|
+
result: Optional[Any],
|
|
197
|
+
error: Optional[str]
|
|
198
|
+
):
|
|
199
|
+
"""Record execution for history and analytics"""
|
|
200
|
+
record = {
|
|
201
|
+
"request_id": request.request_id,
|
|
202
|
+
"agent_id": request.agent_context.agent_id,
|
|
203
|
+
"action_type": request.action_type.value,
|
|
204
|
+
"timestamp": request.timestamp.isoformat(),
|
|
205
|
+
"execution_time_ms": (
|
|
206
|
+
(metrics.end_time - metrics.start_time).total_seconds() * 1000
|
|
207
|
+
if metrics.end_time else 0
|
|
208
|
+
),
|
|
209
|
+
"success": error is None,
|
|
210
|
+
"error": error,
|
|
211
|
+
"sandbox_level": context.sandbox_level.value,
|
|
212
|
+
}
|
|
213
|
+
self.execution_history.append(record)
|
|
214
|
+
|
|
215
|
+
def get_execution_history(
|
|
216
|
+
self,
|
|
217
|
+
agent_id: Optional[str] = None,
|
|
218
|
+
limit: int = 100
|
|
219
|
+
) -> List[Dict[str, Any]]:
|
|
220
|
+
"""Get execution history, optionally filtered by agent"""
|
|
221
|
+
history = self.execution_history
|
|
222
|
+
|
|
223
|
+
if agent_id:
|
|
224
|
+
history = [r for r in history if r["agent_id"] == agent_id]
|
|
225
|
+
|
|
226
|
+
return history[-limit:]
|
|
227
|
+
|
|
228
|
+
def get_active_executions(self) -> Dict[str, ExecutionContext]:
|
|
229
|
+
"""Get currently active executions"""
|
|
230
|
+
return self.active_executions.copy()
|
|
231
|
+
|