Skip to content

Visualizations

The assistant never dumps raw data as text. When you ask a question that returns structured results, you see interactive tables, charts, maps, or relationship graphs — inline in the conversation. You can also request specific visualizations, and save any of them to the workspace.

Tables

Tables are the default for any structured result with three or more rows. They're sortable (click any column header) and use smart formatting:

Format When it's used Example
Number Counts, quantities 1,234 or 1.2K (compact)
Currency Money values €12,500.00
Percent Rates, proportions 73.2%
Delta Changes +12.5 (green) / −3.2 (red)
Date Timestamps "2 days ago" or "March 15, 2024"
Badge Categories Colored pills
Status States Dot + label
Link URLs Clickable underlined text

"Show me all operators with more than 10 incidents." (assistant shows a sortable table with operator name, incident count, fleet size)

Charts

Two chart types for different purposes:

  • Bar charts for categorical comparisons — "incidents by aircraft type", "budget allocation by project"
  • Line charts for trends over time — "monthly incident count", "risk score over quarters"

The assistant chooses the right type based on your data, or you can request a specific format:

"Plot that as a bar chart." "Show me the trend over time."

Charts use a consistent color palette that matches the workbench theme. Multiple series render with a legend automatically.

Maps

Maps render geographic data as an interactive Leaflet map with markers, routes, and optional clustering.

"Show the locations of all incidents involving engine failure." "Map the inspection routes for the northern region."

The assistant builds the map in two steps: generating the layout, then geocoding each address (you see them resolve one by one). Maps support:

  • Markers with labels, descriptions, and custom icons
  • Routes as polylines with configurable style
  • Clustering for dense marker sets
  • Viewport control — auto-fit to bounds or pin to a specific center

Relationship Graphs

Interactive force-directed graphs for visualizing entity networks.

"Show me the relationship network around Operator X." "Build a graph of the financial connections between these entities."

Nodes are colored by type (consistent across the entire workbench), draggable, and clickable for detail. The assistant can build graphs from knowledge graph data or from instructions you give it.

Asking for Visualizations

The assistant follows these rules:

  • Three or more structured results → automatically shown as a table
  • Geographic data → the assistant offers to build a map (asks first)
  • Countable patterns → the assistant offers a chart (asks first)
  • Explicit request → the assistant builds whatever you ask for directly

If you want a visualization the assistant didn't offer, just ask:

"Can you show that as a chart?" "Put those on a map." "Build a relationship graph from those results."

Saving Visualizations

Any visualization can be saved to the workspace:

"Save that table as incidents.csv" "Save the map to the Analysis folder" "Save the graph as network.graph"

Maps save as .map files and graphs as .graph files — both are reloadable. Open them later:

"Open the network.graph file I saved earlier."

Tables save as CSV files.

Under the Hood

How tool cards work

Every visualization is backed by a typed MCP tool (show_table, show_chart, map_build, graph_build). The chat runtime streams the tool call to the client, which matches it to a registered component by name and renders it inline. Long-running tools (maps, graphs) dispatch progress events that update the card in real time.

This follows ADR-012 (assistant-ui + tool-ui): every tool the analyst can see must have a typed schema and a matching UI component. No raw JSON ever appears in the conversation.

Map builder

map_build takes a natural-language instruction plus optional context and raw data. It generates a MapJSON structure (markers and routes with addresses), then geocodes each address using a SQLite-backed cache. Failed geocoding produces a "no locations could be geocoded" message, not an error.

show_map is a separate tool for reloading saved .map files — it doesn't build new maps.

Graph builder

graph_build generates entities and relationships conforming to a specified ontology. Three stages: resolve schema → build graph (LLM) → validate against ontology. Every entity needs id, type, name; every relationship needs id, type, source, target.

Companion tools: graph_get_schema(ontology) lists valid types, graph_validate(graph_data, ontology) reports validation issues.

Table column formats (full reference)

The show_table tool accepts column format configs:

  • number — locale-aware with decimals, optional compact notation and unit
  • currency — ISO currency code
  • percent — with optional basis: "fraction" for 0-1 inputs
  • delta — signed with color; flip direction with upIsPositive: false
  • date — supports relative, long, or locale default
  • boolean — checkmark/cross or custom labels
  • link — with hrefKey and optional external: true
  • badge — pill with configurable colorMap
  • status — dot + label with statusMap
  • array — comma-joined with maxVisible truncation

Learn More