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,69 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+
4
+ """
5
+ Self-Correcting Agent Kernel
6
+
7
+ A Dual-Loop Architecture for Enterprise Agents:
8
+ - Loop 1 (Runtime): Constraint Engine (Safety)
9
+ - Loop 2 (Offline): Alignment Engine (Quality & Efficiency)
10
+ - Completeness Auditor (detects laziness)
11
+ - Semantic Purge (scales by subtraction)
12
+
13
+ Reference Implementations:
14
+ - auditor.py: Simplified soft failure detection
15
+ - teacher.py: Shadow Teacher diagnosis
16
+ - memory_manager.py: Lesson lifecycle management
17
+ """
18
+
19
+ __version__ = "3.1.0"
20
+
21
+ from .kernel import SelfCorrectingAgentKernel
22
+ from .models import (
23
+ AgentFailure, FailureAnalysis, CorrectionPatch,
24
+ AgentOutcome, CompletenessAudit, ClassifiedPatch,
25
+ OutcomeType, GiveUpSignal, PatchDecayType,
26
+ ToolExecutionTelemetry, ToolExecutionStatus,
27
+ SemanticAnalysis, NudgeResult
28
+ )
29
+ from .outcome_analyzer import OutcomeAnalyzer
30
+ from .completeness_auditor import CompletenessAuditor
31
+ from .semantic_purge import SemanticPurge, PatchClassifier
32
+ from .triage import FailureTriage, FixStrategy
33
+ from .semantic_analyzer import SemanticAnalyzer
34
+ from .nudge_mechanism import NudgeMechanism
35
+
36
+ # Reference implementations (simplified examples)
37
+ from .auditor import CompletenessAuditor as SimpleCompletenessAuditor
38
+ from .teacher import diagnose_failure
39
+ from .memory_manager import MemoryManager, LessonType
40
+
41
+ __all__ = [
42
+ "SelfCorrectingAgentKernel",
43
+ "AgentFailure",
44
+ "FailureAnalysis",
45
+ "CorrectionPatch",
46
+ "AgentOutcome",
47
+ "CompletenessAudit",
48
+ "ClassifiedPatch",
49
+ "OutcomeType",
50
+ "GiveUpSignal",
51
+ "PatchDecayType",
52
+ "ToolExecutionTelemetry",
53
+ "ToolExecutionStatus",
54
+ "SemanticAnalysis",
55
+ "NudgeResult",
56
+ "OutcomeAnalyzer",
57
+ "CompletenessAuditor",
58
+ "SemanticPurge",
59
+ "PatchClassifier",
60
+ "FailureTriage",
61
+ "FixStrategy",
62
+ "SemanticAnalyzer",
63
+ "NudgeMechanism",
64
+ # Reference implementations
65
+ "SimpleCompletenessAuditor",
66
+ "diagnose_failure",
67
+ "MemoryManager",
68
+ "LessonType",
69
+ ]
@@ -0,0 +1,435 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+
4
+ """
5
+ Failure analysis system that diagnoses root causes.
6
+ """
7
+
8
+ import logging
9
+ from typing import List, Optional, Dict
10
+ from collections import Counter
11
+
12
+ from .models import AgentFailure, FailureAnalysis, FailureType, DiagnosisJSON, CognitiveGlitch
13
+
14
+ logger = logging.getLogger(__name__)
15
+
16
+
17
+ class FailureAnalyzer:
18
+ """Analyzes failures to identify root causes and suggest fixes."""
19
+
20
+ def __init__(self):
21
+ self.analysis_history: List[FailureAnalysis] = []
22
+ self.known_patterns: Dict[str, dict] = self._load_known_patterns()
23
+
24
+ def _load_known_patterns(self) -> Dict[str, dict]:
25
+ """Load known failure patterns and their solutions."""
26
+ return {
27
+ FailureType.BLOCKED_BY_CONTROL_PLANE: {
28
+ "root_causes": [
29
+ "Missing permission validation",
30
+ "Attempting unauthorized resource access",
31
+ "Policy violation",
32
+ "Security constraint violation"
33
+ ],
34
+ "fixes": [
35
+ "Add permission checks before actions",
36
+ "Implement resource access validation",
37
+ "Use safe alternatives for restricted operations",
38
+ "Request proper authorization before attempting action"
39
+ ]
40
+ },
41
+ FailureType.TIMEOUT: {
42
+ "root_causes": [
43
+ "Operation taking too long",
44
+ "Infinite loop or deadlock",
45
+ "Network latency",
46
+ "Resource contention"
47
+ ],
48
+ "fixes": [
49
+ "Implement operation timeout handling",
50
+ "Add progress monitoring",
51
+ "Optimize algorithm efficiency",
52
+ "Add async/parallel processing"
53
+ ]
54
+ },
55
+ FailureType.INVALID_ACTION: {
56
+ "root_causes": [
57
+ "Invalid input parameters",
58
+ "Action not supported in current state",
59
+ "Precondition not met"
60
+ ],
61
+ "fixes": [
62
+ "Add input validation",
63
+ "Check state before action",
64
+ "Verify preconditions"
65
+ ]
66
+ },
67
+ FailureType.RESOURCE_EXHAUSTED: {
68
+ "root_causes": [
69
+ "Memory leak",
70
+ "Unbounded resource allocation",
71
+ "Missing cleanup"
72
+ ],
73
+ "fixes": [
74
+ "Implement resource cleanup",
75
+ "Add resource limits",
76
+ "Use resource pooling"
77
+ ]
78
+ },
79
+ FailureType.LOGIC_ERROR: {
80
+ "root_causes": [
81
+ "Incorrect algorithm",
82
+ "Edge case not handled",
83
+ "Type mismatch"
84
+ ],
85
+ "fixes": [
86
+ "Fix algorithm logic",
87
+ "Add edge case handling",
88
+ "Add type checking"
89
+ ]
90
+ }
91
+ }
92
+
93
+ def analyze(self, failure: AgentFailure, similar_failures: Optional[List[AgentFailure]] = None) -> FailureAnalysis:
94
+ """
95
+ Analyze a failure to identify root cause and suggest fixes.
96
+
97
+ Args:
98
+ failure: The failure to analyze
99
+ similar_failures: Optional list of similar past failures
100
+
101
+ Returns:
102
+ FailureAnalysis with root cause and suggested fixes
103
+ """
104
+ logger.info(f"Analyzing failure for agent {failure.agent_id}")
105
+
106
+ # Get known patterns for this failure type
107
+ patterns = self.known_patterns.get(failure.failure_type, {})
108
+
109
+ # Identify root cause
110
+ root_cause = self._identify_root_cause(failure, patterns)
111
+
112
+ # Identify contributing factors
113
+ contributing_factors = self._identify_contributing_factors(failure, patterns)
114
+
115
+ # Generate suggested fixes
116
+ suggested_fixes = self._generate_fixes(failure, patterns)
117
+
118
+ # Calculate confidence based on pattern matching and similar failures
119
+ confidence_score = self._calculate_confidence(failure, similar_failures)
120
+
121
+ # Find similar failures
122
+ similar_failure_ids = []
123
+ if similar_failures:
124
+ similar_failure_ids = [f.agent_id + "_" + str(f.timestamp) for f in similar_failures[:5]]
125
+
126
+ analysis = FailureAnalysis(
127
+ failure=failure,
128
+ root_cause=root_cause,
129
+ contributing_factors=contributing_factors,
130
+ suggested_fixes=suggested_fixes,
131
+ confidence_score=confidence_score,
132
+ similar_failures=similar_failure_ids
133
+ )
134
+
135
+ self.analysis_history.append(analysis)
136
+ logger.info(f"Analysis complete. Root cause: {root_cause} (confidence: {confidence_score:.2f})")
137
+
138
+ return analysis
139
+
140
+ def _identify_root_cause(self, failure: AgentFailure, patterns: dict) -> str:
141
+ """Identify the root cause of the failure."""
142
+ root_causes = patterns.get("root_causes", ["Unknown root cause"])
143
+
144
+ # For control plane blocks, check context for more specific cause
145
+ if failure.failure_type == FailureType.BLOCKED_BY_CONTROL_PLANE:
146
+ context = failure.context
147
+ if "permission" in failure.error_message.lower():
148
+ return "Missing or insufficient permissions for requested operation"
149
+ elif "policy" in failure.error_message.lower():
150
+ return "Action violates control plane policy"
151
+ else:
152
+ return root_causes[0]
153
+
154
+ # Return the first root cause as default
155
+ return root_causes[0]
156
+
157
+ def _identify_contributing_factors(self, failure: AgentFailure, patterns: dict) -> List[str]:
158
+ """Identify contributing factors to the failure."""
159
+ factors = []
160
+
161
+ # Check for common contributing factors
162
+ if failure.severity.value in ["high", "critical"]:
163
+ factors.append("High severity failure requiring immediate attention")
164
+
165
+ if failure.stack_trace:
166
+ factors.append("Stack trace available for detailed debugging")
167
+
168
+ if failure.context:
169
+ factors.append(f"Additional context available: {', '.join(failure.context.keys())}")
170
+
171
+ return factors
172
+
173
+ def _generate_fixes(self, failure: AgentFailure, patterns: dict) -> List[str]:
174
+ """Generate suggested fixes for the failure."""
175
+ fixes = patterns.get("fixes", ["Manual investigation required"])
176
+
177
+ # Add specific fixes based on failure type
178
+ if failure.failure_type == FailureType.BLOCKED_BY_CONTROL_PLANE:
179
+ if "file" in failure.context:
180
+ fixes.append(f"Validate access permissions for: {failure.context['file']}")
181
+ if "action" in failure.context:
182
+ fixes.append(f"Check if action '{failure.context['action']}' is allowed by policy")
183
+
184
+ return fixes[:3] # Return top 3 fixes
185
+
186
+ def _calculate_confidence(self, failure: AgentFailure, similar_failures: Optional[List[AgentFailure]]) -> float:
187
+ """Calculate confidence score for the analysis."""
188
+ confidence = 0.5 # Base confidence
189
+
190
+ # Increase confidence if we have a known pattern
191
+ if failure.failure_type in self.known_patterns:
192
+ confidence += 0.2
193
+
194
+ # Increase confidence if we have similar failures
195
+ if similar_failures and len(similar_failures) > 0:
196
+ confidence += min(0.2, len(similar_failures) * 0.05)
197
+
198
+ # Increase confidence if we have detailed context
199
+ if failure.context and len(failure.context) > 0:
200
+ confidence += 0.1
201
+
202
+ return min(1.0, confidence)
203
+
204
+ def diagnose_cognitive_glitch(self, failure: AgentFailure) -> DiagnosisJSON:
205
+ """
206
+ Deep diagnosis to identify cognitive glitches in agent reasoning.
207
+
208
+ This is "The Analyst" - looking at the reasoning that led to the error,
209
+ not just the error itself.
210
+
211
+ Args:
212
+ failure: AgentFailure with full trace
213
+
214
+ Returns:
215
+ DiagnosisJSON with cognitive glitch identification
216
+ """
217
+ logger.info(f"Diagnosing cognitive glitch for agent {failure.agent_id}")
218
+
219
+ if not failure.failure_trace:
220
+ # Fall back to basic diagnosis if no trace available
221
+ return self._basic_diagnosis(failure)
222
+
223
+ trace = failure.failure_trace
224
+
225
+ # Identify cognitive glitch type
226
+ glitch = self._identify_cognitive_glitch(failure, trace)
227
+
228
+ # Deep problem analysis
229
+ deep_problem = self._analyze_deep_problem(failure, trace, glitch)
230
+
231
+ # Collect evidence
232
+ evidence = self._collect_evidence(failure, trace, glitch)
233
+
234
+ # Generate hint for counterfactual simulation
235
+ hint = self._generate_hint(failure, trace, glitch)
236
+
237
+ # Expected fix description
238
+ expected_fix = self._describe_expected_fix(glitch, hint)
239
+
240
+ # Calculate confidence
241
+ confidence = self._calculate_diagnosis_confidence(failure, trace, evidence)
242
+
243
+ diagnosis = DiagnosisJSON(
244
+ cognitive_glitch=glitch,
245
+ deep_problem=deep_problem,
246
+ evidence=evidence,
247
+ hint=hint,
248
+ expected_fix=expected_fix,
249
+ confidence=confidence
250
+ )
251
+
252
+ logger.info(f"Diagnosis complete: {glitch.value} (confidence: {confidence:.2f})")
253
+ return diagnosis
254
+
255
+ def _identify_cognitive_glitch(self, failure: AgentFailure, trace) -> CognitiveGlitch:
256
+ """Identify the type of cognitive glitch."""
257
+ error_lower = failure.error_message.lower()
258
+
259
+ # Check for tool misuse (wrong parameter types) - high priority
260
+ if any(keyword in error_lower for keyword in ["type error", "invalid type", "expected uuid", "wrong parameter type", "parameter type mismatch"]):
261
+ return CognitiveGlitch.TOOL_MISUSE
262
+ if "uuid" in error_lower or ("id" in error_lower and any(kw in error_lower for kw in ["invalid", "malformed", "not a valid", "format"])):
263
+ # Check if this looks like a tool misuse scenario
264
+ if trace.failed_action:
265
+ action_str = str(trace.failed_action).lower()
266
+ if any(kw in action_str for kw in ["name", "username", "email", "params", "id"]):
267
+ return CognitiveGlitch.TOOL_MISUSE
268
+ return CognitiveGlitch.TOOL_MISUSE
269
+
270
+ # Check for policy violations (e.g., medical advice, legal advice) - high priority
271
+ if any(keyword in error_lower for keyword in ["policy violation", "violates policy", "not allowed to", "cannot advise", "cannot provide"]):
272
+ return CognitiveGlitch.POLICY_VIOLATION
273
+ # Check for specific policy domains in combination with blocking
274
+ if trace.user_prompt:
275
+ prompt_lower = trace.user_prompt.lower()
276
+ if any(domain in prompt_lower for domain in ["medical", "health", "diagnosis", "treatment", "medicine", "legal", "attorney", "sue", "investment", "stock"]):
277
+ if any(keyword in error_lower for keyword in ["blocked", "violation", "not permitted", "cannot", "policy"]):
278
+ return CognitiveGlitch.POLICY_VIOLATION
279
+
280
+ # Check for hallucination (inventing facts) - check early before context gap
281
+ if any(keyword in error_lower for keyword in ["not found", "does not exist", "unknown", "deprecated", "invalid reference", "no such"]):
282
+ return CognitiveGlitch.HALLUCINATION
283
+
284
+ # Check for schema mismatch
285
+ if trace.failed_action:
286
+ action_str = str(trace.failed_action).lower()
287
+ if "schema" in error_lower and "mismatch" in action_str:
288
+ return CognitiveGlitch.SCHEMA_MISMATCH
289
+
290
+ # Check for logic error (misunderstanding)
291
+ if trace.chain_of_thought:
292
+ cot_text = " ".join(trace.chain_of_thought).lower()
293
+ # Look for misinterpretation of terms like "recent", "delete", etc.
294
+ if any(keyword in cot_text for keyword in ["i think", "probably", "assume", "guess"]):
295
+ return CognitiveGlitch.LOGIC_ERROR
296
+
297
+ # Check for context gap (missing information) - lower priority
298
+ if not trace.chain_of_thought or len(trace.chain_of_thought) < 2:
299
+ # Don't default to context gap if we have other clear signals
300
+ if trace.failed_action and ("uuid" in error_lower or "id" in error_lower):
301
+ return CognitiveGlitch.TOOL_MISUSE
302
+ if any(keyword in error_lower for keyword in ["not found", "does not exist"]):
303
+ return CognitiveGlitch.HALLUCINATION
304
+ return CognitiveGlitch.CONTEXT_GAP
305
+
306
+ # Check for permission errors
307
+ if any(keyword in error_lower for keyword in ["permission", "unauthorized", "forbidden"]):
308
+ # Distinguish from policy violations
309
+ if "policy" not in error_lower and "violates" not in error_lower:
310
+ return CognitiveGlitch.PERMISSION_ERROR
311
+
312
+ return CognitiveGlitch.LOGIC_ERROR # Default
313
+
314
+ def _analyze_deep_problem(self, failure: AgentFailure, trace, glitch: CognitiveGlitch) -> str:
315
+ """Analyze the deep problem behind the glitch."""
316
+ if glitch == CognitiveGlitch.HALLUCINATION:
317
+ return f"Agent invented non-existent entities in action: {trace.failed_action}"
318
+ elif glitch == CognitiveGlitch.LOGIC_ERROR:
319
+ return f"Agent misunderstood user intent in prompt: '{trace.user_prompt}'"
320
+ elif glitch == CognitiveGlitch.CONTEXT_GAP:
321
+ return f"Agent lacked necessary context (schema/permissions) to safely execute action"
322
+ elif glitch == CognitiveGlitch.PERMISSION_ERROR:
323
+ return f"Agent attempted unauthorized action without checking permissions first"
324
+ elif glitch == CognitiveGlitch.SCHEMA_MISMATCH:
325
+ return f"Agent referenced incorrect schema elements in action"
326
+ elif glitch == CognitiveGlitch.TOOL_MISUSE:
327
+ return f"Agent used tool with wrong parameter type or value: {trace.failed_action}"
328
+ elif glitch == CognitiveGlitch.POLICY_VIOLATION:
329
+ return f"Agent violated policy boundaries by attempting: '{trace.user_prompt}'"
330
+ return "Unknown deep problem"
331
+
332
+ def _collect_evidence(self, failure: AgentFailure, trace, glitch: CognitiveGlitch) -> List[str]:
333
+ """Collect evidence supporting the diagnosis."""
334
+ evidence = []
335
+
336
+ evidence.append(f"User prompt: '{trace.user_prompt}'")
337
+ evidence.append(f"Failed action: {trace.failed_action}")
338
+ evidence.append(f"Error: {failure.error_message}")
339
+
340
+ if trace.chain_of_thought:
341
+ evidence.append(f"Reasoning steps: {len(trace.chain_of_thought)} steps")
342
+ if trace.chain_of_thought:
343
+ evidence.append(f"Last thought: '{trace.chain_of_thought[-1]}'")
344
+
345
+ return evidence
346
+
347
+ def _generate_hint(self, failure: AgentFailure, trace, glitch: CognitiveGlitch) -> str:
348
+ """Generate a hint to inject for counterfactual simulation."""
349
+ if glitch == CognitiveGlitch.HALLUCINATION:
350
+ return "HINT: Always verify entity names against the provided schema before using them. Available tables/resources must be explicitly listed."
351
+ elif glitch == CognitiveGlitch.LOGIC_ERROR:
352
+ return f"HINT: When interpreting '{trace.user_prompt}', be precise about terms like 'recent', 'delete', 'modify'. Ask for clarification if ambiguous."
353
+ elif glitch == CognitiveGlitch.CONTEXT_GAP:
354
+ return "HINT: Before executing actions, ensure you have: 1) Complete schema information, 2) Permission requirements, 3) Clear action scope."
355
+ elif glitch == CognitiveGlitch.PERMISSION_ERROR:
356
+ return "HINT: Always check permissions before attempting actions. Use validate_permissions() first."
357
+ elif glitch == CognitiveGlitch.SCHEMA_MISMATCH:
358
+ return "HINT: Available schema elements must be verified before use. Do not assume table/column names."
359
+ elif glitch == CognitiveGlitch.TOOL_MISUSE:
360
+ return "HINT: Always verify parameter types match the tool schema. For example, use UUIDs where required, not names or strings."
361
+ elif glitch == CognitiveGlitch.POLICY_VIOLATION:
362
+ return "HINT: Some topics are outside your policy boundaries. Refuse requests for medical advice, legal advice, or other restricted domains."
363
+ return "HINT: Proceed with caution and verify all assumptions."
364
+
365
+ def _describe_expected_fix(self, glitch: CognitiveGlitch, hint: str) -> str:
366
+ """Describe the expected outcome of applying the hint."""
367
+ if glitch == CognitiveGlitch.HALLUCINATION:
368
+ return "Agent will verify schema before action and use only existing entities"
369
+ elif glitch == CognitiveGlitch.LOGIC_ERROR:
370
+ return "Agent will correctly interpret user intent and clarify ambiguous terms"
371
+ elif glitch == CognitiveGlitch.CONTEXT_GAP:
372
+ return "Agent will request necessary context before proceeding with action"
373
+ elif glitch == CognitiveGlitch.PERMISSION_ERROR:
374
+ return "Agent will validate permissions before attempting action"
375
+ elif glitch == CognitiveGlitch.TOOL_MISUSE:
376
+ return "Agent will use correct parameter types according to tool schema"
377
+ elif glitch == CognitiveGlitch.POLICY_VIOLATION:
378
+ return "Agent will refuse to provide advice in restricted domains"
379
+ return "Agent will handle the situation correctly"
380
+
381
+ def _calculate_diagnosis_confidence(self, failure: AgentFailure, trace, evidence: List[str]) -> float:
382
+ """Calculate confidence in the diagnosis."""
383
+ confidence = 0.5 # Base
384
+
385
+ # More confidence with complete trace
386
+ if trace.chain_of_thought and len(trace.chain_of_thought) > 2:
387
+ confidence += 0.2
388
+
389
+ # More confidence with detailed action
390
+ if trace.failed_action and len(trace.failed_action) > 0:
391
+ confidence += 0.15
392
+
393
+ # More confidence with rich evidence
394
+ if len(evidence) >= 4:
395
+ confidence += 0.15
396
+
397
+ return min(1.0, confidence)
398
+
399
+ def _basic_diagnosis(self, failure: AgentFailure) -> DiagnosisJSON:
400
+ """Fallback diagnosis when no trace is available."""
401
+ return DiagnosisJSON(
402
+ cognitive_glitch=CognitiveGlitch.NONE,
403
+ deep_problem=f"No trace available. Basic error: {failure.error_message}",
404
+ evidence=[f"Error message: {failure.error_message}"],
405
+ hint="HINT: Ensure proper validation before actions.",
406
+ expected_fix="Action will be validated before execution",
407
+ confidence=0.5
408
+ )
409
+
410
+ def find_similar_failures(self, failure: AgentFailure, history: List[AgentFailure]) -> List[AgentFailure]:
411
+ """Find similar failures in history."""
412
+ similar = []
413
+
414
+ for past_failure in history:
415
+ if past_failure.failure_type == failure.failure_type:
416
+ # Calculate similarity based on error message
417
+ similarity = self._calculate_similarity(failure.error_message, past_failure.error_message)
418
+ if similarity > 0.6:
419
+ similar.append(past_failure)
420
+
421
+ return similar[:10] # Return top 10 similar failures
422
+
423
+ def _calculate_similarity(self, msg1: str, msg2: str) -> float:
424
+ """Calculate similarity between two error messages."""
425
+ # Simple word-based similarity
426
+ words1 = set(msg1.lower().split())
427
+ words2 = set(msg2.lower().split())
428
+
429
+ if not words1 or not words2:
430
+ return 0.0
431
+
432
+ intersection = words1.intersection(words2)
433
+ union = words1.union(words2)
434
+
435
+ return len(intersection) / len(union) if union else 0.0
@@ -0,0 +1,36 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ # Public Preview — basic self-correction with retry
4
+ """
5
+ Auditor — simple null/empty check on response text.
6
+ """
7
+
8
+
9
+ class CompletenessAuditor:
10
+ """Basic completeness check: null, empty, or trivially short responses."""
11
+
12
+ def __init__(self):
13
+ self.lazy_signals = [
14
+ "i cannot", "i'm sorry", "no data found",
15
+ "unable to access", "context does not contain",
16
+ ]
17
+
18
+ def audit_response(self, agent_response: str, tool_output: str = "") -> bool:
19
+ """
20
+ Returns True when the response likely needs intervention.
21
+
22
+ Checks:
23
+ 1. Null / empty response
24
+ 2. Known give-up phrases
25
+ 3. Tool returned trivially small output
26
+ """
27
+ if not agent_response or not agent_response.strip():
28
+ return True
29
+
30
+ if any(sig in agent_response.lower() for sig in self.lazy_signals):
31
+ return True
32
+
33
+ if tool_output and len(tool_output) < 10:
34
+ return True
35
+
36
+ return False