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,128 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """``agentos audit`` command implementation."""
4
+
5
+ from __future__ import annotations
6
+
7
+ import argparse
8
+ import csv
9
+ import json
10
+ from pathlib import Path
11
+
12
+ from .output import (
13
+ Colors,
14
+ get_output_format,
15
+ handle_missing_config,
16
+ get_config_path,
17
+ )
18
+
19
+
20
+ def cmd_audit(args: argparse.Namespace) -> int:
21
+ """Audit agent security configuration."""
22
+ root = Path(get_config_path(getattr(args, "path", None)))
23
+ agents_dir = root / ".agents"
24
+ output_format = get_output_format(args)
25
+
26
+ if not agents_dir.exists():
27
+ if output_format == "json":
28
+ print(json.dumps({"error": "Config directory not found", "passed": False}, indent=2))
29
+ else:
30
+ print(handle_missing_config(str(root)))
31
+ return 1
32
+
33
+ files = {
34
+ "agents.md": agents_dir / "agents.md",
35
+ "security.md": agents_dir / "security.md",
36
+ }
37
+
38
+ findings: list[dict[str, str]] = []
39
+ file_status: dict[str, bool] = {}
40
+
41
+ for name, path in files.items():
42
+ exists = path.exists()
43
+ file_status[name] = exists
44
+ if not exists:
45
+ findings.append({"severity": "error", "message": f"Missing {name}"})
46
+
47
+ security_md = files["security.md"]
48
+ if security_md.exists():
49
+ content = security_md.read_text()
50
+
51
+ dangerous = [
52
+ ("effect: allow", "Permissive allow - consider adding constraints"),
53
+ ]
54
+
55
+ for pattern, warning in dangerous:
56
+ if pattern in content and "action: *" in content:
57
+ findings.append({"severity": "warning", "message": warning})
58
+
59
+ required = ["kernel:", "signals:", "policies:"]
60
+ for section in required:
61
+ if section not in content:
62
+ findings.append({"severity": "error", "message": f"Missing required section: {section}"})
63
+
64
+ passed = all(f["severity"] != "error" for f in findings)
65
+
66
+ # CSV export
67
+ export_format = getattr(args, "export", None)
68
+ if export_format == "csv":
69
+ output_path = getattr(args, "output", None) or "audit.csv"
70
+ _export_audit_csv(root, file_status, findings, passed, output_path)
71
+ if output_format != "json":
72
+ print(f"{Colors.GREEN}✓{Colors.RESET} Audit exported to {output_path}")
73
+
74
+ if output_format == "json":
75
+ result = {
76
+ "path": str(root),
77
+ "files": file_status,
78
+ "findings": findings,
79
+ "passed": passed,
80
+ }
81
+ print(json.dumps(result, indent=2))
82
+ else:
83
+ print(f"Auditing {root}...")
84
+ print()
85
+
86
+ for name, exists in file_status.items():
87
+ if exists:
88
+ print(f" {Colors.GREEN}✓{Colors.RESET} {name}")
89
+ else:
90
+ print(f" {Colors.RED}✗{Colors.RESET} {name}")
91
+
92
+ print()
93
+
94
+ if findings:
95
+ print("Findings:")
96
+ for f in findings:
97
+ if f["severity"] == "warning":
98
+ print(f" {Colors.YELLOW}⚠{Colors.RESET} {f['message']}")
99
+ else:
100
+ print(f" {Colors.RED}✗{Colors.RESET} {f['message']}")
101
+ else:
102
+ print(f"{Colors.GREEN}✓{Colors.RESET} No issues found.")
103
+
104
+ print()
105
+
106
+ return 0 if passed else 1
107
+
108
+
109
+ def _export_audit_csv(
110
+ root: Path,
111
+ file_status: dict[str, bool],
112
+ findings: list[dict[str, str]],
113
+ passed: bool,
114
+ output_path: str,
115
+ ) -> None:
116
+ """Export audit results to a CSV file."""
117
+ with open(output_path, "w", newline="", encoding="utf-8") as f:
118
+ writer = csv.writer(f)
119
+ writer.writerow(["type", "name", "severity", "message"])
120
+ for name, exists in file_status.items():
121
+ writer.writerow([
122
+ "file",
123
+ name,
124
+ "ok" if exists else "error",
125
+ "Present" if exists else "Missing",
126
+ ])
127
+ for finding in findings:
128
+ writer.writerow(["finding", "", finding["severity"], finding["message"]])
@@ -0,0 +1,152 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """``agentos init`` command implementation."""
4
+
5
+ from __future__ import annotations
6
+
7
+ import argparse
8
+ import json
9
+ from pathlib import Path
10
+
11
+ from .output import (
12
+ format_error,
13
+ get_output_format,
14
+ )
15
+
16
+
17
+ def cmd_init(args: argparse.Namespace) -> int:
18
+ """Initialize .agents/ directory with Agent OS support."""
19
+ root = Path(args.path or ".")
20
+ agents_dir = root / ".agents"
21
+ output_format = get_output_format(args)
22
+
23
+ if agents_dir.exists() and not args.force:
24
+ if output_format == "json":
25
+ print(json.dumps({
26
+ "status": "error",
27
+ "message": f"{agents_dir} already exists",
28
+ "suggestion": "Use --force to overwrite"
29
+ }, indent=2))
30
+ else:
31
+ print(format_error(
32
+ f"{agents_dir} already exists",
33
+ suggestion="Use --force to overwrite: agentos init --force",
34
+ docs_path="getting-started.md",
35
+ ))
36
+ return 1
37
+
38
+ agents_dir.mkdir(parents=True, exist_ok=True)
39
+
40
+ # Create agents.md (OpenAI/Anthropic standard)
41
+ agents_md = agents_dir / "agents.md"
42
+ agents_md.write_text("""# Agent Configuration
43
+
44
+ You are an AI agent governed by Agent OS kernel.
45
+
46
+ ## Capabilities
47
+
48
+ You can:
49
+ - Query databases (read-only by default)
50
+ - Call approved APIs
51
+ - Generate reports
52
+
53
+ ## Constraints
54
+
55
+ You must:
56
+ - Follow all policies in security.md
57
+ - Request approval for write operations
58
+ - Log all actions to the flight recorder
59
+
60
+ ## Context
61
+
62
+ This agent is part of the Agent OS ecosystem.
63
+ For more information: https://github.com/microsoft/agent-governance-toolkit
64
+ """)
65
+
66
+ # Create security.md (Agent OS extension)
67
+ security_md = agents_dir / "security.md"
68
+ policy_template = args.template or "strict"
69
+
70
+ policies = {
71
+ "strict": {
72
+ "mode": "strict",
73
+ "signals": ["SIGSTOP", "SIGKILL", "SIGINT"],
74
+ "rules": [
75
+ {"action": "database_query", "mode": "read_only"},
76
+ {"action": "file_write", "requires_approval": True},
77
+ {"action": "api_call", "rate_limit": "100/hour"},
78
+ {"action": "send_email", "requires_approval": True},
79
+ ]
80
+ },
81
+ "permissive": {
82
+ "mode": "permissive",
83
+ "signals": ["SIGSTOP", "SIGKILL"],
84
+ "rules": [
85
+ {"action": "*", "effect": "allow"},
86
+ ]
87
+ },
88
+ "audit": {
89
+ "mode": "audit",
90
+ "signals": ["SIGSTOP"],
91
+ "rules": [
92
+ {"action": "*", "effect": "allow", "log": True},
93
+ ]
94
+ }
95
+ }
96
+
97
+ policy = policies.get(policy_template, policies["strict"])
98
+
99
+ security_content = f"""# Agent OS Security Configuration
100
+
101
+ kernel:
102
+ version: "1.0"
103
+ mode: {policy["mode"]}
104
+
105
+ signals:
106
+ """
107
+ for s in policy["signals"]:
108
+ security_content += f" - {s}\n"
109
+
110
+ security_content += "\npolicies:\n"
111
+ for r in policy["rules"]:
112
+ security_content += f' - action: {r["action"]}\n'
113
+ if "mode" in r:
114
+ security_content += f' mode: {r["mode"]}\n'
115
+ if r.get("requires_approval"):
116
+ security_content += ' requires_approval: true\n'
117
+ if "rate_limit" in r:
118
+ security_content += f' rate_limit: "{r["rate_limit"]}"\n'
119
+ if "effect" in r:
120
+ security_content += f' effect: {r["effect"]}\n'
121
+
122
+ security_content += """
123
+ observability:
124
+ metrics: true
125
+ traces: true
126
+ flight_recorder: true
127
+
128
+ # For more options, see:
129
+ # https://github.com/microsoft/agent-governance-toolkit/blob/main/docs/security-spec.md
130
+ """
131
+
132
+ security_md.write_text(security_content)
133
+
134
+ if output_format == "json":
135
+ print(json.dumps({
136
+ "status": "success",
137
+ "directory": str(agents_dir),
138
+ "template": policy_template,
139
+ "files": ["agents.md", "security.md"]
140
+ }, indent=2))
141
+ else:
142
+ print(f"Initialized Agent OS in {agents_dir}")
143
+ print(" - agents.md: Agent instructions (OpenAI/Anthropic standard)")
144
+ print(" - security.md: Kernel policies (Agent OS extension)")
145
+ print(f" - Template: {policy_template}")
146
+ print()
147
+ print("Next steps:")
148
+ print(" 1. Edit .agents/agents.md with your agent's capabilities")
149
+ print(" 2. Customize .agents/security.md policies")
150
+ print(" 3. Run: agentos secure --verify")
151
+
152
+ return 0
@@ -0,0 +1,41 @@
1
+ # Copyright (c) Microsoft Corporation.
2
+ # Licensed under the MIT License.
3
+ """``agentos policy`` command dispatcher."""
4
+
5
+ from __future__ import annotations
6
+
7
+ import argparse
8
+
9
+
10
+ def cmd_policy(args: argparse.Namespace) -> int:
11
+ """Dispatch 'agentos policy <subcommand>' to the policies CLI.
12
+
13
+ Routes ``agentos policy validate <file>`` and related subcommands
14
+ to :mod:`agent_os.policies.cli`, which provides full JSON-Schema
15
+ validation and Pydantic model validation in a single pass.
16
+
17
+ Args:
18
+ args: Parsed CLI arguments. Expects ``args.policy_command`` and
19
+ any subcommand-specific attributes set by the policy subparser.
20
+
21
+ Returns:
22
+ Exit code from the delegated command (0 = success, 1 = failure,
23
+ 2 = runtime error).
24
+ """
25
+ from agent_os.policies import cli as policies_cli # type: ignore[import]
26
+
27
+ sub = getattr(args, "policy_command", None)
28
+ if sub == "validate":
29
+ return policies_cli.cmd_validate(args)
30
+ if sub == "test":
31
+ return policies_cli.cmd_test(args)
32
+ if sub == "diff":
33
+ return policies_cli.cmd_diff(args)
34
+
35
+ # No subcommand given — print help
36
+ print("Usage: agentos policy <validate|test|diff>")
37
+ print()
38
+ print(" validate <file> Validate a policy YAML/JSON file")
39
+ print(" test <policy> <scenarios> Run scenario tests against a policy")
40
+ print(" diff <file1> <file2> Show differences between two policies")
41
+ return 0
@@ -0,0 +1,180 @@
1
+ """Policy generator CLI — generates YAML policy files from templates.
2
+
3
+ Reduces the OPA/Rego learning curve by providing ready-made policy
4
+ templates that work out of the box with AGT's PolicyEvaluator.
5
+
6
+ Usage:
7
+ agent-os policy generate --template strict
8
+ agent-os policy generate --template permissive -o my-policy.yaml
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import argparse
14
+ import sys
15
+ from typing import Any
16
+
17
+ import yaml
18
+
19
+ TEMPLATES: dict[str, dict[str, Any]] = {
20
+ "strict": {
21
+ "version": "1.0",
22
+ "rules": [
23
+ {"action": "web_search", "effect": "allow"},
24
+ {"action": "read_file", "effect": "allow"},
25
+ {
26
+ "action": "*",
27
+ "effect": "deny",
28
+ "reason": "Strict mode: all actions blocked by default",
29
+ },
30
+ ],
31
+ "content_filters": {
32
+ "blocked_patterns": [
33
+ r"\b\d{3}-\d{2}-\d{4}\b", # SSN
34
+ r"\b\d{16}\b", # Credit card
35
+ ],
36
+ },
37
+ "settings": {
38
+ "require_human_approval": True,
39
+ "max_tool_calls_per_session": 20,
40
+ "log_level": "audit",
41
+ },
42
+ },
43
+ "permissive": {
44
+ "version": "1.0",
45
+ "rules": [
46
+ {
47
+ "action": "*",
48
+ "effect": "allow",
49
+ "reason": "Permissive mode: all actions allowed (dev/test only)",
50
+ },
51
+ ],
52
+ "content_filters": {
53
+ "blocked_patterns": [
54
+ r"\b\d{3}-\d{2}-\d{4}\b", # SSN
55
+ r"\b\d{16}\b", # Credit card
56
+ ],
57
+ },
58
+ "settings": {
59
+ "require_human_approval": False,
60
+ "max_tool_calls_per_session": 100,
61
+ "log_level": "info",
62
+ },
63
+ },
64
+ "web-only": {
65
+ "version": "1.0",
66
+ "rules": [
67
+ {"action": "web_search", "effect": "allow"},
68
+ {"action": "web_browse", "effect": "allow"},
69
+ {
70
+ "action": "*",
71
+ "effect": "deny",
72
+ "reason": "Web-only mode: only web actions allowed",
73
+ },
74
+ ],
75
+ "content_filters": {
76
+ "blocked_patterns": [
77
+ r"\b\d{3}-\d{2}-\d{4}\b",
78
+ r"\b\d{16}\b",
79
+ ],
80
+ },
81
+ "settings": {
82
+ "require_human_approval": False,
83
+ "max_tool_calls_per_session": 50,
84
+ "log_level": "info",
85
+ },
86
+ },
87
+ "read-only": {
88
+ "version": "1.0",
89
+ "rules": [
90
+ {"action": "read_file", "effect": "allow"},
91
+ {"action": "list_directory", "effect": "allow"},
92
+ {"action": "web_search", "effect": "allow"},
93
+ {
94
+ "action": "*",
95
+ "effect": "deny",
96
+ "reason": "Read-only mode: no write or execute actions",
97
+ },
98
+ ],
99
+ "content_filters": {
100
+ "blocked_patterns": [
101
+ r"\b\d{3}-\d{2}-\d{4}\b",
102
+ r"\b\d{16}\b",
103
+ ],
104
+ },
105
+ "settings": {
106
+ "require_human_approval": False,
107
+ "max_tool_calls_per_session": 50,
108
+ "log_level": "info",
109
+ },
110
+ },
111
+ "custom": {
112
+ "version": "1.0",
113
+ "rules": [
114
+ {"action": "REPLACE_ME", "effect": "allow"},
115
+ {
116
+ "action": "*",
117
+ "effect": "deny",
118
+ "reason": "Custom template: edit rules to match your needs",
119
+ },
120
+ ],
121
+ "content_filters": {"blocked_patterns": []},
122
+ "settings": {
123
+ "require_human_approval": False,
124
+ "max_tool_calls_per_session": 50,
125
+ "log_level": "info",
126
+ },
127
+ },
128
+ }
129
+
130
+ TEMPLATE_CHOICES = list(TEMPLATES.keys())
131
+
132
+
133
+ def generate_policy(template_name: str) -> str:
134
+ """Generate a YAML policy string from a named template."""
135
+ if template_name not in TEMPLATES:
136
+ raise ValueError(
137
+ f"Unknown template '{template_name}'. "
138
+ f"Choose from: {', '.join(TEMPLATE_CHOICES)}"
139
+ )
140
+
141
+ header = (
142
+ f"# AGT Policy — {template_name} template\n"
143
+ f"# Generated by: agent-os policy generate --template {template_name}\n"
144
+ )
145
+ body = yaml.dump(TEMPLATES[template_name], default_flow_style=False, sort_keys=False)
146
+ return header + body
147
+
148
+
149
+ def cmd_policy_gen(argv: list[str] | None = None) -> None:
150
+ """CLI entry point for policy generation."""
151
+ parser = argparse.ArgumentParser(
152
+ prog="agent-os policy generate",
153
+ description="Generate YAML governance policies from templates.",
154
+ )
155
+ parser.add_argument(
156
+ "--template",
157
+ choices=TEMPLATE_CHOICES,
158
+ default="strict",
159
+ help="Policy template to use (default: strict)",
160
+ )
161
+ parser.add_argument(
162
+ "-o",
163
+ "--output",
164
+ default=None,
165
+ help="Output file path. Defaults to stdout.",
166
+ )
167
+ args = parser.parse_args(argv)
168
+
169
+ policy_yaml = generate_policy(args.template)
170
+
171
+ if args.output:
172
+ with open(args.output, "w", encoding="utf-8") as f:
173
+ f.write(policy_yaml)
174
+ print(f"✅ Policy written to {args.output}", file=sys.stderr)
175
+ else:
176
+ print(policy_yaml)
177
+
178
+
179
+ if __name__ == "__main__":
180
+ cmd_policy_gen()