You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat: add Settings tab to Android, rename filter words to phrases, add Revert button
- Create PhoneSettingsView for Android with mobile-friendly layout
- Add Settings tab to PhoneMainView bottom tabs
- Rename 'filter words' to 'filter phrases' across all labels, docs, and logs
- Add RevertFilterWordsCommand to restore last-saved values
- Add Revert button to both Desktop and Android settings views
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copy file name to clipboardExpand all lines: docs/todo.yaml
+65-7Lines changed: 65 additions & 7 deletions
Original file line number
Diff line number
Diff line change
@@ -7,6 +7,64 @@ Architecture:
7
7
description:
8
8
- McpServer.UI.Core contains shared ViewModels (RunSyncViewModel, SyncStatusViewModel were removed but other VMs may exist). Evaluate whether McpServerManager.Core ViewModels can be refactored to reuse or extend the ViewModels provided by McpServer.UI.Core to reduce duplication and improve maintainability.
9
9
- This is especially relevant after the /mcp/ to /mcpserver/ route rename and sync endpoint removal — the UI.Core layer has been updated accordingly.
10
+
- id: RT-REFACTOR
11
+
title: Observable ConnectionState refactor
12
+
estimate: 8h
13
+
done: false
14
+
description:
15
+
- Full refactor to replace push-based data propagation with observable ConnectionState singleton.
16
+
- 'STEP 1 (001): Create ConnectionState ObservableObject singleton in McpServerManager.Core/Services/ with properties: ActiveMcpBaseUrl, ApiKey, BearerToken, WorkspacePath, WorkspaceKey, WorkspaceDisplayName, IsConnected.'
17
+
- 'STEP 2 (002): Migrate WorkspacePath - remove duplicates from VoiceConversationViewModel and McpVoiceConversationService; all consumers read from ConnectionState directly.'
18
+
- 'STEP 3 (003): Migrate voice service auth credentials - remove cached _baseUrl/_apiKey/_bearerToken from McpVoiceConversationService; read from ConnectionState per-request.'
19
+
- 'STEP 4 (004): Replace platform callbacks (SaveWorkspaceKey/LoadWorkspaceKey, GetEditorText) with IWorkspacePreferenceStore and IEditorTextProvider interfaces.'
20
+
- 'STEP 5 (005): Replace GlobalStatusChanged event pattern with observable StatusState or ConnectionState properties; final audit pass for remaining push-based propagation.'
21
+
technical-details:
22
+
- Use [ObservableProperty] source generators from CommunityToolkit.Mvvm for ConnectionState
23
+
- Must be thread-safe for cross-thread property change notifications
24
+
- 'Auth credentials currently duplicated in 5+ objects: MainWindowViewModel, _mcpClient, _mcpPromptClient, McpVoiceConversationService, VoiceConversationViewModel'
25
+
- 'WorkspacePath currently lives in 4 objects: _mcpClient, _mcpPromptClient, VoiceConversationViewModel, McpVoiceConversationService'
26
+
- 'CRITICAL sync risk: voice service never gets updated with new credentials after creation'
27
+
- The voice VM lazy-init race condition is a direct result of push-based propagation
28
+
- McpServerClient.WorkspacePath should also read from ConnectionState
29
+
implementation-tasks:
30
+
- task: '[001] Create ConnectionState.cs in Core/Services/'
31
+
done: false
32
+
- task: '[001] Register ConnectionState as singleton in service collection'
33
+
done: false
34
+
- task: '[001] Inject ConnectionState into MainWindowViewModel constructor'
35
+
done: false
36
+
- task: '[002] Remove _workspacePath field from VoiceConversationViewModel'
37
+
done: false
38
+
- task: '[002] Remove WorkspacePath property from McpVoiceConversationService'
39
+
done: false
40
+
- task: '[002] McpServerClient reads WorkspacePath from ConnectionState'
41
+
done: false
42
+
- task: '[002] Remove all workspace path push sites from MainWindowViewModel'
43
+
done: false
44
+
- task: '[003] Remove _baseUrl, _apiKey, _bearerToken fields from McpVoiceConversationService'
45
+
done: false
46
+
- task: '[003] Inject ConnectionState into McpVoiceConversationService'
47
+
done: false
48
+
- task: '[003] Read auth from ConnectionState per-request in HTTP client creation'
- task: '[004] Wire ConnectionState.WorkspaceKey PropertyChanged to auto-save'
59
+
done: false
60
+
- task: '[004] Remove SaveWorkspaceKey/LoadWorkspaceKey callbacks from MainWindowViewModel'
61
+
done: false
62
+
- task: '[005] Create StatusState observable or add status properties to ConnectionState'
63
+
done: false
64
+
- task: '[005] Replace GlobalStatusChanged event subscriptions with PropertyChanged'
65
+
done: false
66
+
- task: '[005] Final audit pass for remaining push patterns'
67
+
done: false
10
68
Features:
11
69
high-priority:
12
70
- id: settings-tab-speech-filter-words
@@ -23,16 +81,16 @@ Features:
23
81
done-summary: Settings tab with configurable speech filter word list implemented and committed in 5e42d8f. SpeechFilterService, SettingsViewModel, SettingsView.axaml all created and integrated. Build verified.
24
82
implementation-tasks:
25
83
- task: Create SpeechFilterService in Core with persistence and ShouldFilter method
26
-
done: false
84
+
done: true
27
85
- task: Create SettingsViewModel in Core with filter word list binding
28
-
done: false
86
+
done: true
29
87
- task: Create SettingsView.axaml and code-behind in Desktop
30
-
done: false
88
+
done: true
31
89
- task: Add Settings tab to MainWindow.axaml
32
-
done: false
90
+
done: true
33
91
- task: Wire SettingsViewModel in MainWindowViewModel
34
-
done: false
92
+
done: true
35
93
- task: Integrate SpeechFilterService into Android SimplifiedVoiceView TTS flow
0 commit comments