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,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"]])
|
agent_os/cli/cmd_init.py
ADDED
|
@@ -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()
|