Files
microdao-daarion/services/pdp-service/policy_store.py
Apple fca48b3eb0 feat(node2): Complete NODE2 setup - guardian, agents, swapper models
- Node-guardian running on MacBook and updating metrics
- NODE2 agents (Atlas, Greeter, Oracle, Builder Bot) assigned to node-2-macbook-m4max
- Swapper models displaying correctly (8 models)
- DAGI Router agents showing with correct status (3 active, 1 stale)
- Router health check using node_cache for remote nodes
2025-12-02 07:07:58 -08:00

105 lines
3.6 KiB
Python

"""
Policy Store
Phase 4: Config-based storage
Phase 5: Database-backed with dynamic updates
"""
import yaml
import os
from typing import Optional, Dict, Any
class PolicyStore:
"""Store and retrieve policies"""
def __init__(self, config_path: str = "config.yaml"):
self.microdao_policies: Dict[str, Any] = {}
self.channel_policies: Dict[str, Any] = {}
self.tool_policies: Dict[str, Any] = {}
self.agent_policies: Dict[str, Any] = {}
self._load_config(config_path)
def _load_config(self, config_path: str):
"""Load policies from YAML config"""
if not os.path.exists(config_path):
print(f"⚠️ Config file not found: {config_path}, using empty policies")
return
with open(config_path, 'r') as f:
config = yaml.safe_load(f) or {}
# Load microDAO policies
for policy in config.get('microdao_policies', []):
microdao_id = policy['microdao_id']
self.microdao_policies[microdao_id] = policy
print(f"✅ Loaded microDAO policy: {microdao_id}")
# Load channel policies
for policy in config.get('channel_policies', []):
channel_id = policy['channel_id']
self.channel_policies[channel_id] = policy
print(f"✅ Loaded channel policy: {channel_id}")
# Load tool policies
for policy in config.get('tool_policies', []):
tool_id = policy['tool_id']
self.tool_policies[tool_id] = policy
print(f"✅ Loaded tool policy: {tool_id}")
# Load agent policies
for policy in config.get('agent_policies', []):
agent_id = policy['agent_id']
self.agent_policies[agent_id] = policy
print(f"✅ Loaded agent policy: {agent_id}")
print(f"📋 Total policies: {len(self.microdao_policies)} microDAOs, "
f"{len(self.channel_policies)} channels, "
f"{len(self.tool_policies)} tools, "
f"{len(self.agent_policies)} agents")
def is_microdao_owner(self, actor_id: str, microdao_id: str) -> bool:
"""Check if actor is microDAO owner"""
policy = self.microdao_policies.get(microdao_id)
if not policy:
return False
owners = policy.get('owners', [])
return actor_id in owners
def is_microdao_admin(self, actor_id: str, microdao_id: str) -> bool:
"""Check if actor is microDAO admin"""
policy = self.microdao_policies.get(microdao_id)
if not policy:
return False
admins = policy.get('admins', [])
return actor_id in admins or self.is_microdao_owner(actor_id, microdao_id)
def get_channel_policy(self, channel_id: str) -> Optional[Dict[str, Any]]:
"""Get channel policy"""
return self.channel_policies.get(channel_id)
def is_blocked_in_channel(self, actor_id: str, channel_id: str) -> bool:
"""Check if actor is blocked in channel"""
policy = self.channel_policies.get(channel_id)
if not policy:
return False
blocked_users = policy.get('blocked_users', [])
return actor_id in blocked_users
def get_tool_policy(self, tool_id: str) -> Optional[Dict[str, Any]]:
"""Get tool policy"""
return self.tool_policies.get(tool_id)
def get_agent_policy(self, agent_id: str) -> Optional[Dict[str, Any]]:
"""Get agent policy"""
return self.agent_policies.get(agent_id)