Material3AguiComponents

The slot table agui-compose draws through, filled in with Material 3.

agui-compose's defaults draw structure and nothing else -- no colour, no spacing, no shape -- because that module sits below any design system. This is the table that makes the same transcript look like an application.

It is a table rather than a set of composables, so overriding is the mechanism that already exists: copy one slot and inherit the rest.

val components = remember {
Material3AguiComponents().copy(toolCall = { part, modifier -> MyToolCallCard(part, modifier) })
}

The same instance every call. LocalAguiComponents is static, so providing a value the composition has not seen before restyles everything under it with skipping disabled -- and the usual way to do that by accident is to build the table inside the provides. Returning a singleton removes that hazard from this call; it does not remove it from a copy whose slot lambda captures, which is still a new value on every recomposition and still wants a remember.

AguiComponents.text is not overridden. The default already draws through LocalAguiTextRenderer, and ProvideMaterial3Agui puts Material3AguiTextRenderer there, so prose picks up Material 3's type and colour without this table naming Text at all. That is what keeps the Markdown seam open: an application that provides its own renderer keeps every slot here, because none of them draw prose themselves.

See also