12 of 33 MCP tools now render as rich inline cards instead of raw JSON: EntityCard, HealthSummary, LXCList, EntityTable, KnowledgeResults, BlastRadius, ChangeLog, FleetSnapshot, MetricChart. Architecture: - Server: annotateJSONResult() wraps queryRows with __renderer hints - Registry: match/dispatch system maps tool names to Svelte components - Chat: inline dispatch with 5-card limit, overflow to collapsed group - ToolCallGroup: unmatched prop, hides when all matched, ARIA labels Tests: 3 new Go tests for annotateJSONResult (wrap, no-op, multi-row).
18 lines
467 B
TypeScript
18 lines
467 B
TypeScript
import type { Component } from 'svelte'
|
|
import type { ToolCallResult } from '$lib/stores/chat'
|
|
|
|
export interface ToolRenderer {
|
|
match: (tool: ToolCallResult) => boolean
|
|
component: Component<{ tool: ToolCallResult }>
|
|
}
|
|
|
|
const registry: ToolRenderer[] = []
|
|
|
|
export function registerToolRenderer(r: ToolRenderer) {
|
|
registry.push(r)
|
|
}
|
|
|
|
export function getToolRenderer(tool: ToolCallResult): ToolRenderer | undefined {
|
|
return registry.find((r) => r.match(tool))
|
|
}
|