Add cross-block drag selection escape detection to RichTextEditor
Details
RichTextEditor now detects when a drag selection moves outside its vertical
bounds (pointer Y < 0 or > Bounds.Height) and fires a new DragSelectionEscaped
event with the block ID and escape direction (+1 below, -1 above). On escape,
the RTE selects text from anchor to the corresponding edge, releases pointer
capture, and stops its internal drag — allowing the parent (NotesView) to take
over cross-block selection.
New public API:
- DragSelectionEscaped event (Action<string, int>)
- SelectToEnd() / SelectToStart() — select from anchor to document edge
- ReleaseDragCapture() — externally end drag state
- SelectionAnchor property (int?) — expose caret anchor position
- HitTestPoint(Point) — char-index hit-test for external callers
Version bump: 1.59.1 → 1.59.2
Persist intent suggestions across app restarts
Details
IntentEngine now saves/loads suggestions to intent-suggestions.json in the
app data directory. Suggestions older than 7 days are auto-expired on load.
Persistence is debounced (2s) to avoid excessive I/O. On dispose, a final
flush ensures no suggestions are lost on clean shutdown.
The AI tray already reads PendingSuggestions on init, so persisted
suggestions appear automatically when the app restarts.
Desktop version 1.58.5 -> 1.58.6.
Include entity context in AI intent prompts and emit IntentExecutedMessage
Details
IntentPromptBuilder.BuildUserPrompt now includes the source entity type
and title so the AI generates contextual titles (e.g. "Dr Hotch Appointment"
instead of "Rescheduled Meeting"). System prompt updated to instruct the AI
to use source context when available.
IntentEngine.ExecuteAsync now broadcasts IntentExecutedMessage after
successful execution so source plugins can create reverse links.
Desktop version 1.58.4 -> 1.58.5.
Add IntentExecutedMessage for reverse-linking intent results
Details
New SDK message type broadcast after a successful intent execution,
allowing source plugins to create reverse links from the originating
entity to the newly created entity. This enables bidirectional linking
between e.g. a task and a calendar event created from that task's note.
SDK version 1.59.0 -> 1.59.1.
Add action buttons to AI intent suggestions and fix dismiss
Details
Intent suggestions from IntentEngine (e.g. "Create Calendar Event",
"Create Task") were rendered with only a "Dismiss" link and no action
button. The user had no way to accept/execute the suggested intent.
Three fixes:
1. AddIntentAsAssistantMessage now adds a primary action button using
the matched intent's DisplayName (e.g. "Create Calendar Event").
Clicking it calls IntentEngine.ExecuteAsync() which routes to the
owning plugin's IIntentProvider.ExecuteIntentAsync().
2. Fixed RemoveMessageBySuggestionId double-prefix bug — intent messages
have SuggestionId="intent:{uuid}" but the method was searching for
"intent:intent:{uuid}", so dismiss never actually removed the message.
3. Dismiss now calls IntentEngine.Dismiss() to clean up the pending
suggestion from the engine, not just the UI collection.
Also added IRecipient<ContentSuggestionActionRequestedMessage> to
AiSuggestionTrayViewModel to route intent action clicks through
ExecuteIntentActionAsync with proper loading/applied/error state
transitions.
Get notified about new releases