Skip to content

Audit tier1 - #51

Open
csmashe wants to merge 821 commits into
linuxfrom
audit-tier1
Open

Audit tier1#51
csmashe wants to merge 821 commits into
linuxfrom
audit-tier1

Conversation

@csmashe

@csmashe csmashe commented Jul 17, 2026

Copy link
Copy Markdown
Owner

Summary

Related Issue

Test Plan

  • dotnet test
  • Built and ran locally on Linux
  • Tested the changed functionality manually
  • Checked desktop-environment or X11/Wayland behavior when relevant
  • No regressions in existing features

Notes

Summary by CodeRabbit

  • New Features

    • Added side-effect-free correction preview so users can test dictionary replacements without persisting usage data.
    • Introduced safer atomic settings updates and improved desktop integration setup/restore messaging (including staged restore wording).
  • Bug Fixes

    • Improved Linux dictation/paste confirmation behavior and refined cancellation handling and action-unavailable outcomes.
    • Subtitle timestamps now correctly format durations beyond 24 hours; tokenization now treats all whitespace consistently.
  • Tests

    • Expanded automated coverage for correction preview/CSV import, concurrency, dictation insertion flows, shortcuts/desktop integration, and subtitle formatting.

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown

Review Change Stack

Important

Review skipped

Too many files!

This PR contains 758 files, which is 608 over the limit of 150.

To get a review, reduce the PR to 150 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to Pro+ to raise the limit.

Usage-priced reviews support at most 300 files.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 91d64b51-ff8d-49c3-b79f-8e7206bf6275

📥 Commits

Reviewing files that changed from the base of the PR and between 202c40b and 953467e.

