v2.2.0 — multi-session web chat, signal markdown, oss cleanup, pdf polish
Pre-release
Pre-release
Highlights
Multi-session web chat
- Backend (PR #175) — New
chat_sessionstable holds session metadata (title, created/updated, archived).messages.session_keycolumn threads conversations. Four new routes under/api/v1/chat/sessions(list/create/rename/delete). Existing chat APIs accept?sessionKey=<key>and default to_defaultfor backward compatibility. Auto-titles derive from the first 60 chars of the first user message; manual titles viaPATCHwin viaCOALESCE. Tests: 13 new web-ui cases, HTTP smoke against a live server, _default protected from deletion. - Sidebar UI (PR #176) — Two-column
/chatlayout with a 240px left sidebar listing all non-archived sessions. + New chat button creates a session andHX-Redirects to it. Inline rename (HTMXPATCH), archive, and delete actions. Active session highlighted with the brand purple left border; action buttons only visible on hover or for the active row._defaultis always present and never archivable/deletable. URL convention:/chat?session=<key>is human-facing,?sessionKey=<key>is the API style — the page handler accepts both. XSS escaping on user-provided titles, path-injection guards on session keys. 23 new tests.
Signal Markdown formatting
- PR #174 — Convert Markdown (
**bold**,*italic*,~~strike~~,`code`) into Signal's native position-based text styles.markdown_to_signal_styles(text)returns(plain, ["start:length:STYLE", …])with UTF-16 code-unit positions (Signal's requirement —😀counts as 2 units). Wired into both the JSON-RPCtextStylefield and the CLI--text-stylefallback. 32 pytest cases including emoji positioning, snake_case preservation, lone-asterisk preservation, and multi-line markers. - PR #169 —
\nand other escape sequences insignal sendpayloads now decode correctly instead of being rendered literally.
PDF skill refocus + Typst templates
- PR #166 — Major refocus: the
pdfskill is now creation-only (Typst + Cetz). Document parsing moved todocument-parse. Ships four production-ready templates (report.typ,invoice.typ,letter.typ,memo.typ) with a theme system (Forest, Ocean, Slate, Light), full i18n (de/en/fr) with locale-aware date/number formatting, §14 UStG-conform invoice with ZUGFeRD/Factur-X helper, multi-page-safe layouts. Cover-title typography iterated with Max — final pattern istext(size: 42pt)[ #par(leading: 1.24em)[#title] ](em resolves against the inner text size). - New
AUTHORING.mdcookbook for custom Typst templates; SKILL.md split by topic; references reorganised. Cetz-only charts (no PNG escape hatch).
OSS hygiene & DX
- PR #167 —
taskCLI accepts both#NNNandNNNfor goal/task IDs. HelperparseId()+ 7 call sites + 4 new unit tests. - PR #168 — Remove
/home/atlas→/home/agentmigration aids (Dockerfile symlink, init.sh self-heal scan, Phase-12 self-heal trigger, Claude Code projects-dir merge). 9 doc/code refs cleaned up. Closes #46. - All public-facing docs and release notes scrubbed of internal references.
Upgrade notes
- Multi-session migration is automatic: existing chats keep working under
_default. No manual data move required. - PDF templates have a few new mandatory tokens in custom themes (fonts + backgrounds). Existing theme overrides keep working; new tokens fall back to sensible defaults.