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,310 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+
4
+ """
5
+ Shadow Mode - Simulation and Validation
6
+
7
+ Shadow Mode provides a "Matrix-like" simulation where agents THINK they are
8
+ executing actions, but the Control Plane intercepts everything, logs the intent,
9
+ and validates outcomes against constraint graphs without actual execution.
10
+
11
+ This enables:
12
+ - Safe testing of agent behavior before production
13
+ - Validation of agent decisions against policies
14
+ - Analysis of agent reasoning without side effects
15
+ - Telemetry on reasoning chains
16
+
17
+ Research Foundations:
18
+ - Pre-deployment testing approach from "Practices for Governing Agentic AI Systems"
19
+ (OpenAI, 2023) - simulation before production deployment
20
+ - Risk-free validation patterns for testing agent behavior
21
+ - Statistical analysis of agent patterns for anomaly detection
22
+
23
+ See docs/RESEARCH_FOUNDATION.md for complete references.
24
+ """
25
+
26
+ from typing import Any, Dict, List, Optional, Tuple
27
+ from dataclasses import dataclass, field
28
+ from datetime import datetime
29
+ from enum import Enum
30
+ from .agent_kernel import ExecutionRequest, ActionType, ExecutionStatus
31
+
32
+
33
+ class SimulationOutcome(Enum):
34
+ """Possible outcomes of simulated execution"""
35
+ WOULD_SUCCEED = "would_succeed"
36
+ WOULD_FAIL = "would_fail"
37
+ POLICY_VIOLATION = "policy_violation"
38
+ RISK_TOO_HIGH = "risk_too_high"
39
+ PERMISSION_DENIED = "permission_denied"
40
+
41
+
42
+ @dataclass
43
+ class ReasoningStep:
44
+ """A step in the agent's reasoning chain"""
45
+ step_number: int
46
+ description: str
47
+ action_considered: ActionType
48
+ parameters: Dict[str, Any]
49
+ decision: str # Why this action was chosen
50
+ timestamp: datetime = field(default_factory=datetime.now)
51
+
52
+
53
+ @dataclass
54
+ class SimulationResult:
55
+ """Result of a shadow mode execution"""
56
+ request_id: str
57
+ agent_id: str
58
+ outcome: SimulationOutcome
59
+ simulated_result: Optional[Any] = None
60
+ actual_impact: Dict[str, Any] = field(default_factory=dict)
61
+ policy_checks: Dict[str, bool] = field(default_factory=dict)
62
+ risk_score: float = 0.0
63
+ reasoning_chain: List[ReasoningStep] = field(default_factory=list)
64
+ would_execute_at: Optional[datetime] = None
65
+ validation_notes: List[str] = field(default_factory=list)
66
+
67
+
68
+ @dataclass
69
+ class ShadowModeConfig:
70
+ """Configuration for shadow mode"""
71
+ enabled: bool = True
72
+ log_reasoning: bool = True # Capture reasoning chain
73
+ simulate_results: bool = True # Generate simulated results
74
+ validate_constraints: bool = True # Validate against constraint graphs
75
+ intercept_all: bool = True # Intercept all actions (true shadow mode)
76
+ allow_safe_actions: bool = False # Allow safe actions to execute
77
+
78
+
79
+ class ShadowModeExecutor:
80
+ """
81
+ Executes actions in shadow mode - simulating execution without side effects.
82
+
83
+ This is the "Matrix" for agents - they think they're executing, but
84
+ we're actually just logging their intent and validating decisions.
85
+ """
86
+
87
+ def __init__(self, config: ShadowModeConfig):
88
+ self.config = config
89
+ self.simulation_log: List[SimulationResult] = []
90
+ self.reasoning_traces: Dict[str, List[ReasoningStep]] = {}
91
+
92
+ def execute_in_shadow(
93
+ self,
94
+ request: ExecutionRequest,
95
+ reasoning_chain: Optional[List[ReasoningStep]] = None
96
+ ) -> SimulationResult:
97
+ """
98
+ Execute request in shadow mode.
99
+
100
+ The agent thinks it's executing, but we're just simulating and logging.
101
+ """
102
+ simulation = SimulationResult(
103
+ request_id=request.request_id,
104
+ agent_id=request.agent_context.agent_id,
105
+ outcome=SimulationOutcome.WOULD_SUCCEED,
106
+ risk_score=request.risk_score,
107
+ reasoning_chain=reasoning_chain or []
108
+ )
109
+
110
+ # Validate request would pass all checks
111
+ outcome, notes = self._validate_request(request)
112
+ simulation.outcome = outcome
113
+ simulation.validation_notes = notes
114
+
115
+ # Generate simulated result
116
+ if self.config.simulate_results:
117
+ simulation.simulated_result = self._simulate_execution(request)
118
+
119
+ # Calculate what the actual impact would be
120
+ simulation.actual_impact = self._analyze_impact(request)
121
+
122
+ # Log the simulation
123
+ self.simulation_log.append(simulation)
124
+
125
+ # Store reasoning trace
126
+ if reasoning_chain:
127
+ self.reasoning_traces[request.request_id] = reasoning_chain
128
+
129
+ return simulation
130
+
131
+ def _validate_request(self, request: ExecutionRequest) -> Tuple[SimulationOutcome, List[str]]:
132
+ """Validate if request would succeed in production"""
133
+ notes = []
134
+
135
+ # Check permission
136
+ if request.status == ExecutionStatus.DENIED:
137
+ notes.append("Request would be denied due to insufficient permissions")
138
+ return SimulationOutcome.PERMISSION_DENIED, notes
139
+
140
+ # Check risk
141
+ if request.risk_score > 0.8:
142
+ notes.append(f"Risk score {request.risk_score} exceeds threshold")
143
+ return SimulationOutcome.RISK_TOO_HIGH, notes
144
+
145
+ # Would succeed
146
+ notes.append("All validation checks would pass")
147
+ return SimulationOutcome.WOULD_SUCCEED, notes
148
+
149
+ def _simulate_execution(self, request: ExecutionRequest) -> Dict[str, Any]:
150
+ """Generate a simulated execution result"""
151
+ action_simulators = {
152
+ ActionType.FILE_READ: self._simulate_file_read,
153
+ ActionType.FILE_WRITE: self._simulate_file_write,
154
+ ActionType.DATABASE_QUERY: self._simulate_database_query,
155
+ ActionType.CODE_EXECUTION: self._simulate_code_execution,
156
+ ActionType.API_CALL: self._simulate_api_call,
157
+ }
158
+
159
+ simulator = action_simulators.get(
160
+ request.action_type,
161
+ lambda r: {"status": "simulated", "note": "Generic simulation"}
162
+ )
163
+
164
+ return simulator(request)
165
+
166
+ def _simulate_file_read(self, request: ExecutionRequest) -> Dict[str, Any]:
167
+ """Simulate file read operation"""
168
+ return {
169
+ "action": "file_read",
170
+ "path": request.parameters.get('path'),
171
+ "content": f"[SIMULATED CONTENT of {request.parameters.get('path')}]",
172
+ "size": 1024,
173
+ "note": "This is a shadow mode simulation - no actual file was read"
174
+ }
175
+
176
+ def _simulate_file_write(self, request: ExecutionRequest) -> Dict[str, Any]:
177
+ """Simulate file write operation"""
178
+ return {
179
+ "action": "file_write",
180
+ "path": request.parameters.get('path'),
181
+ "bytes_written": len(str(request.parameters.get('content', ''))),
182
+ "note": "This is a shadow mode simulation - no actual file was written"
183
+ }
184
+
185
+ def _simulate_database_query(self, request: ExecutionRequest) -> Dict[str, Any]:
186
+ """Simulate database query"""
187
+ return {
188
+ "action": "database_query",
189
+ "query": request.parameters.get('query'),
190
+ "rows": [
191
+ {"id": 1, "name": "[SIMULATED DATA]"},
192
+ {"id": 2, "name": "[SIMULATED DATA]"}
193
+ ],
194
+ "row_count": 2,
195
+ "note": "This is a shadow mode simulation - no actual query was executed"
196
+ }
197
+
198
+ def _simulate_code_execution(self, request: ExecutionRequest) -> Dict[str, Any]:
199
+ """Simulate code execution"""
200
+ return {
201
+ "action": "code_execution",
202
+ "language": request.parameters.get('language'),
203
+ "output": "[SIMULATED OUTPUT]",
204
+ "exit_code": 0,
205
+ "note": "This is a shadow mode simulation - no actual code was executed"
206
+ }
207
+
208
+ def _simulate_api_call(self, request: ExecutionRequest) -> Dict[str, Any]:
209
+ """Simulate API call"""
210
+ return {
211
+ "action": "api_call",
212
+ "url": request.parameters.get('url'),
213
+ "status_code": 200,
214
+ "response": {"data": "[SIMULATED API RESPONSE]"},
215
+ "note": "This is a shadow mode simulation - no actual API call was made"
216
+ }
217
+
218
+ def _analyze_impact(self, request: ExecutionRequest) -> Dict[str, Any]:
219
+ """Analyze what the actual impact would be if executed"""
220
+ impact = {
221
+ "action_type": request.action_type.value,
222
+ "side_effects": []
223
+ }
224
+
225
+ # Analyze potential side effects
226
+ if request.action_type == ActionType.FILE_WRITE:
227
+ impact["side_effects"].append({
228
+ "type": "file_system_modification",
229
+ "path": request.parameters.get('path'),
230
+ "reversible": True
231
+ })
232
+
233
+ elif request.action_type == ActionType.DATABASE_WRITE:
234
+ impact["side_effects"].append({
235
+ "type": "data_modification",
236
+ "table": request.parameters.get('table'),
237
+ "reversible": False, # Conservative assumption; depends on backup/transaction support
238
+ "note": "Reversibility depends on database configuration and backup policies"
239
+ })
240
+
241
+ elif request.action_type == ActionType.CODE_EXECUTION:
242
+ impact["side_effects"].append({
243
+ "type": "code_execution",
244
+ "danger_level": "high",
245
+ "reversible": False
246
+ })
247
+
248
+ elif request.action_type == ActionType.WORKFLOW_TRIGGER:
249
+ impact["side_effects"].append({
250
+ "type": "workflow_execution",
251
+ "workflow": request.parameters.get('workflow_id'),
252
+ "reversible": False
253
+ })
254
+
255
+ return impact
256
+
257
+ def get_simulation_log(self, agent_id: Optional[str] = None) -> List[SimulationResult]:
258
+ """Get simulation log, optionally filtered by agent"""
259
+ if agent_id:
260
+ return [s for s in self.simulation_log if s.agent_id == agent_id]
261
+ return self.simulation_log.copy()
262
+
263
+ def get_reasoning_trace(self, request_id: str) -> Optional[List[ReasoningStep]]:
264
+ """Get the reasoning trace for a specific request"""
265
+ return self.reasoning_traces.get(request_id)
266
+
267
+ def get_policy_violations(self) -> List[SimulationResult]:
268
+ """Get all simulations that would have violated policies"""
269
+ return [
270
+ s for s in self.simulation_log
271
+ if s.outcome in [SimulationOutcome.POLICY_VIOLATION, SimulationOutcome.RISK_TOO_HIGH]
272
+ ]
273
+
274
+ def get_statistics(self) -> Dict[str, Any]:
275
+ """Get statistics about shadow mode executions"""
276
+ total = len(self.simulation_log)
277
+ if total == 0:
278
+ return {"total": 0}
279
+
280
+ outcome_counts = {}
281
+ for sim in self.simulation_log:
282
+ outcome = sim.outcome.value
283
+ outcome_counts[outcome] = outcome_counts.get(outcome, 0) + 1
284
+
285
+ return {
286
+ "total_simulations": total,
287
+ "outcome_distribution": outcome_counts,
288
+ "success_rate": outcome_counts.get(SimulationOutcome.WOULD_SUCCEED.value, 0) / total,
289
+ "policy_violations": outcome_counts.get(SimulationOutcome.POLICY_VIOLATION.value, 0),
290
+ "risk_denials": outcome_counts.get(SimulationOutcome.RISK_TOO_HIGH.value, 0),
291
+ }
292
+
293
+
294
+ def add_reasoning_step(
295
+ chain: List[ReasoningStep],
296
+ description: str,
297
+ action: ActionType,
298
+ parameters: Dict[str, Any],
299
+ decision: str
300
+ ) -> List[ReasoningStep]:
301
+ """Helper to add a reasoning step to a chain"""
302
+ step = ReasoningStep(
303
+ step_number=len(chain) + 1,
304
+ description=description,
305
+ action_considered=action,
306
+ parameters=parameters,
307
+ decision=decision
308
+ )
309
+ chain.append(step)
310
+ return chain