📒 Files selected for processing (758)
  • .editorconfig
  • .github/codeql/codeql-config.yml
  • .github/dependabot.yml
  • .github/workflows/package-dry-run-linux.yml
  • .github/workflows/plugins-smoke.yml
  • .github/workflows/pr-ci-linux.yml
  • .github/workflows/publish-plugins.yml
  • .github/workflows/release-linux.yml
  • .github/workflows/security.yml
  • .gitignore
  • README.md
  • TESTING_GUIDE.md
  • THIRD-PARTY-NOTICES.md
  • TypeWhisper.slnx
  • docs/PRIVACY.md
  • docs/STORE_SUBMISSION.md
  • docs/releases/v0.8.1.md
  • docs/releases/v1.0.0-rc1.md
  • docs/releases/v1.0.0.md
  • docs/releases/v1.0.1.md
  • global.json
  • plugins/Directory.Build.props
  • plugins/Shared/Cuda/CudaRuntimeProvisioner.cs
  • plugins/Shared/Io/DurableFileWrite.cs
  • plugins/Shared/Net/InterProcessFileLock.cs
  • plugins/Shared/Net/ResilientDownloader.cs
  • plugins/TypeWhisper.Plugin.AssemblyAi/AssemblyAiPlugin.cs
  • plugins/TypeWhisper.Plugin.AssemblyAi/AssemblyAiStreamingSession.cs
  • plugins/TypeWhisper.Plugin.AssemblyAi/TypeWhisper.Plugin.AssemblyAi.csproj
  • plugins/TypeWhisper.Plugin.AssemblyAi/manifest.json
  • plugins/TypeWhisper.Plugin.Cerebras/CerebrasPlugin.cs
  • plugins/TypeWhisper.Plugin.Cerebras/manifest.json
  • plugins/TypeWhisper.Plugin.Claude/ClaudePlugin.cs
  • plugins/TypeWhisper.Plugin.Claude/manifest.json
  • plugins/TypeWhisper.Plugin.CloudflareAsr/CloudflareAsrPlugin.cs
  • plugins/TypeWhisper.Plugin.CloudflareAsr/TypeWhisper.Plugin.CloudflareAsr.csproj
  • plugins/TypeWhisper.Plugin.CloudflareAsr/manifest.json
  • plugins/TypeWhisper.Plugin.Cohere/CoherePlugin.cs
  • plugins/TypeWhisper.Plugin.Cohere/manifest.json
  • plugins/TypeWhisper.Plugin.Deepgram/DeepgramPlugin.cs
  • plugins/TypeWhisper.Plugin.Deepgram/DeepgramStreamingSession.cs
  • plugins/TypeWhisper.Plugin.Deepgram/TypeWhisper.Plugin.Deepgram.csproj
  • plugins/TypeWhisper.Plugin.Deepgram/manifest.json
  • plugins/TypeWhisper.Plugin.ElevenLabs/ElevenLabsPlugin.cs
  • plugins/TypeWhisper.Plugin.ElevenLabs/ElevenLabsStreamingSession.cs
  • plugins/TypeWhisper.Plugin.ElevenLabs/manifest.json
  • plugins/TypeWhisper.Plugin.FileMemory/FileMemoryPlugin.cs
  • plugins/TypeWhisper.Plugin.FileMemory/manifest.json
  • plugins/TypeWhisper.Plugin.Fireworks/FireworksPlugin.cs
  • plugins/TypeWhisper.Plugin.Fireworks/manifest.json
  • plugins/TypeWhisper.Plugin.Gemini/GeminiPlugin.cs
  • plugins/TypeWhisper.Plugin.Gemini/manifest.json
  • plugins/TypeWhisper.Plugin.GemmaLocal/GemmaLocalPlugin.cs
  • plugins/TypeWhisper.Plugin.GemmaLocal/TypeWhisper.Plugin.GemmaLocal.csproj
  • plugins/TypeWhisper.Plugin.GemmaLocal/manifest.json
  • plugins/TypeWhisper.Plugin.Gladia/GladiaPlugin.cs
  • plugins/TypeWhisper.Plugin.Gladia/GladiaStreamingSession.cs
  • plugins/TypeWhisper.Plugin.Gladia/manifest.json
  • plugins/TypeWhisper.Plugin.GoogleCloudStt/GoogleCloudSttPlugin.cs
  • plugins/TypeWhisper.Plugin.GoogleCloudStt/Localization/de.json
  • plugins/TypeWhisper.Plugin.GoogleCloudStt/Localization/en.json
  • plugins/TypeWhisper.Plugin.GoogleCloudStt/Localization/es.json
  • plugins/TypeWhisper.Plugin.GoogleCloudStt/Localization/ru.json
  • plugins/TypeWhisper.Plugin.GoogleCloudStt/manifest.json
  • plugins/TypeWhisper.Plugin.Groq/GroqPlugin.cs
  • plugins/TypeWhisper.Plugin.Groq/manifest.json
  • plugins/TypeWhisper.Plugin.Linear/LinearPlugin.cs
  • plugins/TypeWhisper.Plugin.Linear/TypeWhisper.Plugin.Linear.csproj
  • plugins/TypeWhisper.Plugin.Linear/manifest.json
  • plugins/TypeWhisper.Plugin.Obsidian/Localization/de.json
  • plugins/TypeWhisper.Plugin.Obsidian/Localization/en.json
  • plugins/TypeWhisper.Plugin.Obsidian/Localization/es.json
  • plugins/TypeWhisper.Plugin.Obsidian/Localization/ru.json
  • plugins/TypeWhisper.Plugin.Obsidian/ObsidianPlugin.cs
  • plugins/TypeWhisper.Plugin.Obsidian/TypeWhisper.Plugin.Obsidian.csproj
  • plugins/TypeWhisper.Plugin.Obsidian/manifest.json
  • plugins/TypeWhisper.Plugin.OpenAi/OpenAiChatGptClient.cs
  • plugins/TypeWhisper.Plugin.OpenAi/OpenAiFetchedModel.cs
  • plugins/TypeWhisper.Plugin.OpenAi/OpenAiJson.cs
  • plugins/TypeWhisper.Plugin.OpenAi/OpenAiOAuthSupport.cs
  • plugins/TypeWhisper.Plugin.OpenAi/OpenAiPlugin.cs
  • plugins/TypeWhisper.Plugin.OpenAi/OpenAiRealtimeStreamingSession.cs
  • plugins/TypeWhisper.Plugin.OpenAi/OpenAiResponsesClient.cs
  • plugins/TypeWhisper.Plugin.OpenAi/OpenAiTtsSupport.cs
  • plugins/TypeWhisper.Plugin.OpenAi/manifest.json
  • plugins/TypeWhisper.Plugin.OpenAiCompatible/Localization/de.json
  • plugins/TypeWhisper.Plugin.OpenAiCompatible/Localization/en.json
  • plugins/TypeWhisper.Plugin.OpenAiCompatible/Localization/es.json
  • plugins/TypeWhisper.Plugin.OpenAiCompatible/Localization/ru.json
  • plugins/TypeWhisper.Plugin.OpenAiCompatible/OpenAiCompatiblePlugin.cs
  • plugins/TypeWhisper.Plugin.OpenAiCompatible/manifest.json
  • plugins/TypeWhisper.Plugin.OpenAiVectorMemory/OpenAiVectorMemoryPlugin.cs
  • plugins/TypeWhisper.Plugin.OpenAiVectorMemory/TypeWhisper.Plugin.OpenAiVectorMemory.csproj
  • plugins/TypeWhisper.Plugin.OpenAiVectorMemory/manifest.json
  • plugins/TypeWhisper.Plugin.OpenRouter/OpenRouterPlugin.cs
  • plugins/TypeWhisper.Plugin.OpenRouter/manifest.json
  • plugins/TypeWhisper.Plugin.Qwen3Stt/Qwen3SttPlugin.cs
  • plugins/TypeWhisper.Plugin.Qwen3Stt/TypeWhisper.Plugin.Qwen3Stt.csproj
  • plugins/TypeWhisper.Plugin.Qwen3Stt/manifest.json
  • plugins/TypeWhisper.Plugin.Reson8/Reson8CustomModel.cs
  • plugins/TypeWhisper.Plugin.Reson8/Reson8Plugin.cs
  • plugins/TypeWhisper.Plugin.Reson8/Reson8StreamingSession.cs
  • plugins/TypeWhisper.Plugin.Reson8/manifest.json
  • plugins/TypeWhisper.Plugin.Script/ScriptPlugin.cs
  • plugins/TypeWhisper.Plugin.Script/manifest.json
  • plugins/TypeWhisper.Plugin.SherpaOnnx/SherpaCudaRuntimeInstaller.cs
  • plugins/TypeWhisper.Plugin.SherpaOnnx/SherpaDecodeCoordinator.cs
  • plugins/TypeWhisper.Plugin.SherpaOnnx/SherpaOnnxNativeRuntime.cs
  • plugins/TypeWhisper.Plugin.SherpaOnnx/SherpaOnnxPlugin.cs
  • plugins/TypeWhisper.Plugin.SherpaOnnx/TypeWhisper.Plugin.SherpaOnnx.csproj
  • plugins/TypeWhisper.Plugin.SherpaOnnx/manifest.json
  • plugins/TypeWhisper.Plugin.SmallestAi/SmallestAiPlugin.cs
  • plugins/TypeWhisper.Plugin.SmallestAi/SmallestAiStreamingSession.cs
  • plugins/TypeWhisper.Plugin.SmallestAi/manifest.json
  • plugins/TypeWhisper.Plugin.Soniox/SonioxPlugin.cs
  • plugins/TypeWhisper.Plugin.Soniox/SonioxStreamingSession.cs
  • plugins/TypeWhisper.Plugin.Soniox/manifest.json
  • plugins/TypeWhisper.Plugin.Speechmatics/SpeechmaticsPlugin.cs
  • plugins/TypeWhisper.Plugin.Speechmatics/SpeechmaticsStreamingSession.cs
  • plugins/TypeWhisper.Plugin.Speechmatics/manifest.json
  • plugins/TypeWhisper.Plugin.SupertonicTts/SupertonicAssetManager.cs
  • plugins/TypeWhisper.Plugin.SupertonicTts/SupertonicOnnxSynthesizer.cs
  • plugins/TypeWhisper.Plugin.SupertonicTts/SupertonicPaths.cs
  • plugins/TypeWhisper.Plugin.SupertonicTts/SupertonicTextProcessor.cs
  • plugins/TypeWhisper.Plugin.SupertonicTts/SupertonicTtsPlayback.cs
  • plugins/TypeWhisper.Plugin.SupertonicTts/SupertonicTtsPlugin.cs
  • plugins/TypeWhisper.Plugin.SupertonicTts/SupertonicVoiceStyle.cs
  • plugins/TypeWhisper.Plugin.SupertonicTts/manifest.json
  • plugins/TypeWhisper.Plugin.Voxtral/TypeWhisper.Plugin.Voxtral.csproj
  • plugins/TypeWhisper.Plugin.Voxtral/VoxtralPlugin.cs
  • plugins/TypeWhisper.Plugin.Voxtral/manifest.json
  • plugins/TypeWhisper.Plugin.Webhook/Localization/de.json
  • plugins/TypeWhisper.Plugin.Webhook/Localization/en.json
  • plugins/TypeWhisper.Plugin.Webhook/Localization/es.json
  • plugins/TypeWhisper.Plugin.Webhook/Localization/ru.json
  • plugins/TypeWhisper.Plugin.Webhook/TypeWhisper.Plugin.Webhook.csproj
  • plugins/TypeWhisper.Plugin.Webhook/WebhookPlugin.cs
  • plugins/TypeWhisper.Plugin.Webhook/manifest.json
  • plugins/TypeWhisper.Plugin.WhisperCpp/TypeWhisper.Plugin.WhisperCpp.csproj
  • plugins/TypeWhisper.Plugin.WhisperCpp/WhisperCppPlugin.cs
  • plugins/TypeWhisper.Plugin.WhisperCpp/WhisperCudaRuntimeInstaller.cs
  • plugins/TypeWhisper.Plugin.WhisperCpp/manifest.json
  • plugins/TypeWhisper.Plugin.Xai/XaiJson.cs
  • plugins/TypeWhisper.Plugin.Xai/XaiPlugin.cs
  • plugins/TypeWhisper.Plugin.Xai/XaiResponsesClient.cs
  • plugins/TypeWhisper.Plugin.Xai/XaiStreamingSession.cs
  • plugins/TypeWhisper.Plugin.Xai/XaiTtsSupport.cs
  • plugins/TypeWhisper.Plugin.Xai/manifest.json
  • plugins/catalog.json
  • scripts/build-linux-packages.sh
  • scripts/deploy-linux-plugins.sh
  • scripts/install-linux-app.sh
  • scripts/lib/managed-artifacts.sh
  • scripts/plugin-catalog-deploy-map.py
  • scripts/plugin-catalog.ps1
  • scripts/publish-plugin-release.ps1
  • scripts/select-plugin-smoke-projects.ps1
  • scripts/smoke-test-linux-packages.sh
  • scripts/tarball-install.sh
  • scripts/uninstall-linux-app.sh
  • src/TypeWhisper.Cli/CliSupport.cs
  • src/TypeWhisper.Cli/Commands/ModelsCommand.cs
  • src/TypeWhisper.Cli/Commands/StatusCommand.cs
  • src/TypeWhisper.Cli/Commands/TranscribeCommand.cs
  • src/TypeWhisper.Cli/Models/CliOptions.cs
  • src/TypeWhisper.Cli/Models/DiscoveryFile.cs
  • src/TypeWhisper.Cli/Output/ConsoleOutput.cs
  • src/TypeWhisper.Cli/Output/JsonFormatting.cs
  • src/TypeWhisper.Cli/Output/UsageText.cs
  • src/TypeWhisper.Cli/Program.cs
  • src/TypeWhisper.Cli/Services/ApiClient.cs
  • src/TypeWhisper.Cli/Services/ApiResponseValidator.cs
  • src/TypeWhisper.Cli/Services/DiscoveryFileReader.cs
  • src/TypeWhisper.Cli/Services/UnixPeerCredentials.cs
  • src/TypeWhisper.Cli/TypeWhisper.Cli.csproj
  • src/TypeWhisper.Core/Interfaces/IDictionaryService.cs
  • src/TypeWhisper.Core/Interfaces/IProfileService.cs
  • src/TypeWhisper.Core/Interfaces/ISettingsService.cs
  • src/TypeWhisper.Core/Models/AppSettings.cs
  • src/TypeWhisper.Core/Models/CleanupLevel.cs
  • src/TypeWhisper.Core/Models/DictionaryEntrySource.cs
  • src/TypeWhisper.Core/Models/DictionaryEntryType.cs
  • src/TypeWhisper.Core/Models/DiffSegment.cs
  • src/TypeWhisper.Core/Models/ErrorLogEntry.cs
  • src/TypeWhisper.Core/Models/ExportLabels.cs
  • src/TypeWhisper.Core/Models/HistoryRetentionMode.cs
  • src/TypeWhisper.Core/Models/IndustryPreset.cs
  • src/TypeWhisper.Core/Models/LocalModelStorageUnavailableReason.cs
  • src/TypeWhisper.Core/Models/MatchKind.cs
  • src/TypeWhisper.Core/Models/ModelStatus.cs
  • src/TypeWhisper.Core/Models/ModelStatusType.cs
  • src/TypeWhisper.Core/Models/OverlayPosition.cs
  • src/TypeWhisper.Core/Models/OverlayWidget.cs
  • src/TypeWhisper.Core/Models/ProfileHotkeyBehavior.cs
  • src/TypeWhisper.Core/Models/ProfileStylePreset.cs
  • src/TypeWhisper.Core/Models/RecentTranscriptionSource.cs
  • src/TypeWhisper.Core/Models/RecordingMode.cs
  • src/TypeWhisper.Core/Models/SnippetTriggerMode.cs
  • src/TypeWhisper.Core/Models/TermPack.cs
  • src/TypeWhisper.Core/Models/TextInsertionStatus.cs
  • src/TypeWhisper.Core/Models/TextInsertionStrategy.cs
  • src/TypeWhisper.Core/Models/TranscriptionRecord.cs
  • src/TypeWhisper.Core/Models/TranscriptionTask.cs
  • src/TypeWhisper.Core/Models/TranslationModelInfo.cs
  • src/TypeWhisper.Core/Services/AppFormatterService.cs
  • src/TypeWhisper.Core/Services/AtomicFileWrite.cs
  • src/TypeWhisper.Core/Services/AtomicJsonStore.cs
  • src/TypeWhisper.Core/Services/CleanupService.cs
  • src/TypeWhisper.Core/Services/CorrectionSuggestionService.cs
  • src/TypeWhisper.Core/Services/DetectionFailureTracker.cs
  • src/TypeWhisper.Core/Services/DeveloperFormattingService.cs
  • src/TypeWhisper.Core/Services/DictionaryService.Csv.cs
  • src/TypeWhisper.Core/Services/DictionaryService.cs
  • src/TypeWhisper.Core/Services/ErrorLogService.cs
  • src/TypeWhisper.Core/Services/FirstRunDefaults.cs
  • src/TypeWhisper.Core/Services/HistoryInsightsService.cs
  • src/TypeWhisper.Core/Services/HistoryService.Export.cs
  • src/TypeWhisper.Core/Services/HistoryService.cs
  • src/TypeWhisper.Core/Services/IdeFileReferenceService.cs
  • src/TypeWhisper.Core/Services/LocalModelStorageService.cs
  • src/TypeWhisper.Core/Services/NumberNormalization/EnglishNumberWordParser.cs
  • src/TypeWhisper.Core/Services/NumberNormalization/GermanNumberWordParser.cs
  • src/TypeWhisper.Core/Services/NumberNormalization/NumberWordNormalizer.cs
  • src/TypeWhisper.Core/Services/NumberNormalization/SpanishNumberWordParser.cs
  • src/TypeWhisper.Core/Services/NumberNormalization/TranscriptionNumberNormalizationService.cs
  • src/TypeWhisper.Core/Services/PostProcessingPipeline.cs
  • src/TypeWhisper.Core/Services/ProfileService.cs
  • src/TypeWhisper.Core/Services/ProfileStylePresetService.cs
  • src/TypeWhisper.Core/Services/PromptActionService.cs
  • src/TypeWhisper.Core/Services/SettingsService.cs
  • src/TypeWhisper.Core/Services/SnippetService.cs
  • src/TypeWhisper.Core/Services/SubtitleExporter.cs
  • src/TypeWhisper.Core/Services/Sync/CloudFolderSyncJson.cs
  • src/TypeWhisper.Core/Services/Sync/UserDataSync.cs
  • src/TypeWhisper.Core/Services/WhisperHallucinationFilter.cs
  • src/TypeWhisper.Core/Translation/MarianConfig.cs
  • src/TypeWhisper.Core/Translation/MarianTokenizer.cs
  • src/TypeWhisper.Core/TypeWhisper.Core.csproj
  • src/TypeWhisper.Core/TypeWhisperEnvironment.cs
  • src/TypeWhisper.Linux/App.axaml.cs
  • src/TypeWhisper.Linux/Cli/CommandLineParser.cs
  • src/TypeWhisper.Linux/Cli/Commands/RecordCommand.cs
  • src/TypeWhisper.Linux/DiffKindConverters.cs
  • src/TypeWhisper.Linux/Program.cs
  • src/TypeWhisper.Linux/Resources/Localization/de.json
  • src/TypeWhisper.Linux/Resources/Localization/en.json
  • src/TypeWhisper.Linux/Resources/Localization/es.json
  • src/TypeWhisper.Linux/Resources/Localization/ru.json
  • src/TypeWhisper.Linux/ServiceRegistrations.cs
  • src/TypeWhisper.Linux/Services/ActionPluginExecutionHost.cs
  • src/TypeWhisper.Linux/Services/ActiveWindow/AccessibilityBusActivationService.cs
  • src/TypeWhisper.Linux/Services/ActiveWindow/AtSpiEventClient.cs
  • src/TypeWhisper.Linux/Services/ActiveWindow/AtSpiUrlExtractor.cs
  • src/TypeWhisper.Linux/Services/ActiveWindow/GnomeShellActiveWindowProvider.cs
  • src/TypeWhisper.Linux/Services/ActiveWindow/GnomeWindowCallsProvider.cs
  • src/TypeWhisper.Linux/Services/ActiveWindow/HyprlandActiveWindowProvider.cs
  • src/TypeWhisper.Linux/Services/ActiveWindow/IAtSpiEventClient.cs
  • src/TypeWhisper.Linux/Services/ActiveWindow/KWinActiveWindowProvider.cs
  • src/TypeWhisper.Linux/Services/ActiveWindow/ProviderProcessRunner.cs
  • src/TypeWhisper.Linux/Services/ActiveWindow/SwayActiveWindowProvider.cs
  • src/TypeWhisper.Linux/Services/ActiveWindow/XdotoolActiveWindowProvider.cs
  • src/TypeWhisper.Linux/Services/ActiveWindowService.cs
  • src/TypeWhisper.Linux/Services/ApiDiscoveryFile.cs
  • src/TypeWhisper.Linux/Services/ApiKeyProtection.cs
  • src/TypeWhisper.Linux/Services/AppVersion.cs
  • src/TypeWhisper.Linux/Services/AudioDuckingService.cs
  • src/TypeWhisper.Linux/Services/AudioFileService.cs
  • src/TypeWhisper.Linux/Services/AudioPlaybackService.cs
  • src/TypeWhisper.Linux/Services/AudioRecordingService.cs
  • src/TypeWhisper.Linux/Services/BrowserAccessibilitySetupHelper.cs
  • src/TypeWhisper.Linux/Services/BrowserDescriptorCatalog.cs
  • src/TypeWhisper.Linux/Services/BundledPluginDeployer.cs
  • src/TypeWhisper.Linux/Services/CliInstallService.cs
  • src/TypeWhisper.Linux/Services/CommandRunner.cs
  • src/TypeWhisper.Linux/Services/CudaLibraryPathSetupService.cs
  • src/TypeWhisper.Linux/Services/DefaultDeviceWatcher.cs
  • src/TypeWhisper.Linux/Services/DictationInFlightSessionTracker.cs
  • src/TypeWhisper.Linux/Services/DictationInsertionOrderGate.cs
  • src/TypeWhisper.Linux/Services/DictationOrchestrator.cs
  • src/TypeWhisper.Linux/Services/DictationOverlayState.cs
  • src/TypeWhisper.Linux/Services/DictationToggleGate.cs
  • src/TypeWhisper.Linux/Services/ExecutablePathResolver.cs
  • src/TypeWhisper.Linux/Services/FileTranscriptionProcessor.cs
  • src/TypeWhisper.Linux/Services/GnomeWindowCallsSetupHelper.cs
  • src/TypeWhisper.Linux/Services/HistoryRetentionCoordinator.cs
  • src/TypeWhisper.Linux/Services/Hotkey/BackendSelector.cs
  • src/TypeWhisper.Linux/Services/Hotkey/DeSetup/AtomicFileWriter.cs
  • src/TypeWhisper.Linux/Services/Hotkey/DeSetup/DesktopDetector.cs
  • src/TypeWhisper.Linux/Services/Hotkey/DeSetup/DictationShortcutSpecFactory.cs
  • src/TypeWhisper.Linux/Services/Hotkey/DeSetup/GnomeShortcutWriter.cs
  • src/TypeWhisper.Linux/Services/Hotkey/DeSetup/HyprlandShortcutWriter.cs
  • src/TypeWhisper.Linux/Services/Hotkey/DeSetup/IDeShortcutWriter.cs
  • src/TypeWhisper.Linux/Services/Hotkey/DeSetup/KdeShortcutWriter.cs
  • src/TypeWhisper.Linux/Services/Hotkey/DeSetup/SwayShortcutWriter.cs
  • src/TypeWhisper.Linux/Services/Hotkey/Evdev/EvdevDeviceReader.cs
  • src/TypeWhisper.Linux/Services/Hotkey/Evdev/EvdevGlobalShortcutBackend.cs
  • src/TypeWhisper.Linux/Services/Hotkey/Evdev/IEvdevInputDevice.cs
  • src/TypeWhisper.Linux/Services/Hotkey/Evdev/InputAccessSetupHelper.cs
  • src/TypeWhisper.Linux/Services/Hotkey/Evdev/InputEventStruct.cs
  • src/TypeWhisper.Linux/Services/Hotkey/Evdev/LinuxKeyMap.cs
  • src/TypeWhisper.Linux/Services/Hotkey/Evdev/LogindSessionActivityMonitor.cs
  • src/TypeWhisper.Linux/Services/Hotkey/SharpHookGlobalShortcutBackend.cs
  • src/TypeWhisper.Linux/Services/Hotkey/ShortcutDispatcher.cs
  • src/TypeWhisper.Linux/Services/Hotkey/ShortcutMatcher.cs
  • src/TypeWhisper.Linux/Services/HotkeyService.cs
  • src/TypeWhisper.Linux/Services/HttpApiRequestParser.cs
  • src/TypeWhisper.Linux/Services/HttpApiService.cs
  • src/TypeWhisper.Linux/Services/Insertion/AtSpiPasteConfirmation.cs
  • src/TypeWhisper.Linux/Services/Insertion/IPasteConfirmationSource.cs
  • src/TypeWhisper.Linux/Services/Insertion/YdotoolSetupHelper.cs
  • src/TypeWhisper.Linux/Services/Ipc/ApiSocketOwnership.cs
  • src/TypeWhisper.Linux/Services/Ipc/ControlSocketClient.cs
  • src/TypeWhisper.Linux/Services/Ipc/ControlSocketOwnership.cs
  • src/TypeWhisper.Linux/Services/Ipc/ControlSocketServer.cs
  • src/TypeWhisper.Linux/Services/Ipc/JsonControlProtocol.cs
  • src/TypeWhisper.Linux/Services/Ipc/SocketPathResolver.cs
  • src/TypeWhisper.Linux/Services/Ipc/UnixPeerCredentials.cs
  • src/TypeWhisper.Linux/Services/LearnedCorrectionsFeedbackPresenter.cs
  • src/TypeWhisper.Linux/Services/LearnedCorrectionsNotificationService.cs
  • src/TypeWhisper.Linux/Services/LearnedCorrectionsToastController.cs
  • src/TypeWhisper.Linux/Services/LinuxDictationFinalTextPolicy.cs
  • src/TypeWhisper.Linux/Services/LinuxDictationReadbackLanguagePolicy.cs
  • src/TypeWhisper.Linux/Services/LinuxDictationShortSpeechPolicy.cs
  • src/TypeWhisper.Linux/Services/LinuxLiveTranscriptionStartupPolicy.cs
  • src/TypeWhisper.Linux/Services/LinuxPreferencesService.cs
  • src/TypeWhisper.Linux/Services/LinuxSystemTtsProvider.cs
  • src/TypeWhisper.Linux/Services/LlmCleanupService.cs
  • src/TypeWhisper.Linux/Services/LlmStreamPump.cs
  • src/TypeWhisper.Linux/Services/Localization/Loc.cs
  • src/TypeWhisper.Linux/Services/Localization/StrExtension.cs
  • src/TypeWhisper.Linux/Services/ManagedArtifacts/ManagedDirectoryTransaction.cs
  • src/TypeWhisper.Linux/Services/ManagedArtifacts/ManagedFileSpec.cs
  • src/TypeWhisper.Linux/Services/ManagedArtifacts/ManagedFileState.cs
  • src/TypeWhisper.Linux/Services/ManagedArtifacts/ManagedFileTransaction.cs
  • src/TypeWhisper.Linux/Services/ManagedArtifacts/PrivilegedManagedFileTransaction.cs
  • src/TypeWhisper.Linux/Services/MediaPauseService.cs
  • src/TypeWhisper.Linux/Services/MemoryService.cs
  • src/TypeWhisper.Linux/Services/ModelManagerService.cs
  • src/TypeWhisper.Linux/Services/OverlayCoordinator.cs
  • src/TypeWhisper.Linux/Services/PcmPlaybackService.cs
  • src/TypeWhisper.Linux/Services/PcmPlayerResolver.cs
  • src/TypeWhisper.Linux/Services/Plugins/PluginEventBus.cs
  • src/TypeWhisper.Linux/Services/Plugins/PluginHostServices.cs
  • src/TypeWhisper.Linux/Services/Plugins/PluginLoader.cs
  • src/TypeWhisper.Linux/Services/Plugins/PluginLocalityClassifier.cs
  • src/TypeWhisper.Linux/Services/Plugins/PluginManager.cs
  • src/TypeWhisper.Linux/Services/Plugins/PluginProcessSupervisorScope.cs
  • src/TypeWhisper.Linux/Services/Plugins/PluginRegistryService.cs
  • src/TypeWhisper.Linux/Services/Plugins/RegistryPlugin.cs
  • src/TypeWhisper.Linux/Services/Plugins/TolerantJsonStringEnumConverter.cs
  • src/TypeWhisper.Linux/Services/ProcessPriority.cs
  • src/TypeWhisper.Linux/Services/ProcessRunner.cs
  • src/TypeWhisper.Linux/Services/PromptPaletteService.cs
  • src/TypeWhisper.Linux/Services/PromptProcessingService.cs
  • src/TypeWhisper.Linux/Services/RecentTranscriptionsService.cs
  • src/TypeWhisper.Linux/Services/RecorderFileNamer.cs
  • src/TypeWhisper.Linux/Services/RecordingNotificationService.cs
  • src/TypeWhisper.Linux/Services/SecretProtectionMigrationService.cs
  • src/TypeWhisper.Linux/Services/SettingsBackupService.cs
  • src/TypeWhisper.Linux/Services/Setup/AutoPasteSetupTask.cs
  • src/TypeWhisper.Linux/Services/Setup/ClipboardSetupTask.cs
  • src/TypeWhisper.Linux/Services/Setup/GlobalHotkeySetupTask.cs
  • src/TypeWhisper.Linux/Services/Setup/ISetupTask.cs
  • src/TypeWhisper.Linux/Services/Setup/PackageInstaller.cs
  • src/TypeWhisper.Linux/Services/SoundFeedbackService.cs
  • src/TypeWhisper.Linux/Services/SpeechFeedbackService.cs
  • src/TypeWhisper.Linux/Services/SpokenCommand/SpokenCommandIntent.cs
  • src/TypeWhisper.Linux/Services/SpokenCommand/SpokenCommandKeyphrase.cs
  • src/TypeWhisper.Linux/Services/SpokenCommand/SpokenCommandText.cs
  • src/TypeWhisper.Linux/Services/StartupCancellation.cs
  • src/TypeWhisper.Linux/Services/StartupService.cs
  • src/TypeWhisper.Linux/Services/StreamingSampleRateConverter.cs
  • src/TypeWhisper.Linux/Services/StreamingTranscriptState.cs
  • src/TypeWhisper.Linux/Services/StreamingTranscriptionCoordinator.cs
  • src/TypeWhisper.Linux/Services/SystemCommandAvailabilityService.cs
  • src/TypeWhisper.Linux/Services/TargetAppCorrectionLearningService.cs
  • src/TypeWhisper.Linux/Services/TextInsertionService.cs
  • src/TypeWhisper.Linux/Services/TranscriptionLanguageSelectionInvoker.cs
  • src/TypeWhisper.Linux/Services/TransformSelectionService.cs
  • src/TypeWhisper.Linux/Services/TranslationService.cs
  • src/TypeWhisper.Linux/Services/TrayIconService.cs
  • src/TypeWhisper.Linux/Services/UiOperationGuard.cs
  • src/TypeWhisper.Linux/Services/UpdateCheckService.cs
  • src/TypeWhisper.Linux/Services/UrlLauncher.cs
  • src/TypeWhisper.Linux/Services/WatchFolderExportBuilder.cs
  • src/TypeWhisper.Linux/Services/WatchFolderModels.cs
  • src/TypeWhisper.Linux/Services/WatchFolderService.cs
  • src/TypeWhisper.Linux/Services/WaylandSessionDetector.cs
  • src/TypeWhisper.Linux/Services/XdgPaths.cs
  • src/TypeWhisper.Linux/TypeWhisper.Linux.csproj
  • src/TypeWhisper.Linux/ViewModels/DictationOverlayViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/MainWindowViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/AboutSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/AdvancedSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/AppearanceSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/DashboardSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/DictationSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/DictionarySectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/FileTranscriptionQueueItemStatus.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/FileTranscriptionQueueItemViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/FileTranscriptionSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/GeneralSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/HistorySectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/PluginCollectionViewModels.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/PluginsSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/ProfilesSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/PromptsSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/RecorderSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/ShortcutsSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/Sections/SnippetsSectionViewModel.cs
  • src/TypeWhisper.Linux/ViewModels/WelcomeWizardViewModel.cs
  • src/TypeWhisper.Linux/Views/DictationOverlayWindow.axaml
  • src/TypeWhisper.Linux/Views/DictationOverlayWindow.axaml.cs
  • src/TypeWhisper.Linux/Views/RecentTranscriptionsPaletteWindow.axaml.cs
  • src/TypeWhisper.Linux/Views/Sections/AboutSection.axaml
  • src/TypeWhisper.Linux/Views/Sections/AboutSection.axaml.cs
  • src/TypeWhisper.Linux/Views/Sections/DashboardSection.axaml
  • src/TypeWhisper.Linux/Views/Sections/DictationSection.axaml
  • src/TypeWhisper.Linux/Views/Sections/DictationSection.axaml.cs
  • src/TypeWhisper.Linux/Views/Sections/DictionarySection.axaml.cs
  • src/TypeWhisper.Linux/Views/Sections/FileTranscriptionSection.axaml
  • src/TypeWhisper.Linux/Views/Sections/FileTranscriptionSection.axaml.cs
  • src/TypeWhisper.Linux/Views/Sections/GeneralSection.axaml
  • src/TypeWhisper.Linux/Views/Sections/HistorySection.axaml
  • src/TypeWhisper.Linux/Views/Sections/HistorySection.axaml.cs
  • src/TypeWhisper.Linux/Views/Sections/PluginsSection.axaml
  • src/TypeWhisper.Linux/Views/Sections/ProfilesSection.axaml
  • src/TypeWhisper.Linux/Views/Sections/ProfilesSection.axaml.cs
  • src/TypeWhisper.Linux/Views/Sections/PromptsSection.axaml
  • src/TypeWhisper.Linux/Views/Sections/RecorderSection.axaml.cs
  • src/TypeWhisper.Linux/Views/Sections/ShortcutsSection.axaml
  • src/TypeWhisper.Linux/Views/Sections/ShortcutsSection.axaml.cs
  • src/TypeWhisper.Linux/Views/Sections/SnippetsSection.axaml
  • src/TypeWhisper.Linux/Views/Sections/SnippetsSection.axaml.cs
  • src/TypeWhisper.Linux/Views/WelcomeWizard.axaml.cs
  • src/TypeWhisper.PluginSDK/Helpers/OpenAiApiHelper.cs
  • src/TypeWhisper.PluginSDK/Helpers/OpenAiChatHelper.cs
  • src/TypeWhisper.PluginSDK/Helpers/OpenAiTranscriptionHelper.cs
  • src/TypeWhisper.PluginSDK/Helpers/SseEventDecoder.cs
  • src/TypeWhisper.PluginSDK/IActionPlugin.cs
  • src/TypeWhisper.PluginSDK/IAdditionalLlmProvidersProvider.cs
  • src/TypeWhisper.PluginSDK/IAdditionalTranscriptionEnginesProvider.cs
  • src/TypeWhisper.PluginSDK/ILlmProviderPlugin.cs
  • src/TypeWhisper.PluginSDK/ILlmProviderRole.cs
  • src/TypeWhisper.PluginSDK/ILlmProviderSelectionIdentity.cs
  • src/TypeWhisper.PluginSDK/IMemoryStoragePlugin.cs
  • src/TypeWhisper.PluginSDK/IModelCatalogProvider.cs
  • src/TypeWhisper.PluginSDK/IPluginEventBus.cs
  • src/TypeWhisper.PluginSDK/IPluginHostServices.cs
  • src/TypeWhisper.PluginSDK/IPluginSettingsActivity.cs
  • src/TypeWhisper.PluginSDK/IPluginSettingsProvider.cs
  • src/TypeWhisper.PluginSDK/IPluginStateStore.cs
  • src/TypeWhisper.PluginSDK/IPostProcessorPlugin.cs
  • src/TypeWhisper.PluginSDK/IStreamingSession.cs
  • src/TypeWhisper.PluginSDK/ITranscriptionEnginePlugin.cs
  • src/TypeWhisper.PluginSDK/ITranscriptionEngineRole.cs
  • src/TypeWhisper.PluginSDK/ITranscriptionEngineSelectionIdentity.cs
  • src/TypeWhisper.PluginSDK/ITranscriptionLanguageSelectionCapabilities.cs
  • src/TypeWhisper.PluginSDK/ITtsProviderPlugin.cs
  • src/TypeWhisper.PluginSDK/LanguageSelection.cs
  • src/TypeWhisper.PluginSDK/LanguageSelectionNotSupportedException.cs
  • src/TypeWhisper.PluginSDK/Models/ActionCompletedEvent.cs
  • src/TypeWhisper.PluginSDK/Models/ActionResult.cs
  • src/TypeWhisper.PluginSDK/Models/LlmResponseTokenEvent.cs
  • src/TypeWhisper.PluginSDK/Models/PartialTranscriptionUpdateEvent.cs
  • src/TypeWhisper.PluginSDK/Models/PluginCategory.cs
  • src/TypeWhisper.PluginSDK/Models/PluginEvent.cs
  • src/TypeWhisper.PluginSDK/Models/PluginLogLevel.cs
  • src/TypeWhisper.PluginSDK/Models/PluginManifest.cs
  • src/TypeWhisper.PluginSDK/Models/PluginNetworkAccess.cs
  • src/TypeWhisper.PluginSDK/Models/TextInsertedEvent.cs
  • src/TypeWhisper.PluginSDK/Models/TranscriptionAccelerationBackend.cs
  • src/TypeWhisper.PluginSDK/Models/TranscriptionAccelerationPreference.cs
  • src/TypeWhisper.PluginSDK/Models/TtsPurpose.cs
  • src/TypeWhisper.PluginSDK/PcmPlayback.cs
  • src/TypeWhisper.PluginSDK/PluginSelectionExtensions.cs
  • src/TypeWhisper.PluginSDK/Processes/IPluginProcessSupervisor.cs
  • src/TypeWhisper.PluginSDK/Processes/ProcessContracts.cs
  • src/TypeWhisper.PluginSDK/WebSockets/ClientWebSocketTransport.cs
  • src/TypeWhisper.PluginSDK/WebSockets/WebSocketSessionPump.cs
  • src/TypeWhisper.PluginSDK/WebSockets/WebSocketTransportContracts.cs
  • tests/Directory.Packages.props
  • tests/PluginManagerTestAccess.cs
  • tests/TestPaths.cs
  • tests/TypeWhisper.Cli.Tests/AssemblyInfo.cs
  • tests/TypeWhisper.Cli.Tests/CliConnectionResolverTests.cs
  • tests/TypeWhisper.Cli.Tests/CommandLineParserTests.cs
  • tests/TypeWhisper.Cli.Tests/DiscoveryFileReaderTests.cs
  • tests/TypeWhisper.Cli.Tests/ProgramDispatchTests.cs
  • tests/TypeWhisper.Cli.Tests/ProtocolResponseValidationTests.cs
  • tests/TypeWhisper.Cli.Tests/QuickCommandTimeoutTests.cs
  • tests/TypeWhisper.Cli.Tests/SocketShutdown.cs
  • tests/TypeWhisper.Cli.Tests/TranscribeCommandTests.cs
  • tests/TypeWhisper.Cli.Tests/TypeWhisper.Cli.Tests.csproj
  • tests/TypeWhisper.Cli.Tests/UnixSocketApiClientTests.cs
  • tests/TypeWhisper.Cli.Tests/UsageTextTests.cs
  • tests/TypeWhisper.Cli.Tests/packages.lock.json
  • tests/TypeWhisper.Core.Tests/InterProcessFileLockTests.cs
  • tests/TypeWhisper.Core.Tests/Models/AppSettingsTests.cs
  • tests/TypeWhisper.Core.Tests/Models/ErrorCategoryGuardTests.cs
  • tests/TypeWhisper.Core.Tests/Models/TranscriptionRecordTests.cs
  • tests/TypeWhisper.Core.Tests/ResilientDownloaderTests.cs
  • tests/TypeWhisper.Core.Tests/Services/AtomicFileWriteTests.cs
  • tests/TypeWhisper.Core.Tests/Services/AtomicJsonStoreTests.cs
  • tests/TypeWhisper.Core.Tests/Services/CancellationOriginGuardTests.cs
  • tests/TypeWhisper.Core.Tests/Services/CleanupServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Services/DictionaryServiceCorrectionsTests.cs
  • tests/TypeWhisper.Core.Tests/Services/DictionaryServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Services/ErrorLogServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Services/HistoryInsightsServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Services/HistoryServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Services/LocalModelStorageServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Services/MatchProfileCascadeTests.cs
  • tests/TypeWhisper.Core.Tests/Services/NumberWordNormalizerTests.cs
  • tests/TypeWhisper.Core.Tests/Services/PostProcessingPipelineTests.cs
  • tests/TypeWhisper.Core.Tests/Services/ProfileServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Services/PromptActionServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Services/SettingsServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Services/SettingsUpdateGuardTests.cs
  • tests/TypeWhisper.Core.Tests/Services/SnippetServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Services/SubtitleExporterTests.cs
  • tests/TypeWhisper.Core.Tests/Services/TranscriptionNumberNormalizationServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Services/VocabularyBoostingServiceTests.cs
  • tests/TypeWhisper.Core.Tests/Translation/MarianTokenizerTests.cs
  • tests/TypeWhisper.Core.Tests/TypeWhisper.Core.Tests.csproj
  • tests/TypeWhisper.Core.Tests/packages.lock.json
  • tests/TypeWhisper.Integration.Tests/AssemblyInfo.cs
  • tests/TypeWhisper.Integration.Tests/BoundedTest.cs
  • tests/TypeWhisper.Integration.Tests/DictationOrchestratorCompositionTests.cs
  • tests/TypeWhisper.Integration.Tests/DictationOrchestratorOverlayOwnershipTests.cs
  • tests/TypeWhisper.Integration.Tests/DictationOrchestratorStreamedCommandTests.cs
  • tests/TypeWhisper.Integration.Tests/DictationOrchestratorTerminalMultilineFallbackTests.cs
  • tests/TypeWhisper.Integration.Tests/IntegrationEnvironment.cs
  • tests/TypeWhisper.Integration.Tests/OrchestratorCompositionFixture.cs
  • tests/TypeWhisper.Integration.Tests/OverlayCoordinationInterleavingTests.cs
  • tests/TypeWhisper.Integration.Tests/PrivateAppLifecycleInvoker.cs
  • tests/TypeWhisper.Integration.Tests/ServiceGraphLifecycleTests.cs
  • tests/TypeWhisper.Integration.Tests/TestDoubles/HeadlessPlatformDoubles.cs
  • tests/TypeWhisper.Integration.Tests/TestDoubles/RecordingTextInsertionPlatform.cs
  • tests/TypeWhisper.Integration.Tests/TestDoubles/RecordingTranscriptionPlugin.cs
  • tests/TypeWhisper.Integration.Tests/TestDoubles/ScriptedCommandDoubles.cs
  • tests/TypeWhisper.Integration.Tests/TypeWhisper.Integration.Tests.csproj
  • tests/TypeWhisper.Integration.Tests/packages.lock.json
  • tests/TypeWhisper.Linux.Tests/AboutSectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/ActionPluginExecutionHostTests.cs
  • tests/TypeWhisper.Linux.Tests/ActionResultLocalizationTests.cs
  • tests/TypeWhisper.Linux.Tests/ActiveWindowServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/AdvancedSectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/ApiDiscoveryFileTests.cs
  • tests/TypeWhisper.Linux.Tests/ApiKeyProtectionTests.cs
  • tests/TypeWhisper.Linux.Tests/ApiSocketOwnershipTests.cs
  • tests/TypeWhisper.Linux.Tests/AppBootstrapTests.cs
  • tests/TypeWhisper.Linux.Tests/AppHotkeyReconcileTests.cs
  • tests/TypeWhisper.Linux.Tests/AppInsertionStrategyRowTests.cs
  • tests/TypeWhisper.Linux.Tests/AppShutdownOrderTests.cs
  • tests/TypeWhisper.Linux.Tests/AppVersionCompareTests.cs
  • tests/TypeWhisper.Linux.Tests/AppearanceSectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/AtSpiBrowserCatalogTests.cs
  • tests/TypeWhisper.Linux.Tests/AtSpiEventClientFocusTests.cs
  • tests/TypeWhisper.Linux.Tests/AtSpiUrlExtractorProcessTests.cs
  • tests/TypeWhisper.Linux.Tests/AtSpiUrlExtractorTests.cs
  • tests/TypeWhisper.Linux.Tests/AtomicFileWriterTests.cs
  • tests/TypeWhisper.Linux.Tests/AudioDuckingServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/AudioFileServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/AudioRecordingServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/BrowserAccessibilityCatalogProjectionTests.cs
  • tests/TypeWhisper.Linux.Tests/BrowserAccessibilityFirefoxUserJsTests.cs
  • tests/TypeWhisper.Linux.Tests/BrowserAccessibilityLauncherDiscoveryTests.cs
  • tests/TypeWhisper.Linux.Tests/BrowserAccessibilityManagedArtifactTests.cs
  • tests/TypeWhisper.Linux.Tests/BrowserDescriptorCatalogTests.cs
  • tests/TypeWhisper.Linux.Tests/BundledPluginDeployerTests.cs
  • tests/TypeWhisper.Linux.Tests/CliInstallServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/CompositorShortcutWriterConcurrencyTests.cs
  • tests/TypeWhisper.Linux.Tests/ControlSocketOwnershipTests.cs
  • tests/TypeWhisper.Linux.Tests/ControlSocketServerTests.cs
  • tests/TypeWhisper.Linux.Tests/CudaLibraryPathSetupServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/DashboardSectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/DefaultDeviceWatcherTests.cs
  • tests/TypeWhisper.Linux.Tests/DesktopWriterFormattingTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationCancellationOriginTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationInFlightSessionTrackerTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationInsertionOrderGateTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationOrchestratorActionPluginRoutingTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationOrchestratorActionResultTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationOrchestratorDiscardFeedbackTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationOrchestratorInsertionFailureRecordingTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationOrchestratorPostProcessingLanguageTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationOrchestratorPreviewFallbackTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationOrchestratorPromptActionResolutionTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationOrchestratorStartFeedbackTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationOrchestratorStreamingInsertionTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationOverlayViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationOverlayWindowTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationSectionViewModelLocalizationTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationSectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationShortcutSpecFactoryTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationShutdownTests.cs
  • tests/TypeWhisper.Linux.Tests/DictationToggleGateTests.cs
  • tests/TypeWhisper.Linux.Tests/DictionarySectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/EvdevDeviceReaderTests.cs
  • tests/TypeWhisper.Linux.Tests/EvdevGlobalShortcutBackendTests.cs
  • tests/TypeWhisper.Linux.Tests/FakeDeShortcutWriter.cs
  • tests/TypeWhisper.Linux.Tests/FakeProcessRunner.cs
  • tests/TypeWhisper.Linux.Tests/FileTranscriptionSectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/GlobalHotkeySetupTaskTests.cs
  • tests/TypeWhisper.Linux.Tests/GnomeShortcutWriterTests.cs
  • tests/TypeWhisper.Linux.Tests/GnomeWindowCallsSetupHelperTests.cs
  • tests/TypeWhisper.Linux.Tests/HistorySectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/HotkeyServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/HttpApiAccelerationDtoTests.cs
  • tests/TypeWhisper.Linux.Tests/HttpApiCorrectionsDtoTests.cs
  • tests/TypeWhisper.Linux.Tests/HttpApiLocalFileDtoTests.cs
  • tests/TypeWhisper.Linux.Tests/HttpApiRequestDispatcherTests.cs
  • tests/TypeWhisper.Linux.Tests/HttpApiRequestParserTests.cs
  • tests/TypeWhisper.Linux.Tests/HttpApiSecretProtectionTests.cs
  • tests/TypeWhisper.Linux.Tests/HttpApiUnixSocketTests.cs
  • tests/TypeWhisper.Linux.Tests/InputAccessSetupHelperTests.cs
  • tests/TypeWhisper.Linux.Tests/KdeShortcutWriterTests.cs
  • tests/TypeWhisper.Linux.Tests/LanguageSelectionResolverTests.cs
  • tests/TypeWhisper.Linux.Tests/LearnedCorrectionsFeedbackPresenterTests.cs
  • tests/TypeWhisper.Linux.Tests/LearnedCorrectionsNotificationServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/LinuxDictationFinalTextPolicyPerformanceTests.cs
  • tests/TypeWhisper.Linux.Tests/LinuxDictationReadbackLanguagePolicyTests.cs
  • tests/TypeWhisper.Linux.Tests/LinuxLiveTranscriptionStartupPolicyTests.cs
  • tests/TypeWhisper.Linux.Tests/LinuxPreferencesServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/LinuxSystemTtsProviderTests.cs
  • tests/TypeWhisper.Linux.Tests/LlmCleanupServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/LlmStreamPumpTests.cs
  • tests/TypeWhisper.Linux.Tests/LocalizationResourcesTests.cs
  • tests/TypeWhisper.Linux.Tests/ManagedDirectoryTransactionTests.cs
  • tests/TypeWhisper.Linux.Tests/ManagedFileTransactionTests.cs
  • tests/TypeWhisper.Linux.Tests/MediaPauseServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/OverlayCoordinatorTests.cs
  • tests/TypeWhisper.Linux.Tests/PcmPlaybackServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/PluginCollectionSettingsViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/PluginMetadataConsumerParityTests.cs
  • tests/TypeWhisper.Linux.Tests/PluginRegistryInstallerTests.cs
  • tests/TypeWhisper.Linux.Tests/PluginRegistryServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/PrivilegedManagedFileTransactionTests.cs
  • tests/TypeWhisper.Linux.Tests/ProcessPriorityTests.cs
  • tests/TypeWhisper.Linux.Tests/ProcessRunnerTests.cs
  • tests/TypeWhisper.Linux.Tests/ProcessSupervisorInventoryTests.cs
  • tests/TypeWhisper.Linux.Tests/ProfilesSectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/PromptPaletteServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/PromptProcessingServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/PromptsSectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/ProviderProcessRunnerTests.cs
  • tests/TypeWhisper.Linux.Tests/RecentTranscriptionStoreTests.cs
  • tests/TypeWhisper.Linux.Tests/RecentTranscriptionsServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/RecorderFileNamerTests.cs
  • tests/TypeWhisper.Linux.Tests/RecorderSectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/RecordingNotificationServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/SecretProtectionMigrationServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/SentinelBlockTests.cs
  • tests/TypeWhisper.Linux.Tests/SessionAudioFileServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/SettingsBackupServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/SharpHookGlobalShortcutBackendTests.cs
  • tests/TypeWhisper.Linux.Tests/ShortcutDispatcherTests.cs
  • tests/TypeWhisper.Linux.Tests/ShortcutMatcherTests.cs
  • tests/TypeWhisper.Linux.Tests/ShortcutsSectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/SnippetsSectionViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/SocketPathResolverTests.cs
  • tests/TypeWhisper.Linux.Tests/SoundFeedbackServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/SpeechFeedbackServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/SpokenCommandActionMatcherTests.cs
  • tests/TypeWhisper.Linux.Tests/StartupServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/StreamingSampleRateConverterTests.cs
  • tests/TypeWhisper.Linux.Tests/StreamingTranscriptStateTests.cs
  • tests/TypeWhisper.Linux.Tests/StreamingTranscriptionCoordinatorTests.cs
  • tests/TypeWhisper.Linux.Tests/SystemCommandAvailabilityServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/TargetAppCorrectionLearningServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/TestPathsTests.cs
  • tests/TypeWhisper.Linux.Tests/TestPluginManagerFactory.cs
  • tests/TypeWhisper.Linux.Tests/TestShortcutBackend.cs
  • tests/TypeWhisper.Linux.Tests/TextInsertionServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/TransformSelectionServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/TrayIconServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/TypeWhisper.Linux.Tests.csproj
  • tests/TypeWhisper.Linux.Tests/UiOperationGuardTests.cs
  • tests/TypeWhisper.Linux.Tests/UrlLauncherTests.cs
  • tests/TypeWhisper.Linux.Tests/WatchFolderExportBuilderTests.cs
  • tests/TypeWhisper.Linux.Tests/WatchFolderServiceTests.cs
  • tests/TypeWhisper.Linux.Tests/WaylandSessionDetectorTests.cs
  • tests/TypeWhisper.Linux.Tests/WelcomeWizardViewModelTests.cs
  • tests/TypeWhisper.Linux.Tests/XdgPathsTests.cs
  • tests/TypeWhisper.Linux.Tests/YdotoolSetupHelperTests.cs
  • tests/TypeWhisper.Linux.Tests/packages.lock.json
  • tests/TypeWhisper.PluginSystem.Tests/ActionPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/AssemblyAiStreamingFinalizeTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/AssemblyInfo.cs
  • tests/TypeWhisper.PluginSystem.Tests/BundledPluginManifestTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/BundledTranscriptionLanguageConformanceTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/ClaudePluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/CloudflareAsrPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/CudaRuntimeCacheClearTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/CudaRuntimeProvisionerTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/ElevenLabsPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/FileMemoryPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/GemmaLocalPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/GladiaPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/GoogleCloudSttPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/GroqPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/HistoryRetentionCoordinatorTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/LanguageSelectionInvokerTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/LanguageSelectionTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/LinearPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/ModelManagerServiceTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/ObsidianPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/OpenAiApiHelperTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/OpenAiChatGptClientTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/OpenAiChatHelperTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/OpenAiCompatiblePluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/OpenAiPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/OpenAiTranscriptionHelperTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/OpenAiVectorMemoryPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/OpenRouterPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/PcmPlaybackSdkTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/Persistence/AtomicJsonStoreConformanceTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/PluginCatalogTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/PluginEventBusTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/PluginEventsTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/PluginHostServicesTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/PluginLoaderTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/PluginManagerTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/PluginManifestTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/PluginRegistryServiceTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/ProcessTestDoubles.cs
  • tests/TypeWhisper.PluginSystem.Tests/Qwen3SttPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/RecordingPcmPlaybackService.cs
  • tests/TypeWhisper.PluginSystem.Tests/Reson8PluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/ScriptCollectionSettingsTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/ScriptProcessTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/ScriptedWebSocketTransport.cs
  • tests/TypeWhisper.PluginSystem.Tests/SharedHelperStreamingCohortTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/SherpaOnnxCancellationTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/SherpaOnnxLanguageTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/SmallestAiPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/SonioxPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/SpeechmaticsPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/SseConsumerConformanceTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/SseEventDecoderTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/StreamingProviderAdapterConformanceTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/StreamingProviderDisposalTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/StreamingProviderFailurePropagationTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/SupertonicTtsPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/TypeWhisper.PluginSystem.Tests.csproj
  • tests/TypeWhisper.PluginSystem.Tests/VoxtralPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/WebSocketSessionPumpConformanceTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/WebhookCollectionSettingsTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/WhisperCppPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/XaiPluginTests.cs
  • tests/TypeWhisper.PluginSystem.Tests/packages.lock.json
  • tests/TypeWhisper.ProcessTestChild/Program.cs
  • tests/TypeWhisper.ProcessTestChild/TypeWhisper.ProcessTestChild.csproj
  • tests/installers/managed-artifact-conformance.sh
  • tests/workflows/PluginCatalog.Tests.ps1
  • tests/workflows/PluginSmokeDiscovery.Tests.ps1
  • tests/workflows/PublishPluginReleaseTransaction.Tests.ps1

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

