Telemetry off
Documentation

Documentation

32. v0.16.0 — AI assistant: thinking, search, and voice

Created
Sep 20, 2026
Updated
Sep 20, 2026

Release candidate prepared 2026-09-20. This release gives the AI assistant the capabilities its providers already had but the app never exposed: visible reasoning, web search, a code sandbox, image generation, and voice input. Underneath, all five providers now run the same agent loop in your browser, which is what lets every one of them use every chart tool. Follows v0.15.0.

Added

  • Think control. A Think button in the composer sets how much reasoning effort the model spends, from off to high. Where a provider streams a summary of its thinking, it appears as a Thinking row above the reply. Support and level names differ per provider; the control only offers what the selected model accepts.
  • Web search. Toggle Search the web in the composer's + menu and the model answers from live results using its own provider-side search, with the cited sources listed under the reply and a source count in the activity row. If a provider declines the tool for the selected model, the reply says so rather than failing silently.
  • Code execution. Toggle Run code and the model can run code in its provider's own sandbox. The support matrix is deliberately narrow because the alternatives break other things: Claude needs 4.5 or newer, Gemini needs 3 or newer, and Claude on Vertex and every model on Bedrock have no sandbox.
  • Image generation. Toggle Generate images and pick an image model, and the assistant can draw. Available on OpenAI, Google, Vertex, and Bedrock; Anthropic-direct has no image model. Generated pictures are held for the life of the tab and are not saved: after a reload the reply shows a "not kept" placeholder instead of a broken image. This matches how attachments already behave, because browser storage is a few megabytes and one 1024px image is a large fraction of it.
  • Dictation. A microphone button between Think and Send transcribes speech into the composer using your browser's own speech recognition. Cmd/Ctrl+Shift+Space toggles it; Escape, typing, or sending stops it; closing the drawer releases the microphone. While dictating, the hint line becomes a status line with a microphone picker, because the browser's default input is often not the one you are speaking into.
  • Activity list. Tool calls now appear above the reply they produced, while they run rather than only once finished: a label, the argument, and the outcome, with a spinner on work still in flight. It collapses to a one-line summary and survives the end of the turn, so you can still see what a finished answer was based on.
  • Provider and model quick pickers. The composer footer now carries the active provider and model, both switchable without opening settings. Every provider is listed, with the ones missing a key marked rather than hidden, and the model picker has a filter box. Switching provider returns to the model you last used with it.
  • Math and coloured text in replies. Formulas now render: $x^2$, $$…$$, and the \(…\) / \[…\] delimiters models more often emit. Replies that colour a number with inline HTML — a green profit, a red loss — render that colour instead of showing the tags.

Changed

  • One agent loop, in the browser, for every provider. Bedrock and Vertex previously ran their own loop on the server against a sanitized snapshot of your chart. Their routes now answer a single round at a time and the browser drives the loop, so all five providers execute tools in one place against live state. This is what lets Bedrock and Vertex use capture_chart_image, which has no snapshot form, and it removes a server-side sanitizing layer that had to be kept in sync by hand. The cost is one HTTP round trip per tool round instead of one per turn.
  • Dollar amounts are not treated as formulas. Math rendering pairs dollar signs, which in a trading reply would turn "Winner +$33.30 … Loser -$29.60" into one broken formula. Figures that end cleanly, and cashtags like $AAPL, are left as text, while $2x + 1$ and $2\pi r$ still render. Code is never rewritten, so $PATH survives.

Fixed

  • Bedrock and Vertex chat was returning a 500 on every request. Two shared modules were marked client-only while the proxy routes imported them, so a server-side call into them threw Attempted to call isPortableReasoning() from the server. Both providers had been broken since the Think control landed. A new test walks the real import graph from all eight AI route handlers and fails on any client-only module inside it, so this cannot regress silently.
  • Web search failed on Google with "Request contains an invalid argument." The loop was answering Gemini's own grounding call with a fabricated result, which Google rejects — the result of a provider-run tool comes from the provider. Provider-executed calls are now identified by the SDK's own flag rather than by a list of names, and a call without a real result is never answered.
  • The assistant read and cleared the note app's saved settings. Two preferences fell back to notes:-prefixed storage keys. On a shared development origin that meant inheriting another app's settings and deleting them when the toggle was turned off.
  • Generated images never displayed. Any URL scheme outside http, https, mailto, and tel was blanked before the renderer saw it, so every generated image lost its source.
  • The chat drawer header overflowed when resized narrow. The conversation picker was sized as a share of the viewport rather than of the drawer, so it kept its full width however narrow the drawer was dragged and pushed the title off the left edge.

Verification

  • The complete automated suite (388 files / 3,326 tests), TypeScript, the zero-warning ESLint baseline, and the optimized production build (126/126 static pages) passed during release preparation.
  • New regressions cover the unified agent loop and round replay, provider-executed tool detection, the reasoning/web-search/code-execution/image-generation support matrices and their stream parsing, the tool-activity model, dictation session handling, composer layout, the server import-graph guard, and reply rendering (math delimiters, the money heuristic, HTML sanitization, and the image scheme).
  • Verified in a running workspace against Google: live web search with its citations, the activity list expanding over a turn that read the drawings and searched, the Think row, dictation reaching "Listening…" with a working microphone picker, the footer pickers switching provider and model, math and coloured figures rendering in a reply, and the drawer header fitting at its 320px minimum.

Next steps

Set up a provider and try the new controls: Chatting With Your Chart.

Next: Release Notes