Skip to content

v2.2.0 — multi-session web chat, signal markdown, oss cleanup, pdf polish

Pre-release
Pre-release

Choose a tag to compare

@mxzinke mxzinke released this 03 Jul 20:17
· 107 commits to master since this release
f17580e

Highlights

Multi-session web chat

  • Backend (PR #175) — New chat_sessions table holds session metadata (title, created/updated, archived). messages.session_key column threads conversations. Four new routes under /api/v1/chat/sessions (list/create/rename/delete). Existing chat APIs accept ?sessionKey=<key> and default to _default for backward compatibility. Auto-titles derive from the first 60 chars of the first user message; manual titles via PATCH win via COALESCE. Tests: 13 new web-ui cases, HTTP smoke against a live server, _default protected from deletion.
  • Sidebar UI (PR #176) — Two-column /chat layout with a 240px left sidebar listing all non-archived sessions. + New chat button creates a session and HX-Redirects to it. Inline rename (HTMX PATCH), archive, and delete actions. Active session highlighted with the brand purple left border; action buttons only visible on hover or for the active row. _default is 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-RPC textStyle field and the CLI --text-style fallback. 32 pytest cases including emoji positioning, snake_case preservation, lone-asterisk preservation, and multi-line markers.
  • PR #169\n and other escape sequences in signal send payloads now decode correctly instead of being rendered literally.

PDF skill refocus + Typst templates

  • PR #166 — Major refocus: the pdf skill is now creation-only (Typst + Cetz). Document parsing moved to document-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 is text(size: 42pt)[ #par(leading: 1.24em)[#title] ] (em resolves against the inner text size).
  • New AUTHORING.md cookbook for custom Typst templates; SKILL.md split by topic; references reorganised. Cetz-only charts (no PNG escape hatch).

OSS hygiene & DX

  • PR #167task CLI accepts both #NNN and NNN for goal/task IDs. Helper parseId() + 7 call sites + 4 new unit tests.
  • PR #168 — Remove /home/atlas/home/agent migration 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.

Stats

  • 35 commits since v2.1.0
  • 6 PRs merged (#166, #167, #168, #169, #174, #175, #176)
  • Web-ui tests: 52 → 75 (+23)
  • Trigger tests: 149 → 149 (no regress)