diff --git a/.changeset/member-profiles.md b/.changeset/member-profiles.md new file mode 100644 index 0000000000..4c5ee982f5 --- /dev/null +++ b/.changeset/member-profiles.md @@ -0,0 +1,10 @@ +--- +--- + +Add member profiles with agent discovery and rich agent cards + +- Agent cards now display agent type (Creative Agent, Sales Agent, Signals Agent) +- Show type-specific stats: formats for creative agents, products/publishers for sales agents +- Display both MCP and A2A protocol badges when agents support both +- Shared agent card component ensures consistency across edit profile, member detail, and member directory pages +- Default MEMBERSHIP_ENABLED to false for production safety diff --git a/conductor.json b/conductor.json index 8dc2dbc695..ac7b82ac50 100644 --- a/conductor.json +++ b/conductor.json @@ -7,6 +7,6 @@ } ], "scripts": { - "setup": "git config core.hooksPath .husky && npm install && uv sync && open -a Docker && sleep 5 && docker compose up -d postgres && sleep 2 && DB_PORT=$(docker compose port postgres 5432 | cut -d: -f2) && APP_PORT=$((50000 + RANDOM % 10000)) && echo \"DATABASE_URL=postgresql://adcp:localdev@localhost:$DB_PORT/adcp_registry\" >> .env.local && echo \"DATABASE_SSL=false\" >> .env.local && echo \"CONDUCTOR_PORT=$APP_PORT\" >> .env.local && npm run db:migrate" + "setup": "git config core.hooksPath .husky && npm install && uv sync && open -a Docker && sleep 5 && docker compose up -d postgres && sleep 2 && DB_PORT=$(docker compose port postgres 5432 | cut -d: -f2) && APP_PORT=$((50000 + RANDOM % 10000)) && echo \"DATABASE_URL=postgresql://adcp:localdev@localhost:$DB_PORT/adcp_registry\" >> .env.local && echo \"DATABASE_SSL=false\" >> .env.local && echo \"CONDUCTOR_PORT=$APP_PORT\" >> .env.local && cat ../../.env >> .env.local && npm run db:migrate" } } diff --git a/server/public/dashboard.html b/server/public/dashboard.html index 54b77379b3..c9baed2ed3 100644 --- a/server/public/dashboard.html +++ b/server/public/dashboard.html @@ -12,57 +12,18 @@ background: #f5f5f5; min-height: 100vh; } - .header { - background: white; + .dashboard-toolbar { + background: #f9fafb; border-bottom: 1px solid #e0e0e0; - padding: 20px; - box-shadow: 0 2px 4px rgba(0,0,0,0.1); + padding: 10px 20px; } - .header-content { + .dashboard-toolbar-content { max-width: 1200px; margin: 0 auto; display: flex; - justify-content: space-between; + justify-content: flex-start; align-items: center; } - .logo { - font-size: 24px; - font-weight: 700; - color: #667eea; - } - .user-menu { - display: flex; - align-items: center; - gap: 20px; - } - .user-info { - color: #666; - } - .btn-admin { - padding: 8px 16px; - background: #667eea; - border: none; - border-radius: 6px; - cursor: pointer; - text-decoration: none; - color: white; - font-weight: 600; - } - .btn-admin:hover { - background: #5568d3; - } - .btn-logout { - padding: 8px 16px; - background: #f5f5f5; - border: none; - border-radius: 6px; - cursor: pointer; - text-decoration: none; - color: #333; - } - .btn-logout:hover { - background: #e0e0e0; - } .container { max-width: 1200px; margin: 40px auto; @@ -166,9 +127,9 @@ .btn-secondary:hover { background: #d0d0d0; } + /* Org Switcher */ .org-switcher { position: relative; - margin-right: 15px; } .org-switcher-btn { display: flex; @@ -176,94 +137,84 @@ gap: 8px; padding: 8px 12px; background: #f5f5f5; - border: 1px solid #ddd; + border: 1px solid #e0e0e0; border-radius: 6px; cursor: pointer; font-size: 14px; color: #333; + min-width: 180px; } .org-switcher-btn:hover { - background: #e0e0e0; + background: #e8e8e8; } - .org-switcher-icon { - font-size: 18px; - } - .org-switcher-name { - max-width: 200px; + .org-switcher-btn .org-name { + flex: 1; + text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } - .org-switcher-badge { - display: inline-block; - padding: 2px 6px; - border-radius: 8px; + .org-switcher-btn .arrow { font-size: 10px; - margin-left: 5px; + color: #666; } - .org-switcher-badge.personal { background: #e3f2fd; color: #1565c0; } - .org-switcher-badge.team { background: #e8f5e9; color: #2e7d32; } - .org-dropdown { + .org-switcher-dropdown { display: none; position: absolute; top: 100%; + left: 0; right: 0; margin-top: 4px; background: white; - border: 1px solid #ddd; - border-radius: 8px; + border: 1px solid #e0e0e0; + border-radius: 6px; box-shadow: 0 4px 12px rgba(0,0,0,0.15); - min-width: 280px; z-index: 100; + max-height: 300px; + overflow-y: auto; } - .org-dropdown.show { + .org-switcher-dropdown.show { display: block; } - .org-dropdown-item { - display: flex; - align-items: center; - justify-content: space-between; - padding: 12px 16px; + .org-switcher-item { + padding: 10px 12px; cursor: pointer; border-bottom: 1px solid #f0f0f0; } - .org-dropdown-item:last-child { + .org-switcher-item:last-child { border-bottom: none; } - .org-dropdown-item:hover { - background: #f9f9f9; + .org-switcher-item:hover { + background: #f5f5f5; } - .org-dropdown-item.active { - background: #f0f3ff; + .org-switcher-item.selected { + background: #e3f2fd; } - .org-dropdown-name { + .org-switcher-item .item-name { font-weight: 500; color: #333; } - .org-dropdown-role { - font-size: 12px; - color: #666; - } - .org-dropdown-header { - padding: 10px 16px; - font-size: 12px; - color: #666; - font-weight: 600; - text-transform: uppercase; - border-bottom: 1px solid #e0e0e0; - background: #fafafa; + .org-switcher-item .item-badge { + display: inline-block; + padding: 2px 6px; + font-size: 10px; + border-radius: 10px; + margin-left: 6px; } - .org-dropdown-footer { - padding: 12px 16px; - border-top: 1px solid #e0e0e0; + .org-switcher-item .item-badge.active { + background: #d1fae5; + color: #065f46; } - .org-dropdown-footer a { - color: #667eea; - text-decoration: none; - font-size: 14px; + .org-switcher-item .item-badge.inactive { + background: #f3f4f6; + color: #6b7280; } - .org-dropdown-footer a:hover { - text-decoration: underline; + + /* Responsive layout for dashboard */ + @media (max-width: 900px) { + .dashboard-grid { + grid-template-columns: 1fr !important; + } } @@ -285,53 +236,51 @@

⚠️ Agreement Update