Redesign dataset creation and import experience with friendly types and import preview (v1.16.0)
Details
Replace raw DuckDB type names (VARCHAR, INTEGER, etc.) with user-friendly
labels (Text, Number, Decimal, Yes/No, Date, Date & Time) throughout the
schema builder. Add ColumnTypeMapping model that maps between friendly
display labels and DuckDB types, handling all DuckDB type aliases.
Add import preview overlay that appears after file import or clipboard paste.
The overlay shows detected column types and a data preview (first 20 rows),
letting users adjust column names and types before finalizing. On confirm,
applies RenameColumn and AlterColumnType operations for changed columns.
On cancel, deletes the imported dataset.
Add "Paste CSV" button in the import expander, which reads CSV/TSV/PSV
content from the clipboard, imports via DuckDB auto-detect, and opens
the same import preview overlay.
File import now routes through the preview overlay instead of immediately
selecting the dataset, giving users a chance to review and adjust detected
schema before committing.
Add SQL editor intelligence and cross-plugin entity querying
Details
Introduces source:@PluginName syntax for querying entity data from any
plugin directly in the SQL editor. Adds a stateless SQL analysis engine
with CTE parsing, cursor-context-sensitive autocomplete, inline problem
detection (unknown sources/columns, ambiguous references), and a DuckDB
function catalog.
Entity source materialization fetches plugin data via IPluginDataSourceProvider,
creates temporary DuckDB tables, rewrites SQL to reference them, executes the
query, and cleans up. Results are cached for 30 seconds during live typing;
manual Ctrl+Enter bypasses the cache.
Eight plugins now implement IPluginDataSourceProvider: Calendar, Journal,
Notes, Email, Files, RSS, Snippets, and WebClips — joining the existing
Tasks and Contacts implementations. Each exposes its entities as tabular
data sources accessible via source:@PluginName in the query editor.
The SQL editor gains entity source coloring (teal), problem squiggles
(red errors, amber warnings), @ trigger for entity completions, and
context-aware completions for columns, functions, CTEs, and sources.
New files:
- Services/Analysis/: SqlAnalyzer, CteParser, ContextDetector,
ProblemDetector, SchemaRegistry, DuckDbFunctions, CursorContext,
SqlAnalysisModels
- Services/EntitySourceRegistry, EntitySourceMaterializer
- 8 plugin DataSources partial classes
Modified files:
- SqlPreprocessorClient: entity source regex methods
- SqlCompletionProvider: rewritten with SqlAnalyzer integration
- SqlSemanticColorizer: entity brush + problem squiggles
- SqlEditorControl: @ trigger, SchemaRegistry wiring
- QueryEditorViewModel: materializer + schema dependencies
- QueryEditorViewModel.LiveQuery: materialization in execution pipeline
- DataViewModel: pass-through entity source dependencies
- DataPlugin: create and wire EntitySourceRegistry/Materializer
- QueryEditorView: SchemaRegistry + entity source refresh wiring
Version bumps:
- Data: 1.14.1 → 1.15.0
- Calendar: 1.10.4 → 1.11.0
- Journal: 1.5.3 → 1.6.0
- Notes: 1.42.2 → 1.43.0
- Email: 1.21.5 → 1.22.0
- Files: 1.8.1 → 1.9.0
- RSS: 1.7.1 → 1.8.0
- Snippets: 1.5.2 → 1.6.0
- WebClips: 1.1.1 → 1.2.0
Add IMAP IDLE and inline image support (v1.21.0)
Details
Adds real-time new message notifications via IMAP IDLE for Inbox folders.
ImapIdleService maintains persistent connections per account, re-IDLEs every
25 minutes per IMAP spec, with exponential backoff reconnect. Falls back to
polling when IDLE is not supported. EmailSyncManager integrates IDLE alongside
existing polling — IDLE triggers immediate incremental sync on CountChanged.
Adds inline image support for HTML emails. FetchBodyAsync now extracts inline
MimePart resources with ContentId and converts them to base64 data URIs.
HtmlSanitizer replaces cid: references in img src attributes with the
corresponding data URIs. InlineImages dictionary flows through the body cache
(EmailCachedBody) for offline access and is bound through HtmlMessageRenderer
to the reading pane view.
Email v1.20.0: Conversation threading with MessageId/InReplyTo chains
Details
Phase 5 of full-featured email client implementation:
- New EmailThread model: ThreadId, Messages (sorted newest-first),
LatestMessage, Count, IsExpanded, HasUnread, Participants, Subject
properties for thread header display
- New EmailThreadingService: groups messages into conversation threads
using a 5-phase algorithm: (1) build MessageId lookup, (2) follow
InReplyTo chains to find thread roots with cycle detection, (3) group
by root, (4) merge subject-based groups with MessageId-based groups,
(5) deduplicate and sort. Fallback to normalized subject matching
(strips Re:/Fwd:/Fw: prefixes) for messages without threading headers
- New EmailViewModel.Threading.cs: IsThreadView toggle, Threads collection,
SelectedThread, ExpandThread/SelectThreadMessage commands, RebuildThreads
called after filter changes when thread view is enabled
- InReplyTo promoted from transient to persisted field on EmailMessage with
JsonPropertyName("in_reply_to") and new indexed field in entity schema
for efficient thread lookups
- ImapSyncService.MapToEmailMessage now captures Envelope.InReplyTo during
header sync so threading data is available from first sync
- Thread view toggle added to gear menu settings
- Threading integrates with existing filter pipeline: ApplyFilters()
automatically rebuilds threads when IsThreadView is true
Email v1.19.0: Save sent to Sent folder, draft auto-save persistence
Details
Phase 4 of full-featured email client implementation:
- New ImapSyncService.Append.cs: IMAP APPEND operation for saving MimeMessages
to server folders (Sent, Drafts) with configurable flags, returns server-
assigned UID for draft replacement tracking
- Made SmtpSendService.BuildMimeMessage public so ComposeViewModel can reuse
it for building MimeMessages to save to Sent/Drafts without duplication
- ComposeViewModel rewritten with draft persistence: 30-second auto-save timer
saves to Drafts folder via IMAP APPEND with Draft+Seen flags, tracks UID to
replace old draft on re-save, deletes server draft after successful send
- Save-to-Sent: after SMTP send completes, fire-and-forget APPEND to Sent
folder with Seen flag so sent messages appear on the server immediately
- ComposeMessage model extended with DraftUid and DraftFolderPath fields
for tracking the server-side draft across save cycles
- New OpenDraft command: when a message in the Drafts folder is selected,
opens compose overlay pre-filled with the draft content and UID tracking
so subsequent saves replace the same server draft
Get notified about new releases