- 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
78 lines
2.5 KiB
SQL
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';
|
|
|