Special code blocks
A reference for the rich blocks the AI emits in chat. Each block is a fenced code block whose language tag triggers a specialized renderer instead of plain syntax-highlighted code.
You almost never write these yourself; the AI produces them and Strata renders them. Understanding them helps you steer prompts ("show me a comparison", "give me a timeline") and read what the AI did.
How blocks behave
Three rules apply to every rich block:
- Blocks render as a separate component, not inline text. The user never sees the raw JSON or fenced source — the renderer lifts the block out and replaces it with the rendered UI.
- Blocks are the last thing in a response. The AI is instructed to write its prose first, then the block, then stop. Text after a block creates a visible gap.
suggestionsis a special case — it does not render inline at the end of the response. When the most recent AI reply carries asuggestionsblock, the follow-up cards surface in a panel that expands above the prompt input when you focus it. Suggestions are optional, so a short factual answer often has none.
If you ever do see raw block source in a response (a literal `chart followed by JSON), that is a rendering bug — refresh the conversation and let the AI re-stream.
Visual blocks
chart
Interactive Chart.js chart inside the message bubble.
- When the AI uses it: the user asks for a chart, graph, plot, or visualization, or returned data is comparative or aggregated.
- Supported types: bar, line, pie, doughnut, scatter, radar, and similar Chart.js-native types.
- Use an Analysis-generated image instead when: the user wants a heatmap, custom multi-panel layout, infographic, statistical plot (box, violin, regression), or explicitly asks for an image or PNG.
comparison
Paired or grouped data cards showing side-by-side metrics.
- When the AI uses it: prompts containing "compare", "vs", "side by side", or when comparing two or more entities by parallel metrics.
progress
Horizontal progress bars annotated with percentages or status labels.
- When the AI uses it: prompts about completion, payment status, milestones, or any numeric series that maps to "percent done".
timeline
Chronological event display with dates, labels, and short descriptions.
- When the AI uses it: sequences of events over time — incident histories, deal stages, project milestones, account activity.
correlation
Correlation matrix heatmap between numeric columns.
- When the AI uses it: explicit correlation requests, or whenever the AI is showing the relationship strength between three or more numeric variables. Heatmaps that are not correlation matrices use Analysis-generated images instead.
Email draft card with To, Cc, Bcc, Subject, and a rich HTML Body.
- When the AI uses it: any time the AI drafts an email for you to review before sending. After you confirm with phrases like "send it", the AI calls the
send_emailtool — it never sends from the draft card on its own. - Tone variants: when you do not specify a tone, the AI includes a
tonesarray on the sameemailblock (Friendly, Professional, Brief & direct). The card lets you flip between them; the top-level body is the Professional default. - Handing the draft to Outlook: the card's primary button hands the draft off so you can finish and send it outside Strata, and its label depends on the draft. Open in Mail passes recipients, subject, and body to your default mail client — on a machine with the Outlook desktop app that opens a native compose window. Draft in Outlook Web appears instead whenever the draft declares attachments, which a
mailto:handoff cannot carry, and opens an Outlook on the web compose window. View in Outlook Web appears once the draft has been saved to your Outlook drafts folder, and opens that saved draft.
map
Interactive Mapbox GL map (Mapbox vector styles with 3D buildings and theme-matched light/dark lighting) with markers. If no Mapbox token is configured or Mapbox fails to load, Strata silently falls back to a Leaflet map with CartoDB/OpenStreetMap raster tiles so a map always renders.
- When the AI uses it: geographic prompts — "show on a map", "where are our X", "plot locations of", or whenever returned data has lat/lng columns or addresses.
- Marker style: all markers render as identical gold pins. The AI may specify a
colorfield per point ("red","green","blue","orange","gray"), but the renderer ignores it and displays gold for every marker. - Source data: the AI emits the block directly if lat/lng exist; otherwise it calls the
geocode_addressestool first (up to 50 addresses per call) and uses the returned coordinates.
places
Detail cards for real venues — name, category, address, phone, website, rating, an open/closed state derived from the venue's opening hours, and where available a photograph with its contributor credit. Up to 10 places per block.
- When the AI uses it: destination and venue questions — where to go, what a named business is, contact details for a list of places. It pairs with a
mapblock rather than replacing it: the map answers "where", the places block answers "what is it and how do I reach it". If only dots are needed, the AI emits the map alone. - Source data: every field except the AI's one-line
noteis copied verbatim from asearch_placestool result. The AI is instructed never to hand-write a places block from memory, and never to invent a rating — an address or phone number that was "tidied up" is one that no longer works. - Ratings:
search_placesreturns no rating unless the AI asks for venue detail, so ranking questions ("best coffee near the office") trigger the detailed call. Photographs come with the same call. - Coordinate join: when the same venue appears in both a
placesand amapblock, the coordinates must match exactly. That match is what turns a map pin into a full detail panel with imagery, hours and contact actions; a rounded copy silently degrades the pin to a bare label. - Rating pins: a map accompanying rated places can set
"markerStyle": "rating", which draws each pin as its score badge instead of a teardrop.
html
Sanitized custom inline HTML.
- When the AI uses it: rarely, only when a layout does not fit any other block and the AI needs a bespoke mini-UI (a tab nav, a styled badge group, a small status pill row).
- Sanitization:
<script>,<iframe>,<object>,<embed>,<form>, form controls (<input>,<textarea>,<select>),<meta>,<link>,<base>, and event-handler attributes are stripped. Inline styles, classes, semantic tags, buttons, tables, and SVG are allowed.
Jira blocks
Seven blocks render Jira data, and they replace the markdown tables the AI used to write. A markdown table throws away the status category, the assignee's profile picture and the fact that every issue key is a link; these keep all three. One renderer serves both web chat and the Outlook task pane, so they look identical in each.
The AI emits one Jira block per answer — a board and a table and a workload chart for the same question is noise. Every value comes from a tool result: the AI is instructed never to invent an issue key, a status or a count, and never to construct an Atlassian URL. Blocks are capped at 30 issues (12 per board lane) with a total field carrying the real number so the UI can say "+N more" honestly.
| Block | What it renders | When the AI reaches for it |
|---|---|---|
jira-issues | A dense issue table — key, summary, status, assignee, priority, last updated | The default for any list of issues |
jira-issue | One issue in full — description, labels, story points, recent comments, an Open in Jira link, and (where writes are enabled) Comment and Change status buttons | Detail on a single key, after a search |
jira-board | Status lanes, grouped by status category | The question is about flow — where work sits, not what exists |
jira-queues | Jira Service Management queues with their exact counts and breach counts | Service-desk questions. Queue counts are exact and passed through unchanged |
jira-sprint | Sprint health — committed vs completed, days left, and a burndown that marks the days scope moved | Sprint status. Scope changes are called out because a plain burndown hides them |
jira-sla | An SLA countdown strip sorted by time-to-breach, with already-breached targets shown as "N over" | JSM only — "what is about to breach" |
jira-workload | Issue counts per assignee, split to-do / in-progress / done | Who is loaded and who is idle. Counts are issues, not story points |
- Profile pictures: the tools return an Atlassian
accountIdalongside each display name, and passing it through is what renders the person's real Jira avatar. Where it is absent, initials are used instead. - Write controls:
jira-issueonly shows comment and transition buttons when the tool result confirms your organization allows writes. On a Jira Service Management request the card says so explicitly, because any comment Strata posts there is an internal note, never visible to the customer who raised the request.
Export blocks and tool-generated files
excel
Styled Excel workbook produced server-side by the generate_excel tool.
- What you see: a download chip at the bottom of the response. Clicking downloads the workbook.
- Reuse: the same
fileIdcan be passed tosave_to_onedriveand to email attachments, guaranteeing the same styled file is used everywhere. - Older inline form: a fenced
`excelJSON block that the client-side engine renders into a downloadable workbook. Both produce identical output.
PDF report produced server-side via pdfkit.
- What you see: a download chip at the bottom of the response.
- Layout: the spec controls page size, cover, sections, embedded charts, and tables.
word
Word document (.docx) produced by the generate_docx tool.
- When the AI uses it: prompts mentioning "Word document", "docx", "memo", or "proposal".
powerpoint
PowerPoint presentation (.pptx) produced by the generate_pptx tool.
markdown
Markdown file produced by the generate_md tool.
SQL blocks
sql
Syntax-highlighted SQL.
- When the AI uses it: the AI inlines a
sqlblock any time it ran a query and is showing you the SQL it executed. In Simple mode, SQL is hidden — the AI never emits this block. - Latest-edit display: when you ask the AI to fix or modify a query, the artifact panel opens on the right and the inline
sqlblock shows the most recently edited version.
sql-result
Expandable panel for query results.
- What you see: a collapsed row summarizing rows returned and elapsed time. Expand to inspect the result set.
Helper blocks
suggestions
Follow-up question cards tied to the most recent AI reply, surfaced in a panel that expands above the prompt input when you focus it (they are not rendered inline at the end of the message).
- Optional, not reflexive: the AI emits this block only when it can see genuine, specific next steps that flow from your prompt and its answer. Short factual replies, greetings, definitions, an MCQ disambiguation, and email confirmations get no suggestions.
- Count: when present, the block carries exactly 3 cards.
- Click behavior: clicking a suggestion sends it as your next message.
mcq
Disambiguation form for clarification questions.
- When the AI uses it: rarely — only when it genuinely cannot proceed without a clarification. The MCQ block supports up to 3 questions with up to 4 options each; types are
single(radio),multi(checkbox), orrank(drag to reorder). Asinglequestion can carry an "Or add your own" affordance viaallowOther, letting you type a free-text answer instead of picking an option. - Style preferences are not MCQ. For email tone preferences the AI uses the tone variants inside the
emailblock, not an MCQ.
Silent blocks
These blocks render to nothing — they are stripped before display and processed silently.
memory_update
The AI's mechanism for recording a fact to your personal or per-database memory.
- Personal memory:
{"action": "add", "scope": "user", "entries": [...]} - Per-database (connection-scoped) memory:
{"action": "add", "scope": "connection", "entries": [...]} - The block is stripped from the rendered output. To see and manage your memory, open Settings -> Capabilities.
callout (silent variant)
Some blocks tagged callout are emitted internally and stripped before rendering. The visible callout cards you see in chat use the inline blockquote syntax — see Callout reference.
navigate
A leftover block type that the main chat never acts on — Strata never navigates you between pages from a chat response. If a model ever emits one, it is stripped silently and nothing happens. (The separate support assistant can move you to a page, but it does so through its own mechanism, not this block.)
Why a block did not render
Most "raw block in response" reports trace to one of:
- The AI streamed an opening fence but the response was cut off (network drop, stop button, model timeout). Sending a follow-up like
Re-render the chart from the last responseusually fixes it. - The model emitted text after the block. The frontend strips known block bodies but text after the closing fence may render alongside an empty block.
- The block content was invalid JSON. Strata logs the parse error to the browser console and shows the raw block; ask the AI to regenerate.