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.
Files changed (337) hide show
  1. agent_control_plane/__init__.py +662 -0
  2. agent_control_plane/a2a_adapter.py +543 -0
  3. agent_control_plane/adapter.py +417 -0
  4. agent_control_plane/agent_hibernation.py +394 -0
  5. agent_control_plane/agent_kernel.py +470 -0
  6. agent_control_plane/compliance.py +720 -0
  7. agent_control_plane/constraint_graphs.py +478 -0
  8. agent_control_plane/control_plane.py +854 -0
  9. agent_control_plane/example_executors.py +195 -0
  10. agent_control_plane/execution_engine.py +231 -0
  11. agent_control_plane/flight_recorder.py +846 -0
  12. agent_control_plane/governance_layer.py +435 -0
  13. agent_control_plane/hf_utils.py +563 -0
  14. agent_control_plane/interfaces/__init__.py +55 -0
  15. agent_control_plane/interfaces/kernel_interface.py +361 -0
  16. agent_control_plane/interfaces/plugin_interface.py +497 -0
  17. agent_control_plane/interfaces/protocol_interfaces.py +387 -0
  18. agent_control_plane/kernel_space.py +1009 -0
  19. agent_control_plane/langchain_adapter.py +424 -0
  20. agent_control_plane/lifecycle.py +3113 -0
  21. agent_control_plane/mcp_adapter.py +653 -0
  22. agent_control_plane/ml_safety.py +563 -0
  23. agent_control_plane/multimodal.py +727 -0
  24. agent_control_plane/mute_agent.py +422 -0
  25. agent_control_plane/observability.py +787 -0
  26. agent_control_plane/orchestrator.py +482 -0
  27. agent_control_plane/plugin_registry.py +750 -0
  28. agent_control_plane/policy_engine.py +954 -0
  29. agent_control_plane/process_isolation.py +777 -0
  30. agent_control_plane/shadow_mode.py +310 -0
  31. agent_control_plane/signals.py +493 -0
  32. agent_control_plane/supervisor_agents.py +430 -0
  33. agent_control_plane/time_travel_debugger.py +557 -0
  34. agent_control_plane/tool_registry.py +452 -0
  35. agent_control_plane/vfs.py +697 -0
  36. agent_kernel/__init__.py +69 -0
  37. agent_kernel/analyzer.py +435 -0
  38. agent_kernel/auditor.py +36 -0
  39. agent_kernel/completeness_auditor.py +237 -0
  40. agent_kernel/detector.py +203 -0
  41. agent_kernel/kernel.py +744 -0
  42. agent_kernel/memory_manager.py +85 -0
  43. agent_kernel/models.py +374 -0
  44. agent_kernel/nudge_mechanism.py +263 -0
  45. agent_kernel/outcome_analyzer.py +338 -0
  46. agent_kernel/patcher.py +582 -0
  47. agent_kernel/semantic_analyzer.py +316 -0
  48. agent_kernel/semantic_purge.py +349 -0
  49. agent_kernel/simulator.py +449 -0
  50. agent_kernel/teacher.py +85 -0
  51. agent_kernel/triage.py +152 -0
  52. agent_os/__init__.py +409 -0
  53. agent_os/_adversarial_impl.py +200 -0
  54. agent_os/_circuit_breaker_impl.py +232 -0
  55. agent_os/_mcp_metrics.py +193 -0
  56. agent_os/adversarial.py +20 -0
  57. agent_os/agents_compat.py +490 -0
  58. agent_os/audit_logger.py +135 -0
  59. agent_os/base_agent.py +651 -0
  60. agent_os/circuit_breaker.py +34 -0
  61. agent_os/cli/__init__.py +659 -0
  62. agent_os/cli/cmd_audit.py +128 -0
  63. agent_os/cli/cmd_init.py +152 -0
  64. agent_os/cli/cmd_policy.py +41 -0
  65. agent_os/cli/cmd_policy_gen.py +180 -0
  66. agent_os/cli/cmd_validate.py +258 -0
  67. agent_os/cli/mcp_scan.py +265 -0
  68. agent_os/cli/output.py +192 -0
  69. agent_os/cli/policy_checker.py +330 -0
  70. agent_os/compat.py +74 -0
  71. agent_os/constraint_graph.py +234 -0
  72. agent_os/content_governance.py +140 -0
  73. agent_os/context_budget.py +305 -0
  74. agent_os/credential_redactor.py +224 -0
  75. agent_os/diff_policy.py +89 -0
  76. agent_os/egress_policy.py +159 -0
  77. agent_os/escalation.py +276 -0
  78. agent_os/event_bus.py +124 -0
  79. agent_os/exceptions.py +180 -0
  80. agent_os/execution_context_policy.py +141 -0
  81. agent_os/github_enterprise.py +96 -0
  82. agent_os/health.py +20 -0
  83. agent_os/integrations/__init__.py +279 -0
  84. agent_os/integrations/a2a_adapter.py +279 -0
  85. agent_os/integrations/agent_lightning/__init__.py +30 -0
  86. agent_os/integrations/anthropic_adapter.py +420 -0
  87. agent_os/integrations/autogen_adapter.py +620 -0
  88. agent_os/integrations/base.py +1137 -0
  89. agent_os/integrations/compat.py +229 -0
  90. agent_os/integrations/config.py +98 -0
  91. agent_os/integrations/conversation_guardian.py +957 -0
  92. agent_os/integrations/crewai_adapter.py +467 -0
  93. agent_os/integrations/drift_detector.py +425 -0
  94. agent_os/integrations/dry_run.py +124 -0
  95. agent_os/integrations/escalation.py +582 -0
  96. agent_os/integrations/gemini_adapter.py +364 -0
  97. agent_os/integrations/google_adk_adapter.py +633 -0
  98. agent_os/integrations/guardrails_adapter.py +394 -0
  99. agent_os/integrations/health.py +197 -0
  100. agent_os/integrations/langchain_adapter.py +654 -0
  101. agent_os/integrations/llamafirewall.py +343 -0
  102. agent_os/integrations/llamaindex_adapter.py +188 -0
  103. agent_os/integrations/logging.py +191 -0
  104. agent_os/integrations/maf_adapter.py +631 -0
  105. agent_os/integrations/mistral_adapter.py +365 -0
  106. agent_os/integrations/openai_adapter.py +816 -0
  107. agent_os/integrations/openai_agents_sdk.py +406 -0
  108. agent_os/integrations/policy_compose.py +171 -0
  109. agent_os/integrations/profiling.py +144 -0
  110. agent_os/integrations/pydantic_ai_adapter.py +420 -0
  111. agent_os/integrations/rate_limiter.py +130 -0
  112. agent_os/integrations/rbac.py +143 -0
  113. agent_os/integrations/registry.py +113 -0
  114. agent_os/integrations/scope_guard.py +303 -0
  115. agent_os/integrations/semantic_kernel_adapter.py +769 -0
  116. agent_os/integrations/smolagents_adapter.py +629 -0
  117. agent_os/integrations/templates.py +178 -0
  118. agent_os/integrations/token_budget.py +134 -0
  119. agent_os/integrations/tool_aliases.py +190 -0
  120. agent_os/integrations/webhooks.py +177 -0
  121. agent_os/lite.py +208 -0
  122. agent_os/mcp_gateway.py +385 -0
  123. agent_os/mcp_message_signer.py +273 -0
  124. agent_os/mcp_protocols.py +161 -0
  125. agent_os/mcp_response_scanner.py +232 -0
  126. agent_os/mcp_security.py +924 -0
  127. agent_os/mcp_session_auth.py +231 -0
  128. agent_os/mcp_sliding_rate_limiter.py +184 -0
  129. agent_os/memory_guard.py +409 -0
  130. agent_os/metrics.py +134 -0
  131. agent_os/mute.py +428 -0
  132. agent_os/mute_agent.py +209 -0
  133. agent_os/policies/__init__.py +77 -0
  134. agent_os/policies/async_evaluator.py +275 -0
  135. agent_os/policies/backends.py +670 -0
  136. agent_os/policies/bridge.py +169 -0
  137. agent_os/policies/budget.py +85 -0
  138. agent_os/policies/cli.py +294 -0
  139. agent_os/policies/conflict_resolution.py +270 -0
  140. agent_os/policies/data_classification.py +252 -0
  141. agent_os/policies/evaluator.py +239 -0
  142. agent_os/policies/policy_schema.json +228 -0
  143. agent_os/policies/rate_limiting.py +145 -0
  144. agent_os/policies/schema.py +115 -0
  145. agent_os/policies/shared.py +331 -0
  146. agent_os/prompt_injection.py +694 -0
  147. agent_os/providers.py +182 -0
  148. agent_os/py.typed +0 -0
  149. agent_os/retry.py +81 -0
  150. agent_os/reversibility.py +251 -0
  151. agent_os/sandbox.py +432 -0
  152. agent_os/sandbox_provider.py +140 -0
  153. agent_os/secure_codegen.py +525 -0
  154. agent_os/security_skills.py +538 -0
  155. agent_os/semantic_policy.py +422 -0
  156. agent_os/server/__init__.py +15 -0
  157. agent_os/server/__main__.py +25 -0
  158. agent_os/server/app.py +277 -0
  159. agent_os/server/models.py +104 -0
  160. agent_os/shift_left_metrics.py +130 -0
  161. agent_os/stateless.py +742 -0
  162. agent_os/supervisor.py +148 -0
  163. agent_os/task_outcome.py +148 -0
  164. agent_os/transparency.py +181 -0
  165. agent_os/trust_root.py +128 -0
  166. agent_os_kernel-3.1.0.dist-info/METADATA +1269 -0
  167. agent_os_kernel-3.1.0.dist-info/RECORD +337 -0
  168. agent_os_kernel-3.1.0.dist-info/WHEEL +4 -0
  169. agent_os_kernel-3.1.0.dist-info/entry_points.txt +2 -0
  170. agent_os_kernel-3.1.0.dist-info/licenses/LICENSE +21 -0
  171. agent_os_observability/__init__.py +27 -0
  172. agent_os_observability/dashboards.py +898 -0
  173. agent_os_observability/metrics.py +398 -0
  174. agent_os_observability/server.py +223 -0
  175. agent_os_observability/tracer.py +232 -0
  176. agent_primitives/__init__.py +24 -0
  177. agent_primitives/failures.py +84 -0
  178. agent_primitives/py.typed +0 -0
  179. amb_core/__init__.py +177 -0
  180. amb_core/adapters/__init__.py +57 -0
  181. amb_core/adapters/aws_sqs_broker.py +376 -0
  182. amb_core/adapters/azure_servicebus_broker.py +340 -0
  183. amb_core/adapters/kafka_broker.py +260 -0
  184. amb_core/adapters/nats_broker.py +285 -0
  185. amb_core/adapters/rabbitmq_broker.py +235 -0
  186. amb_core/adapters/redis_broker.py +262 -0
  187. amb_core/broker.py +145 -0
  188. amb_core/bus.py +481 -0
  189. amb_core/cloudevents.py +509 -0
  190. amb_core/dlq.py +345 -0
  191. amb_core/hf_utils.py +536 -0
  192. amb_core/memory_broker.py +410 -0
  193. amb_core/models.py +141 -0
  194. amb_core/persistence.py +529 -0
  195. amb_core/schema.py +294 -0
  196. amb_core/tracing.py +358 -0
  197. atr/__init__.py +640 -0
  198. atr/access.py +348 -0
  199. atr/composition.py +645 -0
  200. atr/decorator.py +357 -0
  201. atr/executor.py +384 -0
  202. atr/health.py +557 -0
  203. atr/hf_utils.py +449 -0
  204. atr/injection.py +422 -0
  205. atr/metrics.py +440 -0
  206. atr/policies.py +403 -0
  207. atr/py.typed +2 -0
  208. atr/registry.py +452 -0
  209. atr/schema.py +480 -0
  210. atr/tools/safe/__init__.py +75 -0
  211. atr/tools/safe/calculator.py +467 -0
  212. atr/tools/safe/datetime_tool.py +443 -0
  213. atr/tools/safe/file_reader.py +402 -0
  214. atr/tools/safe/http_client.py +316 -0
  215. atr/tools/safe/json_parser.py +374 -0
  216. atr/tools/safe/text_tool.py +537 -0
  217. atr/tools/safe/toolkit.py +175 -0
  218. caas/__init__.py +162 -0
  219. caas/api/__init__.py +7 -0
  220. caas/api/server.py +1328 -0
  221. caas/caching.py +834 -0
  222. caas/cli.py +210 -0
  223. caas/conversation.py +223 -0
  224. caas/decay.py +72 -0
  225. caas/detection/__init__.py +9 -0
  226. caas/detection/detector.py +238 -0
  227. caas/enrichment.py +130 -0
  228. caas/gateway/__init__.py +27 -0
  229. caas/gateway/trust_gateway.py +474 -0
  230. caas/hf_utils.py +479 -0
  231. caas/ingestion/__init__.py +23 -0
  232. caas/ingestion/processors.py +253 -0
  233. caas/ingestion/structure_parser.py +188 -0
  234. caas/models.py +356 -0
  235. caas/pragmatic_truth.py +444 -0
  236. caas/routing/__init__.py +10 -0
  237. caas/routing/heuristic_router.py +58 -0
  238. caas/storage/__init__.py +9 -0
  239. caas/storage/store.py +389 -0
  240. caas/triad.py +213 -0
  241. caas/tuning/__init__.py +9 -0
  242. caas/tuning/tuner.py +329 -0
  243. caas/vfs/__init__.py +14 -0
  244. caas/vfs/filesystem.py +452 -0
  245. cmvk/__init__.py +218 -0
  246. cmvk/audit.py +402 -0
  247. cmvk/benchmarks.py +478 -0
  248. cmvk/constitutional.py +904 -0
  249. cmvk/hf_utils.py +301 -0
  250. cmvk/metrics.py +473 -0
  251. cmvk/profiles.py +300 -0
  252. cmvk/py.typed +0 -0
  253. cmvk/types.py +12 -0
  254. cmvk/verification.py +956 -0
  255. emk/__init__.py +89 -0
  256. emk/causal.py +352 -0
  257. emk/hf_utils.py +421 -0
  258. emk/indexer.py +83 -0
  259. emk/py.typed +0 -0
  260. emk/schema.py +204 -0
  261. emk/sleep_cycle.py +347 -0
  262. emk/store.py +281 -0
  263. iatp/__init__.py +166 -0
  264. iatp/attestation.py +461 -0
  265. iatp/cli.py +317 -0
  266. iatp/hf_utils.py +472 -0
  267. iatp/ipc_pipes.py +580 -0
  268. iatp/main.py +412 -0
  269. iatp/models/__init__.py +447 -0
  270. iatp/policy_engine.py +337 -0
  271. iatp/py.typed +2 -0
  272. iatp/recovery.py +321 -0
  273. iatp/security/__init__.py +270 -0
  274. iatp/sidecar/__init__.py +519 -0
  275. iatp/telemetry/__init__.py +164 -0
  276. iatp/tests/__init__.py +1 -0
  277. iatp/tests/test_attestation.py +370 -0
  278. iatp/tests/test_cli.py +131 -0
  279. iatp/tests/test_ed25519_attestation.py +211 -0
  280. iatp/tests/test_models.py +130 -0
  281. iatp/tests/test_policy_engine.py +347 -0
  282. iatp/tests/test_recovery.py +281 -0
  283. iatp/tests/test_security.py +222 -0
  284. iatp/tests/test_sidecar.py +167 -0
  285. iatp/tests/test_telemetry.py +175 -0
  286. mcp_kernel_server/__init__.py +28 -0
  287. mcp_kernel_server/cli.py +274 -0
  288. mcp_kernel_server/resources.py +217 -0
  289. mcp_kernel_server/server.py +564 -0
  290. mcp_kernel_server/tools.py +1174 -0
  291. mute_agent/__init__.py +68 -0
  292. mute_agent/core/__init__.py +1 -0
  293. mute_agent/core/execution_agent.py +166 -0
  294. mute_agent/core/handshake_protocol.py +201 -0
  295. mute_agent/core/reasoning_agent.py +238 -0
  296. mute_agent/knowledge_graph/__init__.py +1 -0
  297. mute_agent/knowledge_graph/graph_elements.py +65 -0
  298. mute_agent/knowledge_graph/multidimensional_graph.py +170 -0
  299. mute_agent/knowledge_graph/subgraph.py +224 -0
  300. mute_agent/listener/__init__.py +43 -0
  301. mute_agent/listener/adapters/__init__.py +31 -0
  302. mute_agent/listener/adapters/base_adapter.py +189 -0
  303. mute_agent/listener/adapters/caas_adapter.py +344 -0
  304. mute_agent/listener/adapters/control_plane_adapter.py +436 -0
  305. mute_agent/listener/adapters/iatp_adapter.py +332 -0
  306. mute_agent/listener/adapters/scak_adapter.py +251 -0
  307. mute_agent/listener/listener.py +610 -0
  308. mute_agent/listener/state_observer.py +436 -0
  309. mute_agent/listener/threshold_config.py +313 -0
  310. mute_agent/super_system/__init__.py +1 -0
  311. mute_agent/super_system/router.py +204 -0
  312. mute_agent/visualization/__init__.py +10 -0
  313. mute_agent/visualization/graph_debugger.py +502 -0
  314. nexus/README.md +60 -0
  315. nexus/__init__.py +51 -0
  316. nexus/arbiter.py +359 -0
  317. nexus/client.py +466 -0
  318. nexus/dmz.py +444 -0
  319. nexus/escrow.py +430 -0
  320. nexus/exceptions.py +286 -0
  321. nexus/pyproject.toml +36 -0
  322. nexus/registry.py +393 -0
  323. nexus/reputation.py +425 -0
  324. nexus/schemas/__init__.py +51 -0
  325. nexus/schemas/compliance.py +276 -0
  326. nexus/schemas/escrow.py +251 -0
  327. nexus/schemas/manifest.py +225 -0
  328. nexus/schemas/receipt.py +208 -0
  329. nexus/tests/__init__.py +0 -0
  330. nexus/tests/conftest.py +146 -0
  331. nexus/tests/test_arbiter.py +192 -0
  332. nexus/tests/test_dmz.py +194 -0
  333. nexus/tests/test_escrow.py +276 -0
  334. nexus/tests/test_exceptions.py +225 -0
  335. nexus/tests/test_registry.py +232 -0
  336. nexus/tests/test_reputation.py +328 -0
  337. 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
+