Integrate ASR/Omni fixes, API Route, Android IME and confirmation-based vocabulary learning. Complete settings transitions and macOS single-item credential storage. Synchronize all application versions to 2.0.0-Beta.4+build.20260930. Integrated PRs: #1116, #1120, #1121, #1123, #1124, #1067 and #1128. Linux #1117 remains independent and is excluded from automatic release. Validated: full cross-platform CI, 18 UI motion cases, 112 frontend test files, 1245 Core tests (1 ignored) and 572 macOS native tests. Co-authored-by: HKLHaoBin <we3q@qq.com>
419 lines
14 KiB
JSON
419 lines
14 KiB
JSON
{
|
|
"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_keep_loaded_secs",
|
|
"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",
|
|
"selection_voice_level",
|
|
"remote_input_status_changed",
|
|
"remote_input_failed",
|
|
"vocabulary_suggestions_changed",
|
|
"cloud_sync_state_changed",
|
|
"cloud_sync_conflict_detected",
|
|
"cloud_sync_restore_completed"
|
|
],
|
|
"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": 200,
|
|
"legacyEventsObserved": 30,
|
|
"coreEventKindsDefined": 34
|
|
},
|
|
"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 34 Core events are classified under contract 2.0.0; real-platform release evidence remains gated"
|
|
}
|