Tillagt
- The assistant's answers are rendered. It replies in Markdown, and the chat showed the markers verbatim ("4 st"). Headings, bullet and numbered lists, paragraphs, line breaks, bold, italic and inline code are now rendered as elements. Only the assistant's own messages are parsed — a colleague who types
3*4*5means3*4*5. - A last-view cache in
localStorage, per user: the conversation you left is on screen at the first paint instead of the inbox → an empty conversation → the messages, which is three states for two round trips. The network result then replaces it in place.
Ändrat
- The view follows the agent while it is still working: the typing indicator now scrolls the conversation the way an arriving message does, instead of catching up only once the answer lands.
- The message list, the channel list and the overlay panels have a thin, dimmed scrollbar of their own instead of the platform slab, in both themes.
- An underscore only opens emphasis between word boundaries, so
net_totalandwc_order_statssurvive the renderer intact, and a body over 20 000 characters is shown as it came rather than parsed. - A message the server has confirmed is cached as soon as it is stored, not at the next poll, so a reload in between cannot come back without it.
- A conversation restored from the cache keeps its own poll cursor, so a refresh that fails does not make the next poll re-fetch the history and append it under what is already on screen. A failed refresh over cached messages says so, rather than letting them read as current.
Säkerhet
- Nothing is cached when the client has no user id: a key that cannot name its owner would be shared between whoever uses that browser.
- The Markdown renderer builds DOM nodes and never assigns HTML, so a message body cannot introduce markup. A tag typed into a message stays visible text, exactly as before.
- The cache key names the site as well as the user: a subdirectory multisite serves every site from one browser origin and a network user keeps the same id across them, so the key alone decided whether site A's conversation was painted over site B. Pruning leaves another site's entry alone.
- The cache is bounded on every axis: one key per user and site (other users' and older versions' keys are removed on boot), 24 hours, the 30 most recent messages of one conversation, and a 48 KB ceiling above which the messages are dropped and then the whole entry. Leaving a conversation clears its messages from the cache, and a conversation that no longer exists falls back to the inbox.