- Implement CustomMessages interface for type-safe message extension via declaration merging - Add MessageRenderer<T> with generic typing for custom message rendering - Add messageTransformer to Agent for filtering/transforming messages before LLM - Move message filtering from transports to Agent (separation of concerns) - Add message renderer registry with typed role support - Update web-ui example with SystemNotificationMessage demo - Add custom transformer that converts notifications to <system> tags - Add SessionListDialog onDelete callback for active session cleanup - Handle non-existent session IDs in URL (redirect to new session) - Update both web-ui example and browser extension with session fixes
29 lines
954 B
TypeScript
29 lines
954 B
TypeScript
import type { TemplateResult } from "lit";
|
|
import type { AppMessage } from "./Messages.js";
|
|
|
|
// Extract role type from AppMessage union
|
|
export type MessageRole = AppMessage["role"];
|
|
|
|
// Generic message renderer typed to specific message type
|
|
export interface MessageRenderer<TMessage extends AppMessage = AppMessage> {
|
|
render(message: TMessage): TemplateResult;
|
|
}
|
|
|
|
// Registry of custom message renderers by role
|
|
const messageRenderers = new Map<MessageRole, MessageRenderer<any>>();
|
|
|
|
export function registerMessageRenderer<TRole extends MessageRole>(
|
|
role: TRole,
|
|
renderer: MessageRenderer<Extract<AppMessage, { role: TRole }>>,
|
|
): void {
|
|
messageRenderers.set(role, renderer);
|
|
}
|
|
|
|
export function getMessageRenderer(role: MessageRole): MessageRenderer | undefined {
|
|
return messageRenderers.get(role);
|
|
}
|
|
|
|
export function renderMessage(message: AppMessage): TemplateResult | undefined {
|
|
return messageRenderers.get(message.role)?.render(message);
|
|
}
|