* 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
94 lines
3.6 KiB
Bash
94 lines
3.6 KiB
Bash
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
APP_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)
|
|
VERSION=${OPENLESS_LINUX_VERSION:?OPENLESS_LINUX_VERSION is required}
|
|
ARCH=${OPENLESS_LINUX_ARCH:-x86_64}
|
|
TARGET_DIR=${CARGO_TARGET_DIR:-"$APP_ROOT/target"}
|
|
BINARY="$TARGET_DIR/release/openless-linux-egui"
|
|
PLUGIN_ROOT="$APP_ROOT/../scripts/linux-fcitx5-plugin/build"
|
|
QWEN_RUNTIME="$APP_ROOT/src-tauri/vendor/qwen-asr/qwen_asr"
|
|
PACKAGING="$APP_ROOT/linux-egui/packaging"
|
|
OUTPUT="$TARGET_DIR/linux-egui-packages"
|
|
ICON="$APP_ROOT/src-tauri/icons/128x128@2x.png"
|
|
|
|
test -x "$BINARY"
|
|
test -s "$PLUGIN_ROOT/libopenless.so"
|
|
test -s "$PLUGIN_ROOT/openless.conf"
|
|
test -x "$QWEN_RUNTIME"
|
|
test -s "$PACKAGING/openless.desktop"
|
|
test -s "$PACKAGING/top.openless.OpenLess.metainfo.xml"
|
|
test -s "$ICON"
|
|
command -v fpm >/dev/null
|
|
command -v appimagetool >/dev/null
|
|
|
|
mkdir -p "$OUTPUT"
|
|
|
|
stage_common() {
|
|
local root=$1
|
|
install -Dm755 "$BINARY" "$root/usr/bin/openless"
|
|
install -Dm644 "$PACKAGING/openless.desktop" \
|
|
"$root/usr/share/applications/openless.desktop"
|
|
install -Dm644 "$PACKAGING/top.openless.OpenLess.metainfo.xml" \
|
|
"$root/usr/share/metainfo/top.openless.OpenLess.metainfo.xml"
|
|
install -Dm644 "$ICON" "$root/usr/share/icons/hicolor/256x256/apps/openless.png"
|
|
install -Dm755 "$QWEN_RUNTIME" \
|
|
"$root/usr/lib/openless/resources/qwen-asr/qwen_asr"
|
|
}
|
|
|
|
DEB_ROOT="$TARGET_DIR/linux-egui-deb-root"
|
|
rm -rf "$DEB_ROOT"
|
|
stage_common "$DEB_ROOT"
|
|
install -Dm755 "$PLUGIN_ROOT/libopenless.so" \
|
|
"$DEB_ROOT/usr/lib/x86_64-linux-gnu/fcitx5/libopenless.so"
|
|
install -Dm644 "$PLUGIN_ROOT/openless.conf" \
|
|
"$DEB_ROOT/usr/share/fcitx5/addon/openless.conf"
|
|
fpm -s dir -t deb -C "$DEB_ROOT" \
|
|
-n openless -v "$VERSION" -a amd64 \
|
|
--description "OpenLess Linux egui host" \
|
|
--license AGPL-3.0-only \
|
|
--url https://github.com/Open-Less/openless \
|
|
-d fcitx5 -d fcitx5-module-dbus -d libdbus-1-3 -d libasound2 -d libopenblas0-pthread \
|
|
-p "$OUTPUT/OpenLess-Linux-egui-${VERSION}-${ARCH}.deb" .
|
|
|
|
RPM_ROOT="$TARGET_DIR/linux-egui-rpm-root"
|
|
rm -rf "$RPM_ROOT"
|
|
stage_common "$RPM_ROOT"
|
|
install -Dm755 "$PLUGIN_ROOT/libopenless.so" \
|
|
"$RPM_ROOT/usr/lib64/fcitx5/libopenless.so"
|
|
install -Dm644 "$PLUGIN_ROOT/openless.conf" \
|
|
"$RPM_ROOT/usr/share/fcitx5/addon/openless.conf"
|
|
fpm -s dir -t rpm -C "$RPM_ROOT" \
|
|
-n openless -v "$VERSION" -a x86_64 \
|
|
--description "OpenLess Linux egui host" \
|
|
--license AGPL-3.0-only \
|
|
--url https://github.com/Open-Less/openless \
|
|
-d fcitx5 -d dbus-libs -d alsa-lib -d openblas \
|
|
-p "$OUTPUT/OpenLess-Linux-egui-${VERSION}-${ARCH}.rpm" .
|
|
|
|
APPDIR="$TARGET_DIR/OpenLess.AppDir"
|
|
rm -rf "$APPDIR"
|
|
stage_common "$APPDIR"
|
|
install -Dm755 "$PLUGIN_ROOT/libopenless.so" \
|
|
"$APPDIR/usr/lib/openless/resources/linux-fcitx5-plugin/libopenless.so"
|
|
install -Dm644 "$PLUGIN_ROOT/openless.conf" \
|
|
"$APPDIR/usr/lib/openless/resources/linux-fcitx5-plugin/openless.conf"
|
|
QWEN_APPDIR="$APPDIR/usr/lib/openless/resources/qwen-asr"
|
|
while read -r library; do
|
|
case "$(basename "$library")" in
|
|
libc.so.*|libm.so.*|libpthread.so.*|libdl.so.*|librt.so.*|ld-linux-*.so.*) continue ;;
|
|
esac
|
|
install -Dm755 "$library" "$QWEN_APPDIR/$(basename "$library")"
|
|
done < <(ldd "$QWEN_RUNTIME" | awk '$2 == "=>" && $3 ~ /^\// { print $3 }')
|
|
for binary in "$QWEN_APPDIR"/*; do
|
|
patchelf --set-rpath '$ORIGIN' "$binary"
|
|
done
|
|
ln -s usr/bin/openless "$APPDIR/AppRun"
|
|
cp "$PACKAGING/openless.desktop" "$APPDIR/openless.desktop"
|
|
cp "$ICON" "$APPDIR/openless.png"
|
|
ln -s openless.png "$APPDIR/.DirIcon"
|
|
ARCH="$ARCH" appimagetool "$APPDIR" \
|
|
"$OUTPUT/OpenLess-Linux-egui-${VERSION}-${ARCH}.AppImage"
|
|
|
|
find "$OUTPUT" -maxdepth 1 -type f -printf '%f\n' | sort
|