Contribution kind: surface-kind. Ingestion: biome-host parser (SurfaceKindParser).

A surface is what the agent opens in a preview tab. A biome contributes its own render kind so its frontend can register a renderer for it. The catalogue namespaces the declared slug to <biomeId>:<kind>, so a biome can never claim a bare first-party kind. Provenance is stamped by the ingestion pipeline, not declared inline.

This shape is structurally identical to a widget-kind contribution on purpose: the in-chat widget plane and the render plane share one contribution shape, one frontend registry core, and one renderer fallback chain.

manifest

FieldTypeRequiredNotes
kindstringyesmax 100 chars; pattern /^[a-z][a-z0-9-]*$/
versionnumberyesinteger; > 0
displayNamestringyesmax 200 chars
summarystringyesmax 1000 chars
payloadSchemamap<string, unknown (free-form JSON)>yes—

First-party kinds (closed set)

These slugs are reserved by the frontend registry. A biome kind is always namespaced, so contributing one of these bare names is impossible by construction.

Kind
urlSurfaceKind.Url
webSurfaceKind.Web
htmlSurfaceKind.Html
markdownSurfaceKind.Markdown
codeSurfaceKind.Code
diffSurfaceKind.Diff
jsonSurfaceKind.Json
tableSurfaceKind.Table
chartSurfaceKind.Chart
pdfSurfaceKind.Pdf
imageSurfaceKind.Image
mediaSurfaceKind.Media
objectSurfaceKind.Object
biome-routeSurfaceKind.BiomeRoute
formSurfaceKind.Form
appSurfaceKind.App
filesSurfaceKind.Files
graphSurfaceKind.Graph

18 first-party kinds. Adding one is a kernel enum member plus a renderer registered into the frontend registry's closed set — not a contribution.

Provenance

A catalogue entry declares where it came from:

  • first-party (SurfaceKindSource.FirstParty)
  • biome (SurfaceKindSource.Biome)