Files
microdao-daarion/services/pdp-service/policy_store.py
Apple 744c149300
Some checks failed
Build and Deploy Docs / build-and-deploy (push) Has been cancelled
Add automated session logging system
- Created logs/ structure (sessions, operations, incidents)
- Added session-start/log/end scripts
- Installed Git hooks for auto-logging commits/pushes
- Added shell integration for zsh
- Created CHANGELOG.md
- Documented today's session (2026-01-10)
2026-01-10 04:53:17 -08:00

114 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)