Files
microdao-daarion/migrations/024_agent_visibility_fields.sql
Apple 15714fb170 feat: unified Agent/Citizen model with visibility controls
- Add visibility_scope, is_listed_in_directory, is_system, primary_microdao_id to agents
- Create unified list_agent_summaries method
- Add PUT /city/agents/{id}/visibility endpoint
- Add AgentVisibilityCard component
- Update AgentSummary types for frontend
2025-11-28 07:56:33 -08:00

78 lines
2.5 KiB
SQL

-- Migration: Add visibility and listing fields to agents
-- Purpose: Unify Agent/Citizen model with proper visibility control
-- Date: 2025-11-28
-- Add visibility scope field
ALTER TABLE agents
ADD COLUMN IF NOT EXISTS visibility_scope TEXT NOT NULL DEFAULT 'city';
-- Add listing in directory flag
ALTER TABLE agents
ADD COLUMN IF NOT EXISTS is_listed_in_directory BOOLEAN NOT NULL DEFAULT true;
-- Add system agent flag
ALTER TABLE agents
ADD COLUMN IF NOT EXISTS is_system BOOLEAN NOT NULL DEFAULT false;
-- Add primary microDAO reference
ALTER TABLE agents
ADD COLUMN IF NOT EXISTS primary_microdao_id TEXT NULL;
-- Add slug for public URL
ALTER TABLE agents
ADD COLUMN IF NOT EXISTS slug TEXT NULL;
-- Create unique index on slug
CREATE UNIQUE INDEX IF NOT EXISTS idx_agents_slug ON agents(slug) WHERE slug IS NOT NULL;
-- Add check constraint for visibility_scope
ALTER TABLE agents
DROP CONSTRAINT IF EXISTS chk_visibility_scope;
ALTER TABLE agents
ADD CONSTRAINT chk_visibility_scope
CHECK (visibility_scope IN ('city', 'microdao', 'owner_only'));
-- Create index for faster filtering
CREATE INDEX IF NOT EXISTS idx_agents_visibility ON agents(visibility_scope, is_listed_in_directory);
CREATE INDEX IF NOT EXISTS idx_agents_primary_microdao ON agents(primary_microdao_id);
-- Update existing public agents to be listed
UPDATE agents
SET is_listed_in_directory = true
WHERE is_public = true;
-- Update non-public agents to not be listed
UPDATE agents
SET is_listed_in_directory = false
WHERE is_public = false;
-- Set system agents (infrastructure agents)
UPDATE agents
SET is_system = true
WHERE kind IN ('system', 'monitor', 'infrastructure')
OR id LIKE 'ag_%';
-- Generate slugs from public_slug or id
UPDATE agents
SET slug = COALESCE(public_slug, LOWER(REPLACE(display_name, ' ', '-')))
WHERE slug IS NULL;
-- Set primary_microdao_id from first membership
UPDATE agents a
SET primary_microdao_id = (
SELECT ma.microdao_id
FROM microdao_agents ma
WHERE ma.agent_id = a.id
ORDER BY ma.created_at
LIMIT 1
)
WHERE primary_microdao_id IS NULL;
-- Comments
COMMENT ON COLUMN agents.visibility_scope IS 'Visibility: city (public), microdao (members only), owner_only (private)';
COMMENT ON COLUMN agents.is_listed_in_directory IS 'Show in public Citizens directory';
COMMENT ON COLUMN agents.is_system IS 'System/infrastructure agent';
COMMENT ON COLUMN agents.primary_microdao_id IS 'Primary MicroDAO for this agent';
COMMENT ON COLUMN agents.slug IS 'URL-friendly slug for agent profile';