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
This commit is contained in:
77
migrations/024_agent_visibility_fields.sql
Normal file
77
migrations/024_agent_visibility_fields.sql
Normal file
@@ -0,0 +1,77 @@
|
||||
-- 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';
|
||||
|
||||
Reference in New Issue
Block a user