From 7b8677db8962be14285e23cbcbb735bc509aa8d9 Mon Sep 17 00:00:00 2001 From: Brian O'Kelley Date: Tue, 28 Apr 2026 09:33:22 -0400 Subject: [PATCH] feat(brand-viewer): operated / authorized agent sections with empty states Brand viewer (/brand/view/) renders two new always-visible sections: "Agents this brand operates" (from /api/registry/operator) and "Agents authorized to sell this brand's inventory" (from /api/registry/publisher). Empty states explain what would populate each (member claim, adagents.json) so a viewer can distinguish "nothing set up" from "registry isn't surfacing it." Verified locally against 366.fr (both empty), mamamia.com.au (authorized populated via adagents.json), scope3.com (operated populated, member link to /members/scope3). Co-Authored-By: Claude Opus 4.7 (1M context) --- .changeset/brand-viewer-agent-sections.md | 4 + server/public/brand-viewer.html | 173 ++++++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 .changeset/brand-viewer-agent-sections.md diff --git a/.changeset/brand-viewer-agent-sections.md b/.changeset/brand-viewer-agent-sections.md new file mode 100644 index 0000000000..d665cd5f20 --- /dev/null +++ b/.changeset/brand-viewer-agent-sections.md @@ -0,0 +1,4 @@ +--- +--- + +Brand viewer (`/brand/view/`): show explicit "Agents this brand operates" and "Agents authorized to sell this brand's inventory" sections with empty states. Both sections always render, sourcing from `/api/registry/operator` and `/api/registry/publisher`. When empty, hint text explains what's missing (no member claim, no `adagents.json`, etc.) so a viewer can distinguish "nothing set up" from "registry isn't surfacing it." diff --git a/server/public/brand-viewer.html b/server/public/brand-viewer.html index 9e33311a0b..ea8fa42906 100644 --- a/server/public/brand-viewer.html +++ b/server/public/brand-viewer.html @@ -378,6 +378,69 @@ color: var(--color-text-heading); } + /* Agents list (operated / authorized) */ + .agents-list { + list-style: none; + margin: 0; + padding: 0; + } + .agents-list__item { + padding: var(--space-3) 0; + border-bottom: 1px solid var(--color-border); + } + .agents-list__item:last-child { + border-bottom: none; + } + .agents-list__name { + font-weight: var(--font-semibold); + color: var(--color-text-heading); + margin-bottom: var(--space-1); + } + .agents-list__url { + font-family: var(--font-mono); + font-size: var(--text-sm); + color: var(--color-text-secondary); + word-break: break-all; + } + .agents-list__url a { + color: var(--color-brand); + text-decoration: none; + } + .agents-list__type { + display: inline-block; + margin-top: var(--space-1); + padding: var(--space-0_5) var(--space-2); + background: var(--color-bg-subtle); + border-radius: var(--radius-full); + font-size: var(--text-xs); + color: var(--color-text-muted); + } + .agents-list__scope { + margin-top: var(--space-1); + font-size: var(--text-xs); + color: var(--color-text-muted); + } + + /* Empty state for agent sections */ + .empty-state { + padding: var(--space-2) 0; + } + .empty-state p { + margin: 0 0 var(--space-2) 0; + color: var(--color-text-secondary); + } + .empty-state__hint { + font-size: var(--text-sm); + color: var(--color-text-muted); + } + .empty-state code { + background: var(--color-bg-subtle); + padding: var(--space-0_5) var(--space-1); + border-radius: var(--radius-sm); + font-family: var(--font-mono); + font-size: var(--text-xs); + } + /* Properties table */ .properties-table { width: 100%; @@ -1380,6 +1443,28 @@

Edit brand details

+ +
+
+ 🤖 + Agents this brand operates +
+
+
Loading…
+
+
+ + +
+
+ 🔒 + Agents authorized to sell this brand's inventory +
+
+
Loading…
+
+
+