{ "schemaVersion": "1.0", "contractVersion": "2.0.0", "observedAt": "2026-09-04", "purpose": "M0 compatibility baseline for the Tauri adapter and the Linux egui host", "sourceOfTruth": { "commands": "openless-all/app/src-tauri/src/lib.rs app_invoke_handler_* macros", "reactEvents": "openless-all/app/src/**/*.ts openless-all/app/src/**/*.tsx", "tauriEvents": "openless-all/app/src-tauri/src/**/*.rs", "coreContract": "docs/linux-egui-backend-contract.md" }, "platformDecision": { "windows": "tauri", "macos": "tauri", "android": "tauri-mobile", "linux": "egui", "coreCallModel": "in-process typed Rust calls", "workspaceIsolation": "root workspace contains openless-core and openless-linux-egui only; Tauri and backend compatibility tests use independent manifests and lockfiles" }, "commands": [ "accept_pending_correction", "add_correction_rule", "add_vocab", "app_check_update_with_channel", "app_download_and_install_android_update", "cancel_dictation", "cancel_selection_polish_preview", "cancel_selection_voice_intent_prompt", "chat_panel_focus_keyboard", "check_accessibility_permission", "check_microphone_permission", "check_network", "clear_history", "coding_agent_cancel_test", "coding_agent_command_risk", "coding_agent_detect", "coding_agent_detect_cli", "coding_agent_detect_opencode", "coding_agent_list_opencode_models", "coding_agent_run_test", "confirm_selection_polish_preview", "confirm_selection_voice_intent_prompt", "confirm_selection_voice_preview", "copy_text_to_clipboard", "create_channel", "create_style_pack_from_template", "debug_read_cursor_context", "delete_channel", "delete_channel_if_blank", "delete_history_entry", "delete_style_pack", "dismiss_insert_fallback_card", "dismiss_vocab_suggestions", "export_audio_recording", "export_error_log", "export_style_pack_to_zip", "fetch_latest_beta_release", "foundry_local_asr_cancel_prepare", "foundry_local_asr_catalog", "foundry_local_asr_delete_model", "foundry_local_asr_model_dir", "foundry_local_asr_prepare", "foundry_local_asr_release", "foundry_local_asr_reveal_model_dir", "foundry_local_asr_set_language_hint", "foundry_local_asr_set_model", "foundry_local_asr_set_runtime_source", "foundry_local_asr_status", "get_activity_stats", "get_android_accessibility_status", "get_android_overlay_status", "get_android_shizuku_status", "get_credentials", "get_default_style_system_prompts", "get_hotkey_capability", "get_hotkey_status", "get_platform_capabilities", "get_qa_hotkey_label", "get_remote_input_status", "get_startup_snapshot", "get_selection_polish_preview", "get_selection_voice_intent_prompt", "get_selection_voice_preview", "get_settings", "get_update_channel", "get_windows_ime_status", "github_device_flow_cancel", "github_device_flow_poll", "github_device_flow_start", "handle_window_hotkey_event", "hide_android_overlay", "import_style_pack_from_zip", "inject_hotkey_click_for_dev", "less_computer_approve", "less_computer_submit_text", "less_computer_sync", "less_computer_window_dismiss", "less_computer_window_open", "list_channels", "list_correction_rules", "list_history", "list_local_ips", "list_microphone_devices", "list_provider_descriptors", "list_provider_models", "list_style_packs", "list_vocab", "list_vocab_presets", "local_asr_activate", "local_asr_cancel_download", "local_asr_delete_model", "local_asr_download_model", "local_asr_engine_status", "local_asr_fetch_hf_card", "local_asr_fetch_remote_info", "local_asr_get_settings", "local_asr_list_models", "local_asr_model_dir", "local_asr_preload", "local_asr_release_engine", "local_asr_reveal_model_dir", "local_asr_reveal_models_root", "local_asr_set_active_model", "local_asr_set_keep_loaded_secs", "local_asr_set_mirror", "local_asr_set_models_base_dir", "local_asr_storage_settings", "local_asr_test_model", "log_client_error", "marketplace_auth_status", "marketplace_delete", "marketplace_detail", "marketplace_download", "marketplace_install", "marketplace_like", "marketplace_list", "marketplace_logout", "marketplace_my_likes", "marketplace_my_packs", "marketplace_upload", "open_external_url", "open_shizuku_app", "open_system_settings", "preview_style_pack_runtime", "qa_set_edit_instruction_mode", "qa_submit_text", "qa_toggle_recording", "qa_window_dismiss", "read_audio_recording", "read_credential", "record_channel_test", "recover_android_accessibility", "regenerate_remote_pin", "reject_pending_correction", "remove_correction_rule", "remove_vocab", "rename_channel", "reorder_channels", "repolish", "report_insert_fallback_card_height", "request_accessibility_permission", "request_android_accessibility_permission", "request_android_overlay_permission", "request_android_shizuku_permission", "request_microphone_permission", "reset_builtin_style_pack", "reset_accessibility_permission_and_restart_app", "restart_app", "retranscribe_recording", "revert_selection_voice_preview", "run_selection_polish_for_dev", "save_style_pack", "save_vocab_presets", "set_active_asr_provider", "set_active_llm_provider", "set_active_omni_provider", "set_active_style_pack", "set_channel_enabled", "set_channel_provider_type", "set_combo_hotkey", "set_correction_rule_enabled", "set_credential", "set_default_polish_mode", "set_dictation_hotkey", "set_open_app_hotkey", "set_qa_hotkey", "set_remote_locale", "set_selection_polish_hotkey", "set_settings", "set_shortcut_recording_active", "set_style_enabled", "set_style_pack_enabled", "set_style_pack_hotkeys", "set_switch_style_hotkey", "set_translation_hotkey", "set_update_channel", "set_vocab_enabled", "sherpa_onnx_asr_cancel_download", "sherpa_onnx_asr_cancel_prepare", "sherpa_onnx_asr_catalog", "sherpa_onnx_asr_delete_model", "sherpa_onnx_asr_download_model", "sherpa_onnx_asr_fetch_remote_info", "sherpa_onnx_asr_model_dir", "sherpa_onnx_asr_prepare", "sherpa_onnx_asr_release", "sherpa_onnx_asr_reveal_model_dir", "sherpa_onnx_asr_set_language_hint", "sherpa_onnx_asr_set_model", "sherpa_onnx_asr_status", "show_android_overlay", "start_dictation", "start_microphone_level_monitor", "stop_dictation", "stop_microphone_level_monitor", "trigger_microphone_prompt", "validate_combo_hotkey", "validate_provider_credentials", "validate_shortcut_binding" ], "commandOwnershipRules": { "coreCandidates": [ "dictation", "settings", "credentials-status", "providers", "history", "vocabulary", "style-packs", "local-asr", "selection", "qa", "remote-input", "marketplace", "coding-agent" ], "hostOnly": [ "window/tray/focus/drag", "clipboard and system settings launch", "permission prompts", "Android overlay/JNI/Shizuku", "Tauri updater/dialog/shell/autostart/single-instance" ], "rule": "A command is a Tauri adapter until its use-case is implemented by openless-core; UI/window side effects never move into core." }, "events": [ "android-update:progress", "capsule:state", "chat-panel:closing", "chat-panel:shown", "coding-agent:test", "credentials:changed", "fn-shortcut-pressed", "foundry-local-asr-prepare-progress", "insert:fallback", "less-computer-glow:active", "less-computer:event", "local-asr-download-progress", "local-asr-token", "local-asr:engine-changed", "microphone:devices-changed", "microphone:level", "prefs:changed", "qa:dismiss", "qa:level", "qa:state", "remote-input:error", "remote-input:running", "remote:result", "selection-polish-preview:shown", "selection-voice-intent:shown", "sherpa-onnx-asr-download-progress", "sherpa-onnx-asr-prepare-progress", "tauri://resize", "vocab:suggested", "vocab:updated" ], "eventOwnership": { "coreSemantic": { "capsule:state": "map DictationStateChanged and DictationCompleted to the legacy capsule payload", "coding-agent:test": "map CodingAgentTest typed stream events", "credentials:changed": "map CredentialsChanged", "foundry-local-asr-prepare-progress": "map LocalAsrPrepareProgress for the Foundry runtime", "insert:fallback": "map InsertFallback; Tauri retains capsule-window presentation", "less-computer:event": "map typed LessComputerEvent payloads", "local-asr-download-progress": "map DownloadProgress after local-ASR adapter migration", "local-asr-token": "map session-scoped TranscriptDelta", "local-asr:engine-changed": "map LocalAsrEngineChanged", "microphone:devices-changed": "map MicrophoneDevicesChanged as an invalidation signal", "prefs:changed": "map PreferencesChanged", "qa:level": "map session-scoped QaLevel while dropping the internal session id from the legacy payload", "qa:state": "map typed QaState payloads", "remote-input:error": "map RemoteInputFailed without a PIN or credential value", "remote-input:running": "map RemoteInputStatusChanged without a PIN or credential value", "remote:result": "retired global broadcast: remote-server subscribes directly to owner-scoped Core events; the H5 result message remains compatible", "sherpa-onnx-asr-download-progress": "map LocalAsrDownloadProgress for the sherpa-onnx runtime", "sherpa-onnx-asr-prepare-progress": "map LocalAsrPrepareProgress for the sherpa-onnx runtime", "vocab:suggested": "map VocabularySuggestionsChanged", "vocab:updated": "map VocabularyChanged as an invalidation signal" }, "tauriHost": { "android-update:progress": "Android Tauri updater progress", "chat-panel:closing": "WebView exit animation", "chat-panel:shown": "WebView entry animation", "fn-shortcut-pressed": "physical-host shortcut capture", "less-computer-glow:active": "WebView GPU/presentation lifecycle", "microphone:level": "host-owned settings-page microphone monitor", "qa:dismiss": "Android/Tauri window dismissal", "selection-polish-preview:shown": "Tauri window presentation", "selection-voice-intent:shown": "Tauri window presentation", "tauri://resize": "framework window event" }, "migrationRequired": {} }, "coreEventKinds": [ "backend_started", "backend_stopping", "dictation_state_changed", "transcript_delta", "polish_delta", "dictation_completed", "recording_control_requested", "selection_state_changed", "selection_voice_state_changed", "insert_fallback", "preferences_changed", "credentials_changed", "history_changed", "vocabulary_changed", "style_packs_changed", "download_progress", "permission_changed", "hotkey_status_changed", "notification", "coding_agent_test", "less_computer_event", "local_asr_prepare_progress", "local_asr_download_progress", "local_asr_engine_changed", "microphone_devices_changed", "qa_level", "qa_state", "remote_input_status_changed", "remote_input_failed", "vocabulary_suggestions_changed" ], "domainInterfaces": [ "ProviderApi", "LocalAsrApi", "SelectionApi", "QaApi", "RemoteInputApi", "MarketplaceApi", "CodingAgentApi", "PlatformApi" ], "capabilities": { "coreFields": [ "platform", "supportsDesktopHotkey", "supportsTray", "supportsOverlay", "supportsImeInput", "supportsLocalAsr", "supportsAutoUpdate" ], "hostStatusFields": [ "microphonePermission", "accessibilityPermission", "microphoneDevice", "fcitx5Insertion", "x11OrWayland", "resourceLayout", "singleInstance", "updater" ], "linuxMatrix": [ "x11", "wayland", "fcitx5-ready", "fcitx5-missing", "tray-available", "tray-unavailable", "microphone-granted", "microphone-denied", "microphone-no-device", "updater-supported", "updater-unsupported" ] }, "compatibilityRules": { "legacyTauriNames": "remain in the Tauri adapter only", "coreSerialization": "serde camelCase DTOs and stable snake_case event tags", "secretHandling": "credential values, authorization headers and PINs never appear in DTOs/events/errors/logs", "sequence": "core event sequence starts at 1 and is strictly increasing per backend instance", "laggedSubscription": "UI must resync from snapshot/query after a lagged receiver error", "breakingChange": "increment contractVersion and document a migration", "additiveChange": "new optional fields require a default" }, "counts": { "tauriCommandsObserved": 199, "legacyEventsObserved": 30, "coreEventKindsDefined": 30 }, "implementationStatus": { "sharedRepositories": "preferences, history, activity, vocabulary, correction, style packs", "sharedCredentialContract": "CredentialDirectory owns provider channel mutation, ordering and active selection; Host stores metadata and SecretValue", "complexDomains": "stable interfaces exist; Linux production injects QA, Remote Input, Selection, Provider, Model and Coding Agent adapters", "linuxAdapters": "credentials/provider UI, resources, packaged Qwen runtime, fcitx5 insertion/hotkeys/selection preview, capabilities, cpal recording, QA, TLS Remote Input, host actions, single-instance intent broker and native runtime lifecycle", "releaseGate": "Linux release requires successful artifacts and real Ubuntu audio, focus/input, install, upgrade, and rollback evidence" }, "status": "all 30 legacy events and 30 Core events are classified under contract 2.0.0; real-platform release evidence remains gated" }