📝 Walkthrough

Walkthrough

The PR adds synchronized settings updates, preview-only dictionary corrections, safer model migration, ordered dictation insertion, improved clipboard and AT-SPI verification, model auto-unload lifecycle handling, concurrency protections, text-processing fixes, desktop shortcut mappings, localization, and extensive Core/Linux test coverage.

Changes

Core persistence and text processing

Layer / File(s) Summary
Dictionary and settings persistence
src/TypeWhisper.Core/Interfaces/*, src/TypeWhisper.Core/Services/DictionaryService*, src/TypeWhisper.Core/Services/SettingsService.cs, tests/TypeWhisper.Core.Tests/Services/{DictionaryService,SettingsService,VocabularyBoostingService}Tests.cs
Adds side-effect-free correction previews, case-insensitive CSV correction upserts, and synchronized settings mutation APIs with concurrency coverage.
Text processing and metrics
src/TypeWhisper.Core/Services/{CleanupService,HistoryInsightsService,PostProcessingPipeline,SubtitleExporter}.cs, src/TypeWhisper.Core/Translation/MarianTokenizer.cs, src/TypeWhisper.Core/Models/TextInsertionStatus.cs, tests/TypeWhisper.Core.Tests/...
Tightens filler matching, handles whitespace and long subtitle durations, classifies action outcomes, and distinguishes caller cancellation from internal step cancellation.
Repeated-phrase detection
src/TypeWhisper.Linux/Services/LinuxDictationFinalTextPolicy.cs, tests/TypeWhisper.Linux.Tests/LinuxDictationFinalTextPolicyPerformanceTests.cs
Adds stable rolling-hash precomputation with exact verification and performance coverage.

Model and dictation lifecycle

Layer / File(s) Summary
Safe model storage migration
src/TypeWhisper.Core/Services/LocalModelStorageService.cs, tests/TypeWhisper.Core.Tests/Services/LocalModelStorageServiceTests.cs
Copies model and plugin assets with staging and atomic replacement, commits settings, then performs guarded best-effort source cleanup.
Model auto-unload lifecycle
src/TypeWhisper.Linux/Services/ModelManagerService.cs, tests/TypeWhisper.PluginSystem.Tests/ModelManagerServiceTests.cs, src/TypeWhisper.Linux/Services/{FileTranscriptionProcessor,HttpApiService}.cs
Schedules auto-unload across load and lease paths, supports keepModelWarm, bounds timer intervals, and moves scheduling responsibility into lease/model lifecycle handling.
Ordered dictation orchestration
src/TypeWhisper.Linux/Services/{DictationOrchestrator,DictationInFlightSessionTracker,DictationInsertionOrderGate}.cs, related Linux tests
Tracks session cleanup, orders overlapping insertions, handles unavailable action targets and thrown insertion failures, resolves post-processing language, and avoids duplicate preview corrections.

Insertion and Linux integration

Layer / File(s) Summary
Insertion safety and paste verification
src/TypeWhisper.Linux/Services/TextInsertionService.cs, src/TypeWhisper.Linux/Services/Insertion/*, src/TypeWhisper.Linux/Services/ProcessRunner.cs, related tests
Tracks partial typing, prevents duplicate paste fallback, detects non-text clipboard formats, verifies pasted text through AT-SPI, removes Wayland xdotool fallback, and improves process timeout cleanup.
Concurrency and transform safety
src/TypeWhisper.Linux/Services/{StreamingTranscriptState,TransformSelectionService}.cs, src/TypeWhisper.Linux/Services/ActiveWindow/AtSpiEventClient.cs, src/TypeWhisper.Linux/Services/TargetAppCorrectionLearningService.cs, related tests
Rejects stale transcript commits, preserves newer focus state, disarms failed learning sessions, and avoids replacing selections after target drift.

Estimated code review effort: 5 (Critical) | ~120 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 3

❌ Failed checks (2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 9.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning The template is present, but all required sections are effectively empty placeholders. Fill in Summary, Related Issue, Test Plan, and Notes with concrete details about the changes and validation performed.
Title check ❓ Inconclusive The title is too vague to convey the main change. Rename it to summarize the primary code changes, e.g. settings atomicity, plugin cleanup, and test updates.
✅ Passed checks (2 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch audit-tier1

Comment @coderabbitai help to get the list of available commands.

coderabbitai[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

coderabbitai[bot]

This comment was marked as resolved.

@csmashe

csmashe commented Jul 26, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@csmashe

csmashe commented Jul 27, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@csmashe

csmashe commented Jul 27, 2026

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@csmashe
csmashe changed the base branch from target-app-autocorrection-learning to linux July 27, 2026 19:22

@github-advanced-security github-advanced-security AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CodeQL found more than 20 potential problems in the proposed changes. Check the Files changed tab for more details.

csmashe added 13 commits July 27, 2026 22:05
…s (§9 L6)

The subfolder setting was joined directly onto the vault path and the
directory created with no validation, so values like ../outside (or a
rooted path) wrote notes outside the selected vault, and a symlinked
child silently redirected writes anywhere on disk.

ExecuteAsync now rejects rooted subfolders, requires the normalized
join to stay at or under the normalized vault root (separator-boundary
compare, so /vault-evil cannot pass for /vault), and then resolves the
target component-by-component (64-link budget) before any directory is
created — an in-vault symlink target is allowed, an outside target is
refused, and refusal happens before CreateDirectory so no directories
materialize outside the vault. Daily-note mode additionally re-checks
the resolved note file itself before appending, because FileMode.Append
follows an existing symlinked .md out of the vault; individual-note
mode needs no such check since FileMode.CreateNew refuses existing
links. Nonexistent segments are treated as literal via Path.Exists
(not Directory.Exists), which keeps dangling escaping links rejected.

Known residual, accepted for this tier: a symlink swapped in between
check and append (TOCTOU) requires pre-existing in-vault write access.

New failure strings localized in en/de/es/ru. Nine new tests cover
traversal, rooted, normalize-out, prefix-bypass, nested-legitimate,
in-vault and outside-vault symlinks, traversal-through-link directory
creation, and the daily-note append escape; all mutation-proven.
…ump (§12 M4; closes §9 L1)

Ten streaming plugins each carried their own copy of the WebSocket
lifecycle — socket creation, fragmented receive assembly, send
serialization, terminal signaling, receive-fault propagation, close
budgets, abort, disposal — and the copies had drifted: Gladia, Soniox,
Speechmatics, SmallestAI, and Reson8 treated a pre-terminal close as
success (silently accepting truncated transcripts), Reson8 accepted any
flush confirmation regardless of ID, ElevenLabs could double-emit its
committed transcript, and xAI/ElevenLabs waited unbounded on the send
lock before their bounded close.

The SDK now owns the lifecycle in WebSocketSessionPump: explicit
states, one send gate for startup/audio/keepalive/finalize/close,
complete fragmented-message assembly with a size cap, CAS first-fault
that wins atomically over cancellation, required-terminal policies
(normal close or EOF before the provider's documented terminal frame is
an incomplete-stream failure), bounded close with exactly-once abort,
shared-disposal task with a deferred transport reaper, and subscriber
isolation. Providers are adapters supplying only URI/auth, payload
encoding, inbound parsing, and terminal policy, over an injectable
transport so the conformance suite runs without a network.

Closes §9 L1 inside the AssemblyAI adapter: finalize snapshots the
residual audio buffer (previously dropped), pads it with silence to the
provider's 1600-byte / 50 ms minimum chunk, and sends it under the same
serialized batch as Terminate so nothing can interleave.

Review hardening on top of the migration: shared finalize task made
uncancellable so one caller's token cannot poison other callers;
cancelled mid-batch sends mark the outbound stream indeterminate and
fail later sends loudly; OpenAI finalize waits for every committed item
(not just the final one); terminal-before-readiness faults startup
instead of stranding it; xAI's 10 s readiness budget no longer covers
the TCP/TLS handshake.

Tier 1 fault-handling guarantees are pinned by the untouched oracle
suites (failure propagation, disposal, eight provider protocol suites,
streaming coordinator). New conformance/adapter/finalize tests are
mutation-proven, and all completion awaits are bounded at 10 s so a
regression fails instead of hanging CI.
…sactional contract (§12 M1)

File-backed state was independently implemented across Core, Linux, and
plugins: Settings used a fixed .tmp plus best-effort backup copy, most
stores staged through AtomicFileWrite but disagreed on synchronization,
backup recovery, corruption handling, mutation-before-write ordering,
rollback, and whether callers observed failure; the two memory plugins
carried their own temp/replace implementations because plugins cannot
reference Core.

AtomicJsonStore<T> now owns the transaction layer above AtomicFileWrite
(which stays the sole staging/replace/permissions implementation and
gained only an internal staged-write observer for fault-injection
tests): per-path process-local coordination shared across instances AND
across closed generic types, serialized update transactions whose
commit decision is made on the serialized form (object equality would
compare an in-place mutation against itself and drop it), last-known-
good backup written before the primary with backup failure aborting the
transaction, explicit corrupt-file policies (preserve exact bytes once
per distinct content with source permissions, or throw), backup
recovery that atomically restores the primary, unreadable files
surfacing instead of becoming writable defaults, cache publication and
revision bump only after commit, and precise rollback — on a failed
write the cache is dropped only when it actually diverged from the
committed form.

Migrated: Settings, History, Dictionary (+CSV partial), Profile,
Prompt Actions, Snippets, Error Log, Linux preferences, plugin-host
settings/secrets, both Watch Folder stores, and — via the new SDK
IPluginStateStore<T>/OpenStateStore with leaf-name + containment
validation and a default-throwing interface member — FileMemory and
OpenAI Vector Memory (whose whole-operation serialization is restored;
a dropped semaphore had let a concurrent clear be undone). Best-effort
callers keep their outward policy but no longer publish uncommitted
memory. SettingsChanged now fires outside the store lock as one unit
under a service gate, only when the stored value actually changed.

Deliberate behavior choices per the audit design: unreadable (as
opposed to corrupt) settings/preferences surface the error rather than
falling back to defaults-then-save, which would clobber a recoverable
user file; ErrorLog and Watch Folder history retain their explicitly
best-effort degrade-on-unreadable contracts. PA28's Save-idiom call
sites and §12 M3's installer AtomicFileWriter are out of scope.

One shared conformance matrix exercises every migrated store adapter
for concurrent updates, interrupted writes (staged-hook fault
injection), corrupt primaries, failed replacement, rollback,
permissions, and temp uniqueness; engine behaviors are additionally
unit-tested and mutation-proven.
…ementations preserved

First fork-side merge from the parent repository. Resolution policy:
the fork's Linux implementations win wherever the trees diverged — all
plugins (including both sides' independent ElevenLabs work), the Core
stores (freshly migrated to AtomicJsonStore), the streaming sessions
(freshly migrated to WebSocketSessionPump), the SDK, CI workflows, and
docs. The fork's deliberate exclusions stay excluded: the entire
src/TypeWhisper.Windows WPF app (upstream's modifications and new
files, including ones git's directory-rename detection redirected into
src/TypeWhisper.Linux, were not imported), WPF plugin SettingsViews,
Windows packaging workflows/scripts, and the LiveTranscript/
GraniteSpeech plugins. Upstream deleted the Profile/PromptAction stack
in favor of a workflow model; the fork keeps its stack.

What landed: dependabot config, THIRD-PARTY-NOTICES, TESTING_GUIDE,
artifacts/ gitignore entry, ExportLabels, self-contained sync JSON
models, Marian doc comments, CLI support helper, and release-note docs.
Roughly 120 upstream additions that reference upstream-only APIs
(user-data sync feature, plural-hotkey settings model, Windows-app
source-text layout tests, Store packaging) were dropped rather than
half-imported; ~/Documents/UPSTREAM-MERGE-REPORT.md lists every
excluded file and the upstream features that need deliberate porting
(mic-priority stabilization, wizard lifetime fix, uninstall data
protection, Parakeet update path, WhisperCpp CUDA installer).

Validated: full solution build 0/0, Core battery 192/192, Linux battery
91/91, PluginSystem battery 179/180 — the single failure is the known
load-sensitive CloseTimeout wall-clock bound, 4/4 green in isolation.
…AI-Compatible keys become clearable (§9 L2)

A stored OpenAI-Compatible profile API key could never be removed:
GetItemsAsync deliberately never echoes secrets (null), the host
converted that null to "" on load and blindly serialized every field's
current value on save, so SetItemsAsync received "" for both an
untouched secret and one the user explicitly emptied — and mapped both
through NullIfWhiteSpace to 'keep'.

The host collection editor now tracks per-field user modification (set
only by setter-routed edits; initial population and __id identity
repair reset it) and serializes Secret-kind collection fields as null
when untouched and as their actual value — including "" — when
modified. Secret modification also participates in draft detection so
an ambient refresh cannot rebuild the field VMs and silently drop an
explicit clear. Backward-compatible: OpenAI-Compatible's api-key is the
only Secret-kind collection field in the tree (Webhook's secret field
resolves as Multiline), and plugins receiving null hit exactly the same
keep-path their NullIfWhiteSpace guards applied to the old "".

The plugin now treats null as keep, "" with a stored key as an explicit
clear — deleting the secret through the paired host op before the
profile-set swap and dropping the model catalog under the existing
credentials-change rule — "" without a stored key as a no-op, and
non-blank as replace. The api-key field description was rewritten in
all four plugin locales; the old text ('Leave blank to keep the current
key') described the unfixable pre-fix behavior.

Both sides are mutation-proven: always-serialize-Value fails the host
suite; reverting keep-on-blank fails the plugin clear test.
…12, reduced scope)

The audit's shared-allocator consolidation was re-scoped with the user:
recon showed every collision bug it targeted was already closed by
site-specific fixes (RecorderFileNamer suffixing, Watch Folder atomic
create-new, Obsidian create-new plus its interprocess append lock), so
a repo-wide allocator would have added a public plugin API for one
consumer without closing any defect. Two real residuals remained.

Recorder transcript sidecars were written with overwrite semantics
after the WAV committed, so a foreign file claiming the .txt path in
that window was silently destroyed. The sidecar now goes through
AtomicFileWrite.WriteAllTextCreateNew; on collision the foreign file is
preserved byte-for-byte and the existing StatusTranscriptSaveFailed
status is surfaced. Deliberately no independent suffix: loading and
deletion assume the .wav/.txt stems match, and failing safely beats an
undiscoverable sidecar.

AtomicFileWrite.PublishCreateNew could betray its no-replace contract:
on filesystems without hard-link support it fell back to an
overwrite-capable File.Move whose existence check and rename are
separate syscalls. The fallback is now renameat2(RENAME_NOREPLACE) on
Linux (EntryPointNotFoundException on pre-2.28 glibc fails closed),
File.Move(overwrite: false) on Windows, and a fail-closed IOException
anywhere no non-replacing primitive exists.

Mutation-proven: reverting the Recorder call fails the foreign-sidecar
test; an overwrite-capable fallback fails the fail-closed test (which
forces a non-EEXIST renameat2 failure via the staged-write observer —
collision tests alone cannot reach that branch on RENAME_NOREPLACE
filesystems, a vacuity found and fixed during verification).
… bypasses (§12 M2; absorbs §6 L1; co-lands PA57)

Seventeen production files launched or supervised child processes with
their own copies of timeout, cancellation, pipe-drain, kill, and reap
logic, and the copies disagreed: probes that never drained redirected
pipes (a chatty gdbus response could wedge the GNOME Window Calls check
past its budget — §6 L1), an ffmpeg invocation that embedded quoted
user paths in a shell-style argument string (PA57's injection
condition), TTS players with hand-rolled Exited handling, and a pactl
monitor with its own restart logic.

ProcessRunner is now the one supervisor: typed one-shots (RunProbe /
RunOneShotAsync with Exited/TimedOut/StartFailed outcomes, Discard/
Utf8/Binary capture, and an explicit post-exit pipe policy — RequireEof
for parsed output, AbandonAfterGrace for children like xclip whose
selection daemon inherits our pipes), long-lived sessions (line-mode
pumps, idempotent Terminate/Dispose converging on one kill/reap task),
and detached process/URI launches that reap the launcher parent without
touching its descendants. Commands are argv-only — no shell strings.
Caller cancellation kills the owned tree, reaps, then rethrows; private
timeouts do the same cleanup and return TimedOut; a child that closes
stdin early no longer escapes cleanup with the deadline unenforced.

Plugins reach the supervisor through IPluginHostServices.Processes
(default-throwing member), scoped per plugin: sessions are tracked,
TerminateAll stops work on unload, and a retired scope refuses new
launches while a failed deactivation leaves it usable. PA32 (process-
group containment) and PA33 (kill on unsignaled failure) are NOT
absorbed — internal seams only.

All seventeen bypasses migrated; conformance is proven against a real
controllable child process (stdin/output pressure, cancellation vs
timeout races, tree kill, delayed exit, abandoned pipes, sessions,
detached launch). Review hardening on top: bounded session drain so a
descendant holding pipes cannot hang Completion (and leak TTS temp
WAVs), the xclip AbandonAfterGrace policy restored, and the ChatGPT
no-browser error path made reachable again. Key behaviors are
mutation-proven, including the §6 L1 rule that a timed-out probe never
reads as installed.
csmashe added 30 commits August 22, 2026 14:20
…stop lifecycle)

Overlay (major): feedback expiry now arms at PRESENTATION, not
publication — a toast that loses arbitration keeps its display budget
while suppressed instead of expiring retired unseen behind a recording,
which silently dropped every detection-failure toast raised mid-session.
Workflow ownership resets only on Hide (explicit relinquish) and slot
retirement; a state-driven blank published mid-workflow through
Show/Update keeps ownership, so a streaming command's terminal outcome
still ranks TerminalFeedback. Both pinned by tests proven against
reverted-behavior mutants.

Ducking (major): _isDucked returns to end-of-duck computation with a
separate _duckInProgress re-entry guard, restoring the invariant that
RestoreAudio no-ops while a duck is mid-flight — the eager flag let a
concurrent restore put the original volume back and drop the entry just
before the duck's queued set-volume landed, leaving the stream ducked
with nothing tracking it.

Speech (minors): Dispose waits a bounded 500ms for the stop worker so a
well-behaved TTS provider is stopped before process exit (children are
not killed by parent exit) while a hung plugin costs only the budget;
the ReadBack toggle-off and superseded-launch paths complete their
detached requests, closing the same per-toggle CTS leak PA74 fixed; and
SpeakAsync tolerates a disposed cancellation source on a stale deferred
launch.
…ardening, shared test helper, transform cleanup)

- Rename the Pester rejection test to drop the scalar-categories claim the
  @() wrap silently promotes, and document that canonical categoryNames
  precedence (not manifest order) picks the legacy singular category.
- Note that ComputeContentFingerprint survives only for tests fabricating a
  published identity (production markers come from the packaging script),
  and why WritePublishedIdentity deletes the marker before hashing.
- Harden SettingsUpdateGuard: find the repo root via the repository-unique
  TypeWhisper.slnx marker and assert the src scan examined at least one
  file after bin/obj exclusion.
- Deduplicate SetTranscriptionEngines into a linked shared helper
  (tests/PluginManagerTestAccess.cs) used by the integration composition
  and recorder view-model suites.
- Wrap the audio-owner interleaving test's transform workflow in
  try/finally so a mid-test failure still cancels dictation, awaits the
  failed transform start, and stops a live transform session via a queued
  cancel command instead of leaking the shared audio capture.
…LI discovery, sun_path headroom

- smoke-test: tarball/AppImage containers now call install_ubuntu_probe_infrastructure
  explicitly instead of getting dbus-run-session only through dbus-x11's transitive
  Depends on dbus-daemon; xvfb moves out of install_ubuntu_runtime since every caller
  now installs it via the probe helper, keeping the runtime list to the app's closure.
- CliInstallService: dev source-root discovery walks up from AppContext.BaseDirectory
  (bounded to 8 levels) until a directory containing TypeWhisper.Cli appears, instead
  of a fixed four-parent hop that lands wrong for RID-specific or publish output
  layouts; packaged Cli/ candidate precedence and the test seam are preserved, and a
  null source root limits discovery to the packaged candidate. Tests pin the net10.0,
  RID, and RID/publish depths.
- SettingsBackupServiceTests: shorter socket-test path segments (sock/Data/s.sock) so
  the bound Unix socket path stays under Linux's 108-byte sun_path limit, which the
  long temp-dir prefix was already brushing against.
- ProcessRunnerTests: the unsupported-stdin fault only surfaces once the
  private deadline completes the exit wait, and the runner then kills the
  child; a 500 ms deadline could kill a slow-starting child before it
  published its PID. Raise the deadline to 3 s so PID publication wins
  while the run still finishes inside the 5 s WaitAsync guard.
- AppHotkeyReconcileTests: use Assert.Equal instead of message-only
  Assert.True so failures report expected and actual values; keep the
  description parameter as a case label via an explicit discard.
- DictationOrchestratorStartFeedbackTests: production swallows cue
  exceptions, so record the lease and disposal state the cue observed and
  assert after the helper returns instead of asserting in the callback.
- DictationSectionViewModelTests: construct SystemCommandAvailabilityService
  with FakeProcessRunner so the capability snapshot never probes host
  commands from microphone-selection tests.
- DictationToggleGateTests: document that the barging assertion depends on
  SemaphoreSlim.Release handing the permit to the queued waiter while
  m_currentCount stays zero (runtime behavior, not a gate contract).
- EvdevDeviceReaderTests: raise the concurrent-dispose threshold to 950 ms
  (serialized disposals burn two 500 ms waits, so detection is preserved)
  and make the poll-parking probe fail with a message naming the probe,
  distinguishing wchan-less/hidepid hosts from a reader that never parked,
  instead of timing out with a bare TaskCanceledException.
- InputAccessSetupHelperTests: resolve the lock-prefix/group-remove shim
  commands through the PATH captured before the fixture restricts it,
  failing with a command-specific message when resolution misses.
- TextInsertionServiceTests: refresh the suppression comment to describe
  the current convenience overload including optional clipboardToolName.
- DictationOrchestratorStreamedCommandTests: note that Typed is cumulative
  across both phases so the repeated FirstDelta is intentional.
- Localization catalogs: move the four Shortcuts.NativeDictation* entries
  to their alphabetical slot (after MoreShortcuts, before NoAutomaticSetup)
  identically in en/de/es/ru; values unchanged.
PR69: FormatDynamicHotkeyRejection falls back to unlocalized diagnostic
text for unmapped kind/reason pairs instead of aborting the apply pass;
HotkeyService/control-socket disposal moved after the HTTP quiesce so an
admitted profile-toggle request cannot touch a disposed service; the
evdev reader's DisposeAsync no longer closes raw fds under a worker that
outlived the wake budget (the worker's own finally disposes on return);
ClipboardFallbackMessage snapshots LastFailureReason once; the evdev
wake-fd path verifies cancellation before reporting a cancel and
surfaces a wake-without-cancel invariant breach; input_group_member
restores globbing with set +f on every return; profile-toggle validation
maps the three collision statuses explicitly with a neutral fallback for
future statuses; clipboard tool-name identities become
LinuxCapabilitySnapshot constants; DisplayName fallback documented.

PR70: SetOverlayState derives publications from the coordinator's slot
state instead of the orchestrator's mirror, so expired feedback cannot
be resurrected from stale mirror flags; the indeterminate-commit
exception now carries PublishedPath and the watch-folder records it so a
failed directory sync still points history at the transcript on disk;
watch-folder readiness gates only plugin-qualified selections (blank or
non-plugin IDs reach the processor's immediate invalid-model error);
ApplyConfiguredMicrophone persists its re-resolution only when the
captured selection is still current, re-running against a newer one;
OneShotTimer guards its callback so a dispatcher throw during shutdown
cannot kill the process; RegistryPlugin caches the legacy category
mapping on first read.

PR71: known-extension requests without ffmpeg answer 503
audio_importer_unavailable from the shared transcription path (covers
local-file and upload routes) instead of a generic 500, with an endpoint
test; the backup walk's guarded-secret set is call-local, threaded
through the traversal, so concurrent CreateBackup calls on the singleton
cannot see each other's capture.
…yload

AudioDuckingService.RestoreAudio returned immediately whenever it landed
while DuckAudio was still running, because _isDucked only flips true in the
duck's finally. Shutdown, disposal, or session loss racing a duck therefore
dropped the restore entirely: the duck went on to lower every sink input and
nothing ever put the volumes back, leaving the user's playback quiet for good.

Record the request in _restorePending and run it from the duck's finally once
the last set-volume has landed. That keeps the ordering guarantee the guard
existed for -- a restore can still never overtake a queued duck -- while
closing the path where the restore was silently discarded.

The RPM smoke check piped rpm2cpio into cpio under `set -o pipefail`. cpio
stops reading at the archive trailer, so a payload whose padding is still
being written hands rpm2cpio a SIGPIPE and the release gate rejects a valid
RPM. Stage the payload to a file and extract from it.
…toast, and pin overlay/registry edge cases in tests
…ection toast, overlay/registry test hardening
Audit tier 4: correctness backlog fixes (PA72-PA75, PA85, PA89, PA96-98, PA105, PA111, PA113, PA116)
Code audit tier 3.2: PA52-PA58
Both sides fixed the RPM rpm2cpio SIGPIPE independently; kept the staged
extraction with tier1's temp-file cleanup. Tier1's install_fedora_runtime is
gone on this side — the RPM's declared dependencies must resolve inside the
container to stay validated — so the fedora smoke image now pre-bakes only
probe tooling (dbus/Xvfb), the ubuntu bake also pre-installs its probe
tooling, and tier1's dnf mirror-retry hardening carries into the surviving
dnf invocations.
The tarball flow wrote a file into the install root and demanded the
installer preserve it across a reinstall, which made the second install
refuse with "recorded destination was customized" and failed the gate.

Nothing writes there. TypeWhisperEnvironment.BasePath is a fixed
$XDG_DATA_HOME/TypeWhisper, and BundledPluginDeployer only reads bundled
plugins out of the install root, deploying them to that data path. The
assertions date from de9801b, when INSTALL_ROOT *was* BasePath and the
installer's KEEP list was load-bearing; 4883029 moved the payload to
typewhisper-app and left them behind.

Assert what the split layout actually guarantees: a plain --uninstall
removes the whole payload root and keeps the data dir, and --purge
removes the data dir too, which nothing covered before. The second
install run stays as an explicit in-place-upgrade check.
PR #51 raised 151 alerts; none is a defect. The tree is already swept to
zero ReSharper inspections, and several flagged sites carry a
// ReSharper disable with the reason the current form was chosen, so
security-and-quality reopens decisions that are already made.

Excluded, extending the rationale this file already records:

  useless-upcast          every hit is a cast the compiler needs -
                          (PluginCategory?)null for a switch expression's
                          natural type, (string?)null to pick a Moq
                          Returns overload, (Exception?)null to infer a
                          tuple element as nullable (else CS8619)
  missed-using-statement  finally-block disposal is structural: ownership
                          transfers to a returned ArtifactLock, or a test
                          disposes mid-body to assert idempotent disposal
  inefficient-containskey the two calls read different keys
  linq/*, complex-*,      restructuring preferences settled by
  ternary, boolean-expr   jb inspectcode

The disposal, constant-condition and float-equality rules stay enabled -
they can find real bugs - with this branch's instances dismissed one by
one. Fixes the two alerts worth acting on: an uncommented empty block
and a missing xmldoc summary.
The ProjectReference carried AdditionalProperties="DeployBundledLinuxPlugins=
false", which makes MSBuild treat TypeWhisper.Linux as a distinct build from
the plain reference TypeWhisper.Linux.Tests and TypeWhisper.PluginSystem.Tests
carry. Both configurations share one obj/bin directory, so a solution build
ran two instances of the project concurrently and they collided on
typewhisper.pdb: "AVLN9999: the process cannot access the file ... because it
is being used by another process". Intermittent, so the gate failed on one run
and passed on the next.

It was the solution's only global-property fork. The project-level
DeployBundledLinuxPlugins property went with it: project properties do not
flow to referenced projects, so it never skipped anything. The command-line
-p:DeployBundledLinuxPlugins=false the packaging script and the plugin
workflow already use stays the way to skip the deployment.
42033ef made the deb flow assert that the install transaction pulls in
neither libgl1 nor libdbus-1-3, both demoted from Depends to Recommends.
82d774b baked the full runtime closure - those two included - into one
prepared Ubuntu image so the three Ubuntu formats stop downloading ~95 MB
apiece. Merging the two redesigns left the deb container starting from an
image where both libraries are already installed, so the assertion could
never hold, and a Depends that had gone missing would have been masked by
the pre-seeded closure rather than caught.

The deb now runs on the bare base image and resolves its own dependencies
there, which is what that format's test exists to prove. Tarball and
AppImage have no package resolver and keep using the prepared image, so the
download savings stand. The apt retry setting the prepared image supplied is
now a helper the deb flow calls too, or its install would race a slow mirror
with no retries.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants