Purge cloud workspace data on local wipe/reseed/reset
Details
When the user wipes data (Wipe, Reseed, or Reset Data on unlock screen),
the local DuckDB cursors are destroyed but the server-side sync_batches
and sync_cursors remain. On next sync startup the device's cursor resets
to 0, causing getPendingChanges to report the device's own old batches
as pending — triggering an infinite download loop of stale data every
poll cycle.
Fix: call the server's /api/cloud/workspace/purge endpoint before wiping
local data. This clears batches, cursors, snapshots, blobs, and S3
objects server-side so the sync engine starts clean.
- SeedDataService: add PurgeCloudWorkspaceIfConnectedAsync() as step 0
in WipeAllPluginDataAsync (covers both Wipe and Reseed paths)
- SetupWizardViewModel: add PurgeCloudWorkspaceAsync() before runtime
shutdown in ConfirmResetData (covers unlock screen Reset Data)
- Both methods are best-effort — cloud purge failure doesn't block
local wipe
Route Whisper transcriptions to Duncan when no text input is focused
Details
When Cmd+M is pressed without a text input focused, the speech recording
now proceeds normally and routes the transcription to Duncan's AI tray
instead of silently discarding it. This enables voice commands:
- MainWindow.Speech.cs: removed early return when no text control is
focused — always start recording regardless of focus state
- MainWindow.axaml.cs: OnTranscriptionReady routes to
AiTrayVM.SendVoiceMessageAsync() when _speechTargetControl is null,
and auto-opens the AI tray panel
- AiSuggestionTrayViewModel.Chat.cs: added SendVoiceMessageAsync() that
sets ChatInputText and triggers the standard send pipeline (RAG +
intent classification)
Flow: Cmd+M → record → Whisper transcribe → no text field? → Duncan
processes via RAG + intent engine → shows response/action in AI tray.
Round 4: complete AI intent inventory with full slot signatures
Details
The 10th-man audit: previous rounds listed intent names but not the full
slot signatures needed for the AI to construct proper natural-language-to-action
calls. The RAG-indexed descriptions now contain the complete actionable API
for every plugin, enabling voice/speech-to-intent routing.
Key findings and fixes:
- Tasks: was missing 3 of 4 intents — added tasks.create_project,
tasks.update_task (with all 12 updatable fields), tasks.add_link (with
6 relationship types). This is the biggest gap: users saying "mark my
task as done" or "link this task to that note" would have failed.
- Finance: had intent names but no slot details for 10 intents — users
asking "what's my checking balance?" or "how much did I spend on
groceries?" need the AI to know which params to fill
- Notes: was missing content and tags slots (only listed title)
- Journal: had wrong required slot (title doesn't exist, content is required)
- Files: was completely missing files.create_bookmark intent
- WebClips: was completely missing webclips.save_clip intent
- All plugins: standardized format with * for required slots, included
defaults and behavioral notes (e.g., email.draft_email saves as draft,
does not send; calendar defaults to +1hr; habits uses fuzzy name matching)
Round 3: add command palette entries to all plugins that expose them
Details
5 plugins register commands in the global command palette (Cmd+K) but none
of their DetailedDescriptions mentioned this. If a user asks Duncan "refresh
my feeds" or "check my mail", the AI needs to know these commands exist.
- RSS: Refresh All Feeds, Show Unread/Starred, Mark All Read, OPML import/export
- Email: Check Mail, Compose, Add Account, Mark All Read, Empty Trash
- Contacts: New Contact/Company/Group, filter by status, Import, Scan Duplicates
- Habits: New Habit, New Goal, Log Habit, View Analytics
- Files: Upload File, New Folder, Toggle View, Switch Storage Mode
Round 2: fill remaining DetailedDescription gaps across all plugins
Details
Focused on AI-actionable gaps identified by cross-referencing PLUGIN_CONTEXT.md:
- Tasks: list 8 default statuses by name, add GTD contexts with autocomplete,
GitHub activity timeline, AI intent with slots
- Notes: wiki-link syntax for internal pages vs cross-plugin, automatic backlink
resolution, sticky note tags, AI intent with slots
- Calendar: AI intent with slots
- Contacts: favorites toggle, per-contact notes field, AI intent with slots
- Email: AI intent with slots
- Habits: export/share, 3 AI intents with slots
- Finance: category management flags (sort order, hidden)
- Journal: entry metadata (weather, location, word count, favorite), editable
transcription text, AI intent with slots
- Files: vault unlock requirement
- Snippets: AI intent with slots
- RSS: batch refresh, remove feeds, feed context menus, AI intent with slots
- WebClips: delete/archive CRUD, graph contribution with tag-based edges
- Data: search datasets by name
Get notified about new releases