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.
Fix article vanishing from Unread filter when selected
Details
When viewing articles in the Unread filter, clicking an article would
mark it as read, which immediately failed the Unread filter match,
causing ReplaceArticleInPlace to remove it from FilteredArticles and
clear SelectedArticle — so the user never got to read it.
Now checks whether the article is the currently selected one before
deciding to remove it. Selected articles stay visible in the list
even if they no longer match the active filter, letting the user
finish reading. The article is removed naturally when the list
reloads on next filter change or navigation.
Same fix applies to toggling starred in the Starred filter view.
Align RSS styling with Tasks plugin conventions
Details
Article list items now use the same styling patterns as the Tasks
plugin: item-card class with ThemeRadiusMd corner radius, 10,8 padding,
and selected-state styles (ThemeHoverBrush background + subtle shadow)
matching the ListBox.sidebar ListBoxItem:selected pattern.
Category tags in both the list items and detail view now use
ThemeHoverBrush background with ThemeSecondaryBrush foreground and
ThemeRadiusXs corners — identical to how task tags are rendered.
Replaced all hardcoded CornerRadius="12" and CornerRadius="6" values
with ThemeRadiusMd dynamic resource for consistency across sidebar
feed buttons, empty state, summary box, and reader error panel.
Fix summary dedup not catching truncated summaries
Details
HasDistinctSummary was comparing the full summary (including trailing
"...") against the content via StartsWith. Since the content doesn't
contain "..." at the truncation point, the match always failed and
the redundant preamble kept showing.
Now strips trailing "..." from the summary before the prefix comparison.
Get notified about new releases