You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[FEATURE] Let an app extension replace a chat message part rendererΒ #2894
Let an app extension replace the component that renders a chat message part, keyed by part kind.
β Problem Statement / Motivation
ChatMessageItem picks its component with a hardcoded ternary on part.dataKind (ChatMessageItem.tsx#L116). #2890 adds structured_output as a third branch. Every new part kind adds another.
The app extension system cannot reach it. All 13 points in EXTENSION_POINT_IDS are additive β ExtensionSlot mounts a component alongside the core one, never instead of it. Three of them sit in chat; none reaches part rendering.
So an extension that wants its own JSON viewer, its own tool-call card, or a domain renderer for an otherwise unknown payload has to fork ChatMessageItem.
π‘ Proposed Solution
Mirror providerIcons (types.ts#L298): a map keyed by a string, merged over the core map, later extension wins, unknown key simply added.
/** Replacement renderers for chat message parts, keyed by ChatDataPart["dataKind"]. */
chatPartRenderers?: Readonly<Partial<Record<ChatDataPart["dataKind"],ComponentType<{part: ChatDataPart}>>>>;
ChatMessageItem looks the kind up and falls back to the core component. That removes the ternary rather than growing it, and covers tool_call, tool_result, structured_output and unknown at once.
Open questions:
Key on ChatPart["kind"] as well, so text and approval records are replaceable?
Does a renderer need turn context (taskId, sessionId), the way app_agents_agentChat_agentChatMessage_additionalActionsButton does?
π Alternatives Considered
A new additive slot per part kind. Wrong shape β the core card still renders, so the reader sees two.
shell region replacement. Too coarse; it replaces navigation regions, not a leaf component.
π― Affected Service(s)
UI Service
π Additional Context
Prompted by #2890, which hardcodes StructuredOutputCard into that ternary. Best done after it merges, so the change has something to replace.
Activity
feat(ui): let app extensions replace chat part renderers (kagent-dev#β¦
feat(ui): let app extensions replace chat part renderers (kagent-dev#β¦