Reorder RSS list items: single-line title, tags, then date
Details
Title is now single-line with ellipsis truncation on overflow.
Layout order changed from title/date/tags to title/tags/date
for better scannability.
Show timestamp in article detail date display
Details
Date now shows "February 28, 2026 · 12:29 PM" instead of just
"February 28, 2026" in the article detail pane.
Add ProseMirror JSON-to-markdown normalization and strengthen slot descriptors
Details
NormalizeContentFromJson intercepts ProseMirror-style JSON documents
({"type": "doc", "content": [...]}) that the AI hallucinates instead
of markdown text, converting them back to markdown before block
parsing. Handles headings, paragraphs, bullet/ordered lists, code
blocks, blockquotes, tables, and horizontal rules via recursive node
tree extraction.
Intent slot descriptors for notes.create_note and notes.update_note
now explicitly warn against JSON document objects in the content slot.
10 new NUnit tests cover plain markdown passthrough, ProseMirror doc
conversion, tables, bullets, code blocks, mixed types, invalid JSON,
non-document JSON, empty strings, and deeply nested table cells.
Add bare JSON intent fallback and strengthen slot guidance
Details
ParseActionBlocks now falls back to ExtractBareIntentJson when no
[ACTION] wrapper tags are found, recovering intent JSON that the AI
emits without the required tags. The fallback only triggers when the
primary parser found nothing, preventing double-extraction.
ActionFormatHeader now explicitly warns against JSON document objects
in content/description text slots.
Visibility changes: ParseActionBlocks, ExtractBareIntentJson,
ParsedAction, and FlattenSlotValue are now internal (testable via
InternalsVisibleTo).
6 new xUnit tests cover bare JSON recovery, surrounding prose
stripping, non-intent JSON rejection, multiple intents, and
malformed JSON handling.
Add RFC 5005 pagination support for feed fetching
Details
Refactor FetchFeedAsync to follow rel="next" pagination links,
retrieving up to 20 pages of older entries during initial feed
import. This allows the RSS plugin to fetch the full history from
paginated feeds (like the PrivStack changelog) instead of only the
first page. RefreshFeedAsync is unchanged — it only needs the
latest page for new article detection.
Get notified about new releases