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,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
|