Files
openless/docs/linux-egui-command-event-baseline.json
T
Chris233 fc38edd1a3 refactor: consolidate Core 2.0 and restore cross-platform behavior (#1019)
* refactor: split Linux egui host from shared backend

* fix: keep CI contracts portable across runners

* fix(ci): preserve CRLF while removing qwen dependency

* fix(ci): regenerate target lockfile and install ripgrep

* fix(ci): gate desktop-only selection voice module

* ci: limit native build parallelism on cross-platform runners

* fix(host): expose blocking task seam to coordinator

* fix(settings): avoid macOS default hotkey collision

* docs: record cross-platform CI evidence

* ci: expose Linux validation package artifact

* ci: grant reusable Linux package permissions

* refactor: remove legacy coordinator dictation facade

* ci: skip unsupported MSI prerelease builds

* ci: install minisign only for signed Linux releases

* fix: keep test-only coordinator session helper

* refactor: move style preview diagnostics into core

* fix: import shared preferences type from core

* refactor: centralize enabled vocabulary projection

* ci: install ripgrep for Linux package gates

* test: make source contract line-ending agnostic

* fix: keep Linux desktop entry standards compliant

* docs: expose core style diagnostics contract

* ci: resolve Linux package version in app directory

* refactor: centralize ASR vocabulary priority

* fix: use shared vocabulary note constant

* refactor: keep vocabulary priority inside core

* test: retain starting-stop queue coverage

* ci: scope Linux updater URL to the current repository

* docs: close implementation and artifact evidence

* docs: record final CI artifact evidence

* fix(android): align updater plugin versions

* fix(android): pin updater crate exactly

* refactor(core): remove unused type anchor

* docs: record final artifact runs

* fix(remote-input): preserve beta status fields

* fix(tauri): finish beta host merge

* fix(asr): pass scoped operation to native qwen adapter

* fix(macos): bundle mlx metallib as a resource

* test(remote-input): update status wire contract

* feat: share Less Computer voice flow with Linux

* refactor(core): centralize host-independent runtime policy

* refactor(core): complete 2.0 backend consolidation

* fix(ci): prepare Sherpa after cache restore

* fix(macos): route native model paths through Core store

* fix(macos): use ModelStore catalog API

* fix(ci): serialize macOS native test build

* test(ci): preserve macOS cargo diagnostics

* fix(macos): release input source lock before await

* test(core): replace legacy hotkey injection gate

* test(core): move Codex sandbox contract into Core

* fix(core): close final runtime policy gaps

* fix(windows): terminate coding agent process trees

* fix(core): complete local model migration

* fix(credentials): align Core LLM model account

* fix(core): restore 1.x parity across shared backend

* fix(android): complete shared backend stubs

* fix: close cross-platform migration review gaps

* fix: complete migration lifecycles and platform compatibility

* docs: define desktop 2.0 acceptance and Linux handoff

* fix: close desktop parity and session lifecycle gaps

* fix: finish voice lifecycle and desktop feedback parity

* fix: close desktop cancellation and feedback race gaps

* fix: honor proxy settings and reject stale session effects

* fix: dispatch native cleanup on host runtimes and order events

* fix: keep optional recording effects best effort

* fix: close desktop agent model and QA lifecycle gaps

* fix: preserve desktop raw voice and QA turn ownership

* fix: finalize desktop dictation and QA feedback
2026-09-06 18:39:46 +08:00

414 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_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"
}