Fix RecurrencePattern deserialization crash for missing type discriminator
Details
Task #3 had a recurrence.pattern JSON object without a "type" field,
causing NotSupportedException with [JsonPolymorphic]. Replaced the
attribute-based approach with a custom RecurrencePatternConverter that
handles missing/unknown discriminators gracefully (defaults to daily).
This matches the pattern already used by RecurrenceEnd and is resilient
to data written by older versions or external sync sources.
Also added RustWeekdayConverter.TryParse for use by the converter.
Tasks v1.26.0: right-click context menus and AI feedback
Details
Add right-click context menus to task items across all views (List,
Kanban, GTD Timeline, Calendar Timeline) with: Edit, Start Work, Mark
Complete/Reopen, Start/Stop Timer, Duplicate, Archive, Delete. Updated
the "..." button flyout to include the same expanded set of actions.
Added DuplicateTaskByItem and StartTaskByItem commands that accept a
TaskItem parameter for use from context menu bindings (the existing
DuplicateTask/StartTask operate on SelectedTask only).
Added StatusMessage feedback to AI Title and AI Rewrite commands so
failures are surfaced to the user instead of failing silently.
Remove artificial token limits and sentence truncation for cloud models
Details
Cloud models use the user's own API key — they should speak freely.
The tier-based token ceilings (1024/4096/8192) and sentence-count
truncation were designed for local models that can't self-regulate.
Changes:
- CloudMaxTokensFor now returns a flat 16384 regardless of tier
- Sanitize() accepts isCloud flag: skips sentence truncation and
markdown stripping for cloud responses
- Local model path unchanged (still gets tight limits + cleanup)
Bump memory extractor MaxTokens from 256 to 512
Details
Gemini 2.5 Pro tends to be verbose in its JSON responses, causing
truncation at 256 tokens which breaks JSON parsing. 512 gives enough
headroom for the memory extraction response without significant cost.
Fix embedded dataset extraction — drill through PageDocument wrapper
Details
The note entity JSON nests blocks at content.content (PageDocument has
{ "type": "doc", "content": [...blocks...] }), not at content directly.
The previous fix checked content.ValueKind == Array which was Object
(the PageDocument), so it fell through to the else branch and returned
without finding any dataset references.
Now drills content → content.content to find the block array.
Get notified about new releases