summaryrefslogtreecommitdiff
path: root/CHANGELOG.md
blob: d0f231b147718b2dfbcca5a49ee893ee79ef880a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# Changelog

All notable changes to the WebX11 Chat Widget are recorded here.

## 1.0.1 — 2026-11-09

Security and mobile fixes found by a review that rendered hostile model output in Chromium.

- **Critical: attribute injection in linkified replies.** `escapeHtml()` escaped `& < >` by
  round-tripping through `textContent`, which does not escape a double quote — so a reply containing
  `https://x.test/"onclick="alert(1)//` produced a real `<a onclick=…>` and fired `alert(1)` when
  clicked. Escaping now covers `"` and `'` as well. Proven both ways: the 1.0.0 file fired a dialog,
  this one renders only `href/target/rel` and stays silent.
- **The launcher covered the Send button at 390 px**, making the widget unusable on a phone (the
  click was intercepted by the 56 px bubble). The launcher is now hidden while the panel is open.
- Requests get an idle timeout (`idleTimeoutMs`, default 60 s, re-armed on every chunk) so a gateway
  that accepts and never answers cannot leave the input disabled forever.
- An empty stream or an HTML error page returned with status 200 now shows an error line instead of
  an empty bubble; a JSON body without stream framing is accepted as a whole reply.
- Closing the panel restores the host page's own `body` overflow value instead of clearing it.
- Accessibility: `aria-expanded` / `aria-controls` on the launcher, focus returns to it on Escape,
  the demo page no longer blocks zoom (`user-scalable=no` removed).

## 1.0.0 — 2026-11-09

First packaged release.

- Standalone `src/widget.html`: bubble, popup/fullscreen panel, streaming
  answers, quick-reply chips, clickable links / e-mail / phone detection,
  XSS-safe rendering (user input escaped, model output escaped before
  formatting), reduced-motion and keyboard/Escape support.
- External configuration via `config.js`; every option has a documented
  default in `src/config.example.js`.
- `accentColor` theming with automatic readable text colour.
- Optional system-prompt URL (`promptUrl` + `promptVersion`) with inline
  `systemPrompt` fallback.
- Robust NDJSON stream reader (buffers partial lines across chunks).
- No hardcoded host, no bundled credentials, no third-party assets.
- Docs: README, usage guide with CORS troubleshooting, commercial license.