From d32882443f1e6827e858237f11625eab31ec3f3d Mon Sep 17 00:00:00 2001 From: Hsdi Date: Fri, 19 Jun 2026 03:09:53 +0800 Subject: [PATCH] 20260619 --- .gitea/workflows/release.yml | 500 +++ .gitignore | 10 + CHANGELOG.md | 192 + CONTRIBUTING.md | 66 + Cargo.toml | 77 + Dockerfile.Miu_v1 | 111 + README.en.md | 147 + README.md | 142 + assets/Info.plist | 44 + assets/icon.png | Bin 0 -> 23026 bytes assets/icon@512.png | Bin 0 -> 43397 bytes assets/install-linux.sh | 81 + assets/make_icon.py | 169 + assets/meatshell.desktop | 13 + assets/meatshell.ico | Bin 0 -> 45154 bytes build.rs | 30 + docs/screenshots/01-welcome-en.png | Bin 0 -> 74606 bytes docs/screenshots/01-welcome.png | Bin 0 -> 67114 bytes docs/screenshots/02-terminal-btop.png | Bin 0 -> 216510 bytes docs/ui-layout.md | 120 + lang/en/LC_MESSAGES/meatshell.po | 355 ++ lang/zh/LC_MESSAGES/meatshell.po | 355 ++ src/app.rs | 5125 +++++++++++++++++++++++++ src/config.rs | 1267 ++++++ src/debug_log.rs | 155 + src/i18n.rs | 64 + src/keychain.rs | 331 ++ src/known_hosts.rs | 286 ++ src/main.rs | 46 + src/proxy.rs | 176 + src/serial.rs | 211 + src/sftp.rs | 1172 ++++++ src/ssh.rs | 962 +++++ src/ssh_config.rs | 244 ++ src/system.rs | 53 + src/telnet.rs | 272 ++ ui/app.slint | 1608 ++++++++ ui/confirm_dialog.slint | 123 + ui/fonts/CascadiaMono-Bold.ttf | Bin 0 -> 581704 bytes ui/fonts/CascadiaMono-Regular.ttf | Bin 0 -> 575912 bytes ui/fonts/MaterialIcons-Regular.ttf | Bin 0 -> 356840 bytes ui/session_dialog.slint | 454 +++ ui/sftp_panel.slint | 591 +++ ui/sidebar.slint | 499 +++ ui/tabs.slint | 223 ++ ui/terminal_view.slint | 2298 +++++++++++ ui/theme.slint | 64 + ui/welcome.slint | 589 +++ ui/widgets.slint | 174 + 49 files changed, 19399 insertions(+) create mode 100644 .gitea/workflows/release.yml create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 CONTRIBUTING.md create mode 100644 Cargo.toml create mode 100644 Dockerfile.Miu_v1 create mode 100644 README.en.md create mode 100644 README.md create mode 100644 assets/Info.plist create mode 100644 assets/icon.png create mode 100644 assets/icon@512.png create mode 100644 assets/install-linux.sh create mode 100644 assets/make_icon.py create mode 100644 assets/meatshell.desktop create mode 100644 assets/meatshell.ico create mode 100644 build.rs create mode 100644 docs/screenshots/01-welcome-en.png create mode 100644 docs/screenshots/01-welcome.png create mode 100644 docs/screenshots/02-terminal-btop.png create mode 100644 docs/ui-layout.md create mode 100644 lang/en/LC_MESSAGES/meatshell.po create mode 100644 lang/zh/LC_MESSAGES/meatshell.po create mode 100644 src/app.rs create mode 100644 src/config.rs create mode 100644 src/debug_log.rs create mode 100644 src/i18n.rs create mode 100644 src/keychain.rs create mode 100644 src/known_hosts.rs create mode 100644 src/main.rs create mode 100644 src/proxy.rs create mode 100644 src/serial.rs create mode 100644 src/sftp.rs create mode 100644 src/ssh.rs create mode 100644 src/ssh_config.rs create mode 100644 src/system.rs create mode 100644 src/telnet.rs create mode 100644 ui/app.slint create mode 100644 ui/confirm_dialog.slint create mode 100644 ui/fonts/CascadiaMono-Bold.ttf create mode 100644 ui/fonts/CascadiaMono-Regular.ttf create mode 100644 ui/fonts/MaterialIcons-Regular.ttf create mode 100644 ui/session_dialog.slint create mode 100644 ui/sftp_panel.slint create mode 100644 ui/sidebar.slint create mode 100644 ui/tabs.slint create mode 100644 ui/terminal_view.slint create mode 100644 ui/theme.slint create mode 100644 ui/welcome.slint create mode 100644 ui/widgets.slint diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml new file mode 100644 index 0000000..f869ed0 --- /dev/null +++ b/.gitea/workflows/release.yml @@ -0,0 +1,500 @@ +name: Release + +# Gitea Actions workflow: +# - pushes to main build the Windows GNU package and publish a build-date Release. +# - tag pushes (v*) build the Windows GNU package and publish the matching Release. +# - manual runs build the same package and publish a build-date Release. + +on: + push: + branches: ["main"] + tags: ["v*"] + workflow_dispatch: + +env: + HTTP_PROXY: "http://10.31.88.88:7891" + HTTPS_PROXY: "http://10.31.88.88:7891" + NO_PROXY: "localhost,127.0.0.1,.local,*.local" + +permissions: + contents: write + +jobs: + build-windows-gnu: + name: windows-x86_64-gnu + runs-on: Ubuntu_docker_act + + env: + TARGET: x86_64-pc-windows-gnu + BIN: meatshell.exe + CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER: x86_64-w64-mingw32-gcc + CARGO_TARGET_X86_64_PC_WINDOWS_GNU_AR: x86_64-w64-mingw32-ar + CC_x86_64_pc_windows_gnu: x86_64-w64-mingw32-gcc + CXX_x86_64_pc_windows_gnu: x86_64-w64-mingw32-g++ + AR_x86_64_pc_windows_gnu: x86_64-w64-mingw32-ar + WINDRES: x86_64-w64-mingw32-windres + PKG_CONFIG_ALLOW_CROSS: "1" + + steps: + - name: 显示代理配置 + shell: bash + run: | + echo "=== Proxy Configuration ===" + echo "HTTP_PROXY: ${HTTP_PROXY}" + echo "HTTPS_PROXY: ${HTTPS_PROXY}" + echo "NO_PROXY: ${NO_PROXY}" + echo "==========================" + + - name: 测试代理连通性 + shell: bash + run: | + echo "Testing proxy connectivity..." + if curl -x "${HTTP_PROXY}" -I --connect-timeout 10 https://google.com 2>&1 | grep -q "HTTP"; then + echo "✅ Proxy is working!" + else + echo "⚠️ Proxy test failed, but continuing..." + fi + + - name: 配置 Git 全局代理 + shell: bash + run: | + git config --global http.proxy ${HTTP_PROXY} + git config --global https.proxy ${HTTPS_PROXY} + git config --global http.sslVerify false + git config --global https.sslVerify false + echo "✅ Git proxy configured" + + - name: 配置 Cargo 代理 + shell: bash + run: | + mkdir -p ~/.cargo + printf '[http]\n' > ~/.cargo/config.toml + printf 'proxy = "%s"\n' "${HTTP_PROXY}" >> ~/.cargo/config.toml + printf 'check-revoke = false\n\n' >> ~/.cargo/config.toml + printf '[https]\n' >> ~/.cargo/config.toml + printf 'proxy = "%s"\n' "${HTTPS_PROXY}" >> ~/.cargo/config.toml + printf 'check-revoke = false\n\n' >> ~/.cargo/config.toml + printf '[net]\n' >> ~/.cargo/config.toml + printf 'git-fetch-with-cli = true\n' >> ~/.cargo/config.toml + printf 'retry = 10\n' >> ~/.cargo/config.toml + echo "✅ Cargo proxy configured" + cat ~/.cargo/config.toml + + - name: 配置 Cargo 环境变量 + shell: bash + run: | + echo "CARGO_HTTP_PROXY=${HTTP_PROXY}" >> $GITHUB_ENV + echo "CARGO_HTTPS_PROXY=${HTTPS_PROXY}" >> $GITHUB_ENV + echo "CARGO_HTTP_SSL_VERIFY=false" >> $GITHUB_ENV + echo "CARGO_HTTPS_SSL_VERIFY=false" >> $GITHUB_ENV + + - name: 配置 curl 默认代理 + shell: bash + run: | + mkdir -p ~/.curl + printf 'proxy = %s\n' "${HTTP_PROXY}" > ~/.curlrc + printf 'insecure\n' >> ~/.curlrc + echo "✅ curl proxy configured" + + - uses: actions/checkout@v4 + with: + clean: false + + - name: Cache Cargo registry and target + uses: actions/cache@v3 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-${{ env.TARGET }}-cargo-${{ hashFiles('Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-${{ env.TARGET }}-cargo- + ${{ runner.os }}-cargo- + + - name: Configure local Cargo cache + shell: bash + run: | + set -eu + CACHE_ROOT="${MEATSHELL_CI_CACHE:-$PWD/.cache/ci}" + case "$CACHE_ROOT" in + /*) ;; + *) CACHE_ROOT="$PWD/$CACHE_ROOT" ;; + esac + mkdir -p "$CACHE_ROOT/cargo" "$CACHE_ROOT/target" + echo "CARGO_HOME=$CACHE_ROOT/cargo" >> "$GITHUB_ENV" + echo "CARGO_TARGET_DIR=$CACHE_ROOT/target" >> "$GITHUB_ENV" + echo "CARGO_NET_RETRY=10" >> "$GITHUB_ENV" + echo "Using Cargo cache root: $CACHE_ROOT" + + if [ -d "$CACHE_ROOT/target/$TARGET/release" ]; then + echo "✅ Cache hit! Previous build artifacts found." + echo "Release binary size: $(du -sh "$CACHE_ROOT/target/$TARGET/release/$BIN" 2>/dev/null | cut -f1 || echo 'not built yet')" + else + echo "❌ Cache miss or first run. Will perform full build." + fi + + - name: 清理可能损坏的缓存 + shell: bash + run: | + if [ -d ~/.cargo/registry/index/github.com-* ]; then + echo "Cleaning corrupted cargo registry cache..." + rm -rf ~/.cargo/registry/index/github.com-* + fi + + - name: Show toolchain + shell: bash + run: | + set -eu + rustc --version + cargo --version + x86_64-w64-mingw32-gcc --version | head -n 1 + x86_64-w64-mingw32-windres --version | head -n 1 + + - name: Ensure Rust target + shell: bash + run: rustup target add "$TARGET" + + - name: Update crates.io index with retry + shell: bash + run: | + for i in 1 2 3 4 5; do + echo "Attempt $i to fetch dependencies..." + if cargo fetch 2>&1; then + echo "✅ Cargo fetch succeeded on attempt $i" + break + fi + if [ $i -eq 5 ]; then + echo "❌ Cargo fetch failed after 5 attempts" + exit 1 + fi + echo "Waiting 10 seconds before retry..." + sleep 10 + done + + - name: UI terminal smoke test + shell: bash + run: | + set -eu + BUILD_DIR="${CARGO_TARGET_DIR:-target}" + cargo build + rm -f "$BUILD_DIR/debug/meatshell-debug.log" meatshell-debug.log + SMOKE_OUTPUT="$BUILD_DIR/debug/meatshell-smoke.out" + set +e + MEATSHELL_SMOKE_TERMINAL=1 timeout 8s xvfb-run -a "$BUILD_DIR/debug/meatshell" >"$SMOKE_OUTPUT" 2>&1 + code=$? + set -e + if [ "$code" -ne 0 ]; then + cat "$SMOKE_OUTPUT" + if [ -f "$BUILD_DIR/debug/meatshell-debug.log" ]; then + cat "$BUILD_DIR/debug/meatshell-debug.log" + fi + exit "$code" + fi + if [ -f "$BUILD_DIR/debug/meatshell-debug.log" ]; then + if grep -E "ERROR|panic|Recursion detected" "$BUILD_DIR/debug/meatshell-debug.log"; then + cat "$SMOKE_OUTPUT" + cat "$BUILD_DIR/debug/meatshell-debug.log" + exit 1 + fi + fi + + - name: Build Windows GNU release + shell: bash + run: | + set -eu + if command -v build-win-gnu >/dev/null 2>&1; then + build-win-gnu + else + cargo build --release --target "$TARGET" + fi + + - name: Package Windows zip + shell: bash + env: + EVENT_NAME: ${{ gitea.event_name }} + REF: ${{ gitea.ref }} + REF_NAME: ${{ gitea.ref_name }} + run: | + set -eu + BUILD_DIR="${CARGO_TARGET_DIR:-target}" + event_name="${EVENT_NAME:-${GITHUB_EVENT_NAME:-}}" + ref="${REF:-${GITHUB_REF:-}}" + ref_name="${REF_NAME:-${GITHUB_REF_NAME:-dev}}" + short_sha="$(git rev-parse --short=12 HEAD)" + if [ "$event_name" = "push" ] && [ "$ref" = "refs/tags/${ref_name}" ]; then + VERSION="${ref_name}-${short_sha}" + RELEASE_TAG="${ref_name}" + elif [ "$event_name" = "push" ] && [ "$ref" != "refs/heads/main" ]; then + VERSION="${ref_name}-${short_sha}" + RELEASE_TAG="${ref_name}" + else + BUILD_STAMP="$(date -u +%Y%m%d-%H%M%S)" + VERSION="build-${BUILD_STAMP}-${short_sha}" + RELEASE_TAG="$VERSION" + fi + RELEASE_NAME="$RELEASE_TAG" + STAGE="meatshell-${VERSION}-windows-x86_64-gnu" + mkdir -p "$STAGE" + cp "${BUILD_DIR}/${TARGET}/release/${BIN}" "$STAGE/" + cp README.md README.en.md CHANGELOG.md "$STAGE/" 2>/dev/null || true + if command -v 7z >/dev/null 2>&1; then + 7z a "${STAGE}.zip" "$STAGE" >/dev/null + else + zip -r "${STAGE}.zip" "$STAGE" + fi + echo "ASSET=${STAGE}.zip" >> "$GITHUB_ENV" + echo "RELEASE_TAG=${RELEASE_TAG}" >> "$GITHUB_ENV" + echo "RELEASE_NAME=${RELEASE_NAME}" >> "$GITHUB_ENV" + + - name: Select release token + shell: bash + env: + RELEASE_TOKEN: ${{ secrets.RELEASE_TOKEN }} + GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} + WORKFLOW_TOKEN: ${{ gitea.token }} + run: | + set -eu + token="${RELEASE_TOKEN:-${GITEA_TOKEN:-${WORKFLOW_TOKEN:-}}}" + if [ -z "$token" ]; then + echo "No release token available; set RELEASE_TOKEN or GITEA_TOKEN." >&2 + exit 1 + fi + echo "::add-mask::$token" + echo "RELEASE_API_KEY=$token" >> "$GITHUB_ENV" + + - name: Publish Gitea release + shell: bash + env: + API_TOKEN: ${{ env.RELEASE_API_KEY }} + RELEASE_TAG_ENV: ${{ env.RELEASE_TAG }} + RELEASE_NAME_ENV: ${{ env.RELEASE_NAME }} + EVENT_NAME: ${{ gitea.event_name }} + REF: ${{ gitea.ref }} + REF_NAME: ${{ gitea.ref_name }} + RUN_ID: ${{ gitea.run_id }} + RUN_NUMBER: ${{ gitea.run_number }} + GITEA_SERVER_URL_CTX: ${{ gitea.server_url }} + GITEA_REPOSITORY_CTX: ${{ gitea.repository }} + GITHUB_SERVER_URL_CTX: ${{ github.server_url }} + GITHUB_REPOSITORY_CTX: ${{ github.repository }} + run: | + set -euo pipefail + asset="${ASSET:?ASSET is not set}" + event_name="${EVENT_NAME:-${GITHUB_EVENT_NAME:-}}" + ref="${REF:-${GITHUB_REF:-}}" + if [ -n "${RELEASE_TAG_ENV:-}" ]; then + tag="$RELEASE_TAG_ENV" + release_name="${RELEASE_NAME_ENV:-$tag}" + release_body="Automated Windows GNU build for ${tag}." + target_commitish="$(git rev-parse HEAD)" + elif [ "$event_name" = "push" ] && [ "$ref" = "refs/heads/main" ]; then + short_sha="$(git rev-parse --short=12 HEAD)" + stamp="$(date -u +%Y%m%d-%H%M%S)" + tag="build-${stamp}-${short_sha}" + release_name="$tag" + release_body="Automated Windows GNU build for main commit ${short_sha}." + target_commitish="$(git rev-parse HEAD)" + elif [ "$event_name" = "workflow_dispatch" ]; then + short_sha="$(git rev-parse --short=12 HEAD)" + run_id="${RUN_ID:-${GITHUB_RUN_ID:-${RUN_NUMBER:-${GITHUB_RUN_NUMBER:-$(date +%Y%m%d%H%M%S)}}}}" + tag="manual-${run_id}" + release_name="$tag" + release_body="Manual Windows GNU build for commit ${short_sha}." + target_commitish="$(git rev-parse HEAD)" + else + tag="${REF_NAME:-${GITHUB_REF_NAME:-}}" + release_name="$tag" + release_body="Automated Windows GNU build for ${tag}." + target_commitish="$(git rev-parse HEAD)" + fi + token="${API_TOKEN:-${RELEASE_API_KEY:-}}" + server="${GITEA_SERVER_URL_CTX:-${GITHUB_SERVER_URL_CTX:-${GITHUB_SERVER_URL:-}}}" + repo="${GITEA_REPOSITORY_CTX:-${GITHUB_REPOSITORY_CTX:-${GITHUB_REPOSITORY:-}}}" + + if [ -z "$token" ]; then + echo "RELEASE_API_KEY is not set." >&2 + exit 1 + fi + if [ -z "$tag" ]; then + echo "Tag name is empty." >&2 + exit 1 + fi + if [ ! -f "$asset" ]; then + echo "Release asset not found: $asset" >&2 + exit 1 + fi + + if [ -z "$server" ] || [ -z "$repo" ]; then + read -r server repo < <(python3 - <<'PY' + import re + import subprocess + from urllib.parse import urlparse + + remote = subprocess.check_output( + ["git", "remote", "get-url", "origin"], text=True + ).strip() + if remote.startswith(("http://", "https://")): + parsed = urlparse(remote) + path = parsed.path.strip("/") + if path.endswith(".git"): + path = path[:-4] + print(f"{parsed.scheme}://{parsed.netloc} {path}") + else: + match = re.match(r"[^@]+@([^:]+):(.+)$", remote) + if not match: + raise SystemExit(f"cannot parse git remote: {remote}") + path = match.group(2) + if path.endswith(".git"): + path = path[:-4] + print(f"https://{match.group(1)} {path}") + PY + ) + fi + + server="${server%/}" + api="$server/api/v1/repos/$repo" + auth_header="Authorization: token $token" + + curl_api() { + attempt=1 + while true; do + if curl --proxy "${HTTP_PROXY:-}" \ + --insecure \ + --fail --silent --show-error --location \ + --connect-timeout 20 --max-time 180 \ + -H "$auth_header" "$@"; then + return 0 + fi + if [ "$attempt" -ge 8 ]; then + return 1 + fi + sleep $((attempt * 3)) + attempt=$((attempt + 1)) + done + } + + curl_status() { + out="$1" + shift + attempt=1 + while true; do + status="$( + curl --proxy "${HTTP_PROXY:-}" \ + --insecure \ + --silent --show-error --location \ + --connect-timeout 20 --max-time 180 \ + -H "$auth_header" \ + -o "$out" -w "%{http_code}" \ + "$@" || true + )" + if [ -n "$status" ] && [ "$status" != "000" ]; then + printf '%s' "$status" + return 0 + fi + if [ "$attempt" -ge 8 ]; then + printf '%s' "${status:-000}" + return 1 + fi + sleep $((attempt * 3)) + attempt=$((attempt + 1)) + done + } + + echo "Checking Gitea API: $server/api/v1/version" + curl_api "$server/api/v1/version" >/dev/null + + release_json="$(mktemp)" + status="$(curl_status "$release_json" "$api/releases/tags/$tag" || true)" + if [ "$status" = "404" ]; then + payload="$( + TAG="$tag" RELEASE_NAME="$release_name" RELEASE_BODY="$release_body" TARGET_COMMITISH="$target_commitish" python3 - <<'PY' + import json + import os + + tag = os.environ["TAG"] + print(json.dumps({ + "tag_name": tag, + "target_commitish": os.environ["TARGET_COMMITISH"], + "name": os.environ["RELEASE_NAME"], + "body": os.environ["RELEASE_BODY"], + "draft": False, + "prerelease": False, + })) + PY + )" + status="$( + curl_status "$release_json" \ + -H "Content-Type: application/json" \ + -X POST -d "$payload" \ + "$api/releases" || true + )" + fi + + if [ "$status" != "200" ] && [ "$status" != "201" ]; then + echo "Release lookup/create failed with HTTP $status" >&2 + cat "$release_json" >&2 || true + exit 1 + fi + + release_id="$(python3 - "$release_json" <<'PY' + import json + import sys + + with open(sys.argv[1], encoding="utf-8") as fh: + print(json.load(fh)["id"]) + PY + )" + + update_payload="$( + RELEASE_NAME="$release_name" RELEASE_BODY="$release_body" python3 - <<'PY' + import json + import os + + print(json.dumps({ + "name": os.environ["RELEASE_NAME"], + "body": os.environ["RELEASE_BODY"], + "draft": False, + "prerelease": False, + })) + PY + )" + curl_api -H "Content-Type: application/json" \ + -X PATCH -d "$update_payload" \ + "$api/releases/$release_id" >/dev/null + + asset_name="$(basename "$asset")" + asset_id="$( + ASSET_NAME="$asset_name" python3 - "$release_json" <<'PY' + import json + import os + import sys + + with open(sys.argv[1], encoding="utf-8") as fh: + release = json.load(fh) + assets = release.get("assets") or release.get("attachments") or [] + for item in assets: + if item.get("name") == os.environ["ASSET_NAME"]: + print(item["id"]) + break + PY + )" + if [ -n "$asset_id" ]; then + echo "Deleting existing release asset: $asset_name" + curl_api -X DELETE "$api/releases/$release_id/assets/$asset_id" >/dev/null + fi + + asset_query="$( + ASSET_NAME="$asset_name" python3 - <<'PY' + import os + import urllib.parse + + print(urllib.parse.quote(os.environ["ASSET_NAME"])) + PY + )" + echo "Uploading release asset: $asset_name" + curl_api -X POST \ + -F "attachment=@${asset}" \ + "$api/releases/$release_id/assets?name=$asset_query" >/dev/null + + echo "✅ Release published successfully through proxy" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..95e50b4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +/target +Cargo.lock +*.rs.bk +meatshell-debug.log +release-*.log +.DS_Store +/.vscode +/.idea +/.claude +/.cache diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..16cb98c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,192 @@ +# Changelog / 更新日志 + +All notable changes are documented here. 本文件记录所有重要变更。 +中英对照(English first, 中文在后). + +## [Unreleased] + +### Added / 新增 + +- **Confirmation prompt before deleting a remote file (#28).** SFTP delete is + irreversible (there is no trash), so the context-menu *Delete* now asks for + confirmation — showing the full path — before removing anything; a misclick + no longer silently destroys a file. + **删除远程文件前先确认 (#28)。** SFTP 删除不可撤销(没有回收站),右键菜单的 + 「删除」现在会先弹出确认框(显示完整路径)再执行,误点不会再悄悄删掉文件。 + +- **Serial port sessions (#14, #17).** New session type for connecting to + switches, routers and embedded devices over a serial console. Pick + **Serial** in the session dialog and set the port (`COM3`, `/dev/ttyUSB0`), + baud rate, data/stop bits, parity and flow control. The serial line reuses + the full terminal pipeline (output, input, scrollback, copy/paste); SFTP and + the resource monitor are not applicable and are hidden. + **串口会话 (#14, #17)。** 新增串口会话类型,用于通过串口控制台连接交换机、 + 路由器和嵌入式设备。在会话对话框选择 **串口**,填写串口号(`COM3`、 + `/dev/ttyUSB0`)、波特率、数据/停止位、校验位和流控。串口复用完整的终端管线 + (输出、输入、回滚、复制粘贴);SFTP 和资源监控不适用,已隐藏。 + +- **Telnet sessions (#17).** New session type for legacy gear that only speaks + Telnet. Handles RFC 854 option negotiation (suppress-go-ahead / echo / + window-size), strips IAC sequences from the stream, and tunnels through the + same SOCKS5 / HTTP proxy as SSH when configured. + **Telnet 会话 (#17)。** 新增 Telnet 会话类型,用于只支持 Telnet 的老旧设备。 + 处理 RFC 854 选项协商(抑制 Go-Ahead / 回显 / 窗口大小),从数据流中剥离 IAC + 序列,并可经与 SSH 相同的 SOCKS5 / HTTP 代理隧道连接。 + +### Performance / 性能 + +- **Pipelined SFTP upload (#16).** Uploads now keep ~32 WRITE requests in flight + on a dedicated SFTP channel instead of writing one chunk and waiting for each + ack, hiding the round-trip latency that made transfers ~15x slower than `scp`. + Out-of-order completion is safe (every chunk carries its absolute offset). + **SFTP 上传流水线化 (#16)。** 上传改为在专用 SFTP 通道上保持约 32 个 WRITE 请求 + 并发在途,而不是写一块等一块的 ack,消除了让传输比 `scp` 慢约 15 倍的往返延迟。 + 乱序完成也安全(每块都带绝对偏移)。 + +### Fixed / 修复 + +- **Dragging the SFTP panel up no longer clears terminal output (#18).** vt100's + shrink truncated the grid from the bottom, dropping the most recent output; + before shrinking we now save the top rows to scrollback and scroll so the + bottom (recent) rows stay visible. Two follow-ups: (1) the shrink now only + scrolls off as many rows as needed to keep the cursor visible, so rapid + up/down dragging on a not-yet-full screen no longer pushes the prompt into + scrollback and strands the cursor at the top (also reported as #24); (2) drag-selection is now stored + in absolute scrollback coordinates, so selecting from the top of the history + down through several screens copies every line instead of losing everything + above the final window when the view auto-scrolls. + **上拉 SFTP 面板不再清空终端输出 (#18)。** vt100 缩小时从底部截断,丢掉最近输出; + 现在缩小前把顶部行存入回滚区并滚动,使底部(最近)行保持可见。两处后续修复: + (1) 缩小时只滚走"保持光标可见所需"的行数,疯狂上下拖动未填满的屏幕时不再把 + 提示符推进回滚区、光标卡在顶部;(2) 拖选改用绝对回滚坐标存储,从历史顶部往下 + 跨多屏选择时能复制到每一行,而不是在视图自动滚动后丢掉最后一屏以上的内容。 + +### Security / 安全 + +- **Harden the remote resource monitor against a hostile server (#27).** The + monitor runs a small loop over an SSH exec channel. It now (1) resets `PATH` + to the standard system dirs so a server with a hijacked `PATH`/`BASH_ENV` + can't shadow `awk`/`cat`/`df`/`sleep`; (2) caps the reassembly buffer at 1 MiB + so a server that streams data without the sync marker can't exhaust memory; + and (3) parses `/proc` and `df` output with saturating arithmetic and a + 64-row cap per sample, so crafted huge values or a flood of fake interfaces + can't overflow-panic or swamp the sidebar. + **加固远程资源监控以防恶意服务器 (#27)。** 监控通过 SSH exec 通道跑一个小循环。 + 现在:(1) 重置 `PATH` 为标准系统目录,使被劫持 `PATH`/`BASH_ENV` 的服务器无法 + 替换 `awk`/`cat`/`df`/`sleep`;(2) 重组缓冲上限 1 MiB,防止只发数据不发同步标记 + 的服务器耗尽内存;(3) 解析 `/proc` 与 `df` 输出改用饱和运算并对每次采样限 64 行, + 使构造的超大数值或伪造网卡洪流无法触发溢出 panic 或拖垮侧栏。 + +- **Sanitize remote file names before saving downloads (#26).** SFTP downloads + built the local path straight from the server-supplied name, so a malicious + server could use path separators, shell-special characters or a Windows + reserved device name (`CON`, `NUL`, `COM1`…) to write outside the chosen + folder or hit a device. Downloads now run the name through `sanitize_filename` + (already used by the open/edit flow), which also gained reserved-device-name + and leading-whitespace handling. + **保存下载前清洗远程文件名 (#26)。** SFTP 下载直接用服务器给的文件名拼本地路径, + 恶意服务器可借路径分隔符、shell 特殊字符或 Windows 保留设备名(`CON`、`NUL`、 + `COM1`…)写到目标目录之外或命中设备。现在下载会先经 `sanitize_filename` + (查看/编辑流程已在用)清洗,并新增了保留设备名与前导空白的处理。 + +- **Stop logging raw keystroke bytes (#15).** Debug logs recorded the hex of SSH + input, which could include passwords; now they record only the byte length. + A follow-up found two more leak sites in the key handler: `send_key` logged + the raw key string (`key={:?}`) at debug level, and the `[KEY_DIAG]` IME + diagnostic logged each Shift-typed key's code point at **info** level (no + `RUST_LOG` needed) — both could expose password characters. They now go + through a `redact_key` helper that reveals only C0/C1 control codes (what the + IME diagnostics actually need) and masks every printable character. + **不再记录原始按键字节 (#15)。** debug 日志原本记录 SSH 输入的十六进制(可能含 + 密码),现在只记录字节长度。后续又发现按键处理里还有两处泄露:`send_key` 以 + debug 级打印按键原文(`key={:?}`),`[KEY_DIAG]` IME 诊断更是以 **info 级** + (无需 `RUST_LOG`)打印每个带 Shift 按键的码位——都可能暴露密码字符。现在统一 + 经 `redact_key` 处理,只保留 C0/C1 控制码(IME 诊断真正需要的),可打印字符一律掩码。 + +## [0.2.3] - 2026-06-05 + +### Added / 新增 + +- **Proxy support for SSH / SFTP (#7).** Connections can tunnel through a + **SOCKS5** (`socks5://`) or **HTTP CONNECT** (`http://`) proxy, with optional + `user:pass@` credentials. Set it per session in the dialog, or leave it blank + to use the `$ALL_PROXY` environment variable; empty = direct. + **SSH / SFTP 代理支持 (#7)。** 连接可经 **SOCKS5**(`socks5://`)或 + **HTTP CONNECT**(`http://`)代理(支持 `user:pass@` 认证)。会话对话框里按需 + 填写,留空则用 `$ALL_PROXY` 环境变量,再空则直连。 + +- **Import hosts from `~/.ssh/config` (#1).** The "Import ~/.ssh/config" action + (in the settings menu) parses the standard SSH config (`Host` / `HostName` / + `User` / `Port` / `IdentityFile`, wildcard `Host *` blocks skipped) and adds + each host as a session, skipping duplicates. Hosts with an `IdentityFile` + default to key auth. + **从 `~/.ssh/config` 导入主机 (#1)。** 设置菜单里的「导入 ~/.ssh/config」解析 + 标准 SSH 配置(`Host` / `HostName` / `User` / `Port` / `IdentityFile`,跳过 + `Host *` 通配块),将每个主机加为会话并跳过重复;带 `IdentityFile` 的默认用密钥。 + +- **GitHub Actions release workflow** building native binaries for Windows / + Linux / macOS (arm64 + x86_64) on each `v*` tag. + **GitHub Actions 发布工作流**,每个 `v*` 标签自动构建 Windows / Linux / + macOS(arm64 + x86_64)三平台二进制。 + +### Fixed / 修复 + +- The full-width `+` before "New session" rendered as a tofu box in English; + switched to an ASCII `+`. + 英文下「New session」前的全角 `+` 显示为豆腐块,改用 ASCII `+`。 + +- `install-linux.sh` now auto-detects the `meatshell` binary sitting next to it + in a release package, so it works with no arguments (it previously defaulted to + the source-tree `./target/release` path and failed for end users). + `install-linux.sh` 现在自动识别发布包里同目录的 `meatshell`,无需传参即可使用 + (之前默认指向源码树的 `./target/release`,普通用户直接跑会报错)。 + +## [0.2.2] - 2026-06-05 + +### Security / 安全 + +- **Fix Windows command injection (#12)** — `open_with_os` no longer shells out + via `cmd /C start`; it calls `ShellExecuteW` directly so a malicious remote + file name (e.g. `foo&calc.exe`) can't inject commands. Added `sanitize_filename` + as defence-in-depth. + **修复 Windows 命令注入 (#12)** —— 打开文件不再经 `cmd /C start`,改用 + `ShellExecuteW` 直接打开,恶意远程文件名(如 `foo&calc.exe`)无法注入命令; + 并新增 `sanitize_filename` 清洗作为纵深防御。 + +- **Stop echoing the saved password when editing a session (#10)** — the field + is left blank with a "leave blank to keep" hint; an empty field on save keeps + the existing password. + **编辑会话时不再回显已保存密码 (#10)** —— 密码框留空并提示「留空则不修改」, + 保存时为空则保留原密码。 + +- **Zero passwords in memory on drop (#8)** — passwords now use a `Secret` type + (`zeroize`) that wipes its heap buffer on drop and redacts itself in logs; the + on-disk JSON format is unchanged. + **密码内存清零 (#8)** —— 密码改用 `Secret` 类型(`zeroize`),Drop 时清零堆 + 内存、日志中脱敏;磁盘 JSON 格式不变。 + +### Added / 新增 + +- **Internationalization — Chinese / English with runtime switching (#9).** + Static UI uses Slint `@tr` + bundled `.po`; dynamic Rust strings use a `t()` + helper. Switch via the gear menu; the choice is persisted and the default + follows the system locale. + **国际化 —— 中 / 英双语,运行时实时切换 (#9)。** 静态界面用 Slint `@tr` + + bundled `.po`;Rust 动态文本用 `t()`。设置菜单里切换,选择会持久化,首次启动 + 跟随系统语言。 + +- **Private-key file picker** in the session dialog, plus `.pub` fallback (auto + strips the suffix to load the matching private key) and uniform `/` path + separators across platforms. + **会话弹窗的私钥文件选择器**,并支持 `.pub` 容错(自动去后缀加载对应私钥)、 + 路径分隔符统一为 `/`。 + +- **Linux desktop integration** — `assets/meatshell.desktop` + `install-linux.sh` + and an `xdg_app_id` so the GNOME/Ubuntu dock shows the app icon on Wayland. + **Linux 桌面集成** —— `assets/meatshell.desktop` + `install-linux.sh`,并设置 + `xdg_app_id`,使 Wayland 下 GNOME/Ubuntu 任务栏显示应用图标。 + +- **Screenshots in the README** (`docs/screenshots/`, sensitive info redacted). + **README 增加截图**(`docs/screenshots/`,敏感信息已打码)。 + +[0.2.2]: https://github.com/jeff141/meatshell/releases/tag/v0.2.2 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..e1a002c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,66 @@ +# 参与 meatshell / Contributing to meatshell + +> [English version below](#english) + +## 中文 + +感谢你对 meatshell 的关注!🙏 + +meatshell 目前是一个**个人实验性项目**。它的设计、取舍和代码风格都由我一个人把控,目的是保持产品方向的一致性,做一个**轻量、专注的 FinalShell 风格 SSH 客户端**——不做成大而全的工具。 + +### 关于 Pull Request + +为了保持这份一致性,**本项目暂不接受外部 Pull Request**。 + +这不是因为你的代码不够好,而是: + +- 我希望每一行代码都经过自己的理解和取舍,避免项目逐渐偏离最初的设计意图; +- 维护一个能完全掌控的小项目,对我个人而言比快速扩张更重要。 + +如果你已经提交了 PR,我可能会在阅读后礼貌关闭,但**你的想法我都会认真看**——很多改进我会用自己的方式重新实现。 + +### 欢迎你这样参与 + +- 🐛 **报告 Bug**:在 [Issues](https://github.com/jeff141/meatshell/issues) 里描述复现步骤、系统环境和期望行为。 +- 💡 **提出建议**:功能想法、交互改进、设计参考都欢迎在 Issue 区讨论。 +- ⭐ **Star / Fork**:如果你喜欢它,欢迎 fork 出自己的版本自由折腾。 + +清晰的 Issue 对我的帮助,往往不亚于一个 PR。再次感谢! + +--- + + +## English + +Thanks for your interest in meatshell! 🙏 + +meatshell is currently a **personal, experimental project**. Its design, +trade-offs, and code style are all maintained by a single person, on purpose — +the goal is a **lightweight, focused, FinalShell-style SSH client**, not an +all-in-one tool. + +### About Pull Requests + +To keep that consistency, **this project does not accept external Pull +Requests at this time.** + +It's not that your code isn't good enough — rather: + +- I want to personally understand and own every line of code, so the project + doesn't gradually drift away from its original intent; +- For me, keeping a small project I fully control matters more than growing fast. + +If you've already opened a PR, I may close it politely after reading, but +**I do read every idea** — and I'll often re-implement worthwhile improvements +in my own way. + +### How you're very welcome to help + +- 🐛 **Report bugs**: open an [Issue](https://github.com/jeff141/meatshell/issues) + with repro steps, your OS/environment, and expected behavior. +- 💡 **Suggest ideas**: feature requests, UX improvements, and design references + are all welcome in the issue tracker. +- ⭐ **Star / Fork**: if you like it, feel free to fork your own version and + hack away. + +A clear issue often helps me as much as a PR would. Thank you! diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..6dbb690 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,77 @@ +[package] +name = "meatshell" +version = "0.2.7" +edition = "2021" +authors = ["meatshell contributors"] +description = "A lightweight FinalShell-style SSH/terminal client written in Rust + Slint" +license = "MIT OR Apache-2.0" +repository = "https://github.com/your/meatshell" +readme = "README.md" +rust-version = "1.75" + +[dependencies] +slint = { version = "1.8", features = ["compat-1-2"] } +# Direct access to the winit window/events (OS file-drop for drag-and-drop upload). +i-slint-backend-winit = "1.16" +serde = { version = "1", features = ["derive"] } +serde_json = "1" +anyhow = "1" +thiserror = "1" +directories = "5" +chrono = { version = "0.4", features = ["serde"] } +uuid = { version = "1", features = ["v4", "serde"] } +tokio = { version = "1", features = ["rt-multi-thread", "macros", "sync", "io-util", "net", "time", "fs"] } +russh = "0.49" +russh-keys = "0.49" +ssh-key = "0.6" +tracing = "0.1" +tracing-subscriber = { version = "0.3", features = ["env-filter"] } +rand = "0.8" +async-trait = "0.1" +futures = "0.3" +vt100 = "0.15" +unicode-width = "0.2" +russh-sftp = "2" +rfd = "0.15" +arboard = "3" +# Zeroes password buffers on drop so plaintext credentials don't linger in +# freed heap memory (core dumps / debuggers / /proc/pid/mem). +zeroize = "1" +# SOCKS5 proxy tunnelling for SSH/SFTP in network-restricted environments. +# (HTTP CONNECT proxies are handled in src/proxy.rs without an extra crate.) +tokio-socks = "0.5" +base64 = "0.22" +# Cross-platform serial port access for the Serial session type (#14, #17). +# Opens COM3 / /dev/ttyUSB0 etc.; on Linux the default `libudev` feature is +# used for port enumeration (CI installs libudev-dev). +serialport = "4" +# ChaCha20-Poly1305 AEAD for encrypting passwords at rest in sessions.json. +# rand (OsRng) and base64 are already pulled in by other deps above. +chacha20poly1305 = "0.10" +# Detect whether the OS is running in dark or light mode. +# Used on startup to honour the system preference before the user overrides it. +dark-light = "1" +# Runtime background image decoding/blur. Used for png/jpg/jpeg/webp user +# backgrounds before handing pixels to Slint. +image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp"] } + +# Decode the embedded PNG icon to set the window icon at runtime (Linux only). +# On Windows the icon comes from the .ico embedded by winresource at link time; +# on macOS it comes from the app bundle — neither needs runtime decoding. + +[build-dependencies] +slint-build = "1.8" +# Embeds assets/meatshell.ico into the .exe so Explorer / taskbar / shortcuts +# show the app icon. Kept as an unconditional build-dependency because build.rs +# runs on the host; Linux -> Windows cross builds still need this crate. +winresource = "0.1" + +[profile.release] +opt-level = 3 +lto = "thin" +codegen-units = 1 +strip = "symbols" +panic = "unwind" + +[profile.dev] +opt-level = 1 diff --git a/Dockerfile.Miu_v1 b/Dockerfile.Miu_v1 new file mode 100644 index 0000000..bf03d62 --- /dev/null +++ b/Dockerfile.Miu_v1 @@ -0,0 +1,111 @@ +# Gitea act runner image for meatshell. +# +# This is still a Linux container. It can build the Windows GNU target +# (`x86_64-pc-windows-gnu`) with MinGW, and can run the resulting .exe through +# Wine for simple smoke tests. It is not a replacement for a real Windows/MSVC +# runner (`x86_64-pc-windows-msvc`). + +FROM ghcr.io/catthehacker/ubuntu:full-latest + +USER root +SHELL ["/bin/bash", "-o", "pipefail", "-c"] + +ENV DEBIAN_FRONTEND=noninteractive + +# Use Tsinghua Ubuntu mirrors, matching the base image codename instead of +# hard-coding noble. +RUN . /etc/os-release \ + && { \ + echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${VERSION_CODENAME} main restricted universe multiverse"; \ + echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${VERSION_CODENAME}-updates main restricted universe multiverse"; \ + echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${VERSION_CODENAME}-backports main restricted universe multiverse"; \ + echo "deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ ${VERSION_CODENAME}-security main restricted universe multiverse"; \ + } > /etc/apt/sources.list + +# Build tools: +# - Linux GUI/dev libs match the official release workflow's Linux build deps. +# - MinGW provides the Windows GNU linker, archiver and windres. +# - Wine + Xvfb let cargo run/test Windows binaries via a virtual display. +RUN dpkg --add-architecture i386 \ + && apt-get update \ + && apt-get install -y --no-install-recommends \ + ca-certificates \ + curl \ + git \ + build-essential \ + pkg-config \ + cmake \ + clang \ + lld \ + libfontconfig1-dev \ + libfreetype6-dev \ + libxcb1-dev \ + libxcb-render0-dev \ + libxcb-shape0-dev \ + libxcb-xfixes0-dev \ + libxkbcommon-dev \ + libxkbcommon-x11-dev \ + libwayland-dev \ + libgl1-mesa-dev \ + libegl1-mesa-dev \ + libgtk-3-dev \ + libudev-dev \ + mingw-w64 \ + gcc-mingw-w64-x86-64 \ + g++-mingw-w64-x86-64 \ + binutils-mingw-w64-x86-64 \ + xvfb \ + x11-utils \ + x11-xserver-utils \ + wine64 \ + wine32 \ + wine \ + wine32:i386 \ + fonts-wine \ + p7zip-full \ + zip \ + unzip \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# Rust toolchain. Use rustup so the Windows target can be installed cleanly. +ENV RUSTUP_DIST_SERVER=https://mirrors.tuna.tsinghua.edu.cn/rustup +ENV RUSTUP_UPDATE_ROOT=https://mirrors.tuna.tsinghua.edu.cn/rustup/rustup +ENV RUSTUP_HOME=/root/.rustup +ENV CARGO_HOME=/root/.cargo +ENV PATH=/root/.cargo/bin:${PATH} + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs \ + | sh -s -- -y --profile minimal --default-toolchain stable \ + && rustup target add x86_64-pc-windows-gnu x86_64-unknown-linux-gnu \ + && rustc --version \ + && cargo --version + +# Cross-compilation configuration for cargo and build scripts. +ENV CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=x86_64-w64-mingw32-gcc +ENV CARGO_TARGET_X86_64_PC_WINDOWS_GNU_AR=x86_64-w64-mingw32-ar +ENV CC_x86_64_pc_windows_gnu=x86_64-w64-mingw32-gcc +ENV CXX_x86_64_pc_windows_gnu=x86_64-w64-mingw32-g++ +ENV AR_x86_64_pc_windows_gnu=x86_64-w64-mingw32-ar +ENV WINDRES=x86_64-w64-mingw32-windres +ENV PKG_CONFIG_ALLOW_CROSS=1 + +# Wine runtime setup for optional smoke tests. +ENV DISPLAY=:99 +ENV WINEDLLOVERRIDES=winemenubuilder.exe=d +ENV WINEDEBUG=-all +ENV CARGO_TARGET_X86_64_PC_WINDOWS_GNU_RUNNER=/usr/local/bin/wine-xvfb + +RUN wine --version \ + && xvfb-run -a wineboot -u \ + && printf '%s\n' '#!/usr/bin/env bash' 'exec xvfb-run -a wine "$@"' \ + > /usr/local/bin/wine-xvfb \ + && chmod +x /usr/local/bin/wine-xvfb \ + && printf '%s\n' \ + '#!/usr/bin/env bash' \ + 'set -euo pipefail' \ + 'cargo build --release --target x86_64-pc-windows-gnu "$@"' \ + > /usr/local/bin/build-win-gnu \ + && chmod +x /usr/local/bin/build-win-gnu + +WORKDIR /workspace diff --git a/README.en.md b/README.en.md new file mode 100644 index 0000000..d8300c2 --- /dev/null +++ b/README.en.md @@ -0,0 +1,147 @@ +# meatshell + +[简体中文](./README.md) | **English** + +A lightweight, low-memory SSH / terminal client inspired by FinalShell, but +written entirely in **Rust + [Slint](https://slint.dev)**. The goal is to keep +FinalShell's core experience (resource-monitor sidebar, session management, +tabbed terminals) while cutting memory use from the 400 MB+ of a JVM app down to +the tens-of-MB range of a native binary. + +## Screenshots + +

+ Welcome / session management
+ Welcome page: session management + local resource monitor sidebar +

+ +

+ Terminal + SFTP
+ Tabbed terminal (full-screen btop) + SFTP file browser + remote resource monitoring +

+ +## Download & install + +Every pushed `v*` tag triggers a Gitea Actions build that produces the Windows +GNU package and publishes it on the +[Releases](https://git.miuoo.qzz.io/Miu/meatshell/releases) page. + +### Windows + +Download `meatshell-*-windows-x86_64.zip`, unzip, and run `meatshell.exe`. +At runtime, `meatshell-debug.log` is written next to `meatshell.exe`; check it first for SSH connection crashes or unexpected exits. + +### Linux + +```bash +tar -xzf meatshell-*-linux-x86_64.tar.gz +cd meatshell-*-linux-x86_64 +./meatshell # run it directly +# Optional: install the app icon + launcher entry (shows the icon in the dock / +# app list — no argument needed, it finds the binary next to the script) +chmod +x install-linux.sh && ./install-linux.sh +``` + +> Requires glibc ≥ 2.35 (Ubuntu 22.04+ / Debian 12+). On Wayland you may need to +> log out/in once after installing the icon. + +### macOS + +```bash +tar -xzf meatshell-*-macos-*.tar.gz # aarch64 = Apple Silicon, x86_64 = Intel +xattr -dr com.apple.quarantine meatshell # clear the "unsigned app" Gatekeeper flag +./meatshell +``` + +> To build from source, see [Running](#running) below. + +## Roadmap + +### v0.1 + +- [x] FinalShell-style dark theme UI +- [x] Local system monitor sidebar (CPU / memory / swap / network throughput, 1 Hz) +- [x] Tabs (welcome page + multiple terminal sessions) +- [x] Session management: create / edit / delete, persisted to local JSON + - Config location: `%APPDATA%/meatshell/sessions.json` (Windows) + / `~/.config/meatshell/sessions.json` (Linux) + / `~/Library/Application Support/meatshell/sessions.json` (macOS) +- [x] SSH connection scaffold (`russh`, pure Rust, password + private key) +- [x] Raw PTY input + VT/ANSI terminal view + +### v0.2 + +- [x] Full VT/ANSI terminal emulation (`vt100`/xterm parser, full-screen TUI, scrollback, find, select-copy) +- [x] Remote host resource monitoring (run a remote collector script, like FinalShell) +- [x] SFTP file browser + drag-and-drop upload/download +- [x] Known-hosts (`known_hosts`) verification (TOFU into the app known_hosts, reject changed keys) +- [x] Store session passwords in the OS keychain (encrypted config fallback when unavailable) + +### v0.3+ + +- [x] Split panes for tabbed terminals +- [x] Session groups / folders +- [x] Theme switching (light / follow system) +- [x] Command history & snippet management + +## Tech stack + +| Module | Choice | +| ------------- | ----------------------------------------------------------------- | +| UI | [Slint](https://slint.dev) (compiled pure Rust, no GC) | +| Async runtime | [`tokio`](https://tokio.rs) | +| SSH protocol | [`russh`](https://crates.io/crates/russh) (no libssh dependency) | +| System metrics| [`sysinfo`](https://crates.io/crates/sysinfo) | +| Serialization | `serde` + `serde_json` | +| Logging | `tracing` + `tracing-subscriber` | + +## Running + +```bash +cargo run --release +``` + +On first launch an empty session store is created at +`%APPDATA%/meatshell/sessions.json`. Click **"+ New Session"** in the top-right +to add your first server. + +## Project layout + +``` +meatshell/ +├── Cargo.toml +├── build.rs # Slint compiler entry point +├── ui/ +│ ├── app.slint # top-level window +│ ├── theme.slint # design tokens +│ ├── widgets.slint # reusable buttons / inputs / sparkline +│ ├── sidebar.slint # left-hand system monitor panel +│ ├── tabs.slint # top tab bar +│ ├── welcome.slint # welcome page / quick connect +│ ├── session_dialog.slint # new / edit session dialog +│ └── terminal_view.slint # VT/ANSI terminal view + command bar / SFTP panel +└── src/ + ├── main.rs + ├── app.rs # UI ↔ backend bridge + ├── config.rs # session JSON persistence + ├── keychain.rs # OS keychain password storage + encrypted fallback + ├── known_hosts.rs # OpenSSH known_hosts verification + ├── system.rs # CPU / memory / network sampling + ├── ssh.rs # SSH session worker + └── sftp.rs # SFTP browser / transfer worker +``` + +## Development notes + +- Slint widgets use a strict layout DSL; after editing a `.slint` file, + `cargo check` is the fastest feedback loop. +- The application event loop is single-threaded (required by Slint); all + cross-thread UI updates go through `slint::invoke_from_event_loop` callbacks. +- `known_hosts` uses trust-on-first-use (TOFU): first connections are written + to meatshell's own `known_hosts`; later server-key changes are rejected. +- Session passwords prefer the OS keychain; when no keychain backend is + available, meatshell falls back to local ChaCha20-Poly1305 encrypted config. + +## License + +Dual-licensed under MIT OR Apache-2.0. diff --git a/README.md b/README.md new file mode 100644 index 0000000..6f0c6f4 --- /dev/null +++ b/README.md @@ -0,0 +1,142 @@ +# meatshell + +**简体中文** | [English](./README.en.md) + +一个轻量级、低内存占用的 SSH / 终端客户端,灵感来自 FinalShell,但完全由 +**Rust + [Slint](https://slint.dev)** 实现。目标是保留 FinalShell 的核心体验 +(资源监控侧栏、会话管理、多标签页终端)的同时,把内存占用从 400 MB+ 的 +JVM 压到几十 MB 原生级别。 + +## 截图 + +

+ 欢迎页 / 会话管理
+ 欢迎页:会话管理 + 左侧本机资源监控 +

+ +

+ 终端 + SFTP
+ 多标签页终端(btop 全屏渲染)+ 底部 SFTP 文件浏览 + 远端资源监控 +

+ +## 下载与安装 + +每次推送 `v*` 标签,Gitea Actions 会自动构建 Windows GNU 版本并发布到 +[Releases](https://git.miuoo.qzz.io/Miu/meatshell/releases) 页面。 + +### Windows + +下载 `meatshell-*-windows-x86_64.zip`,解压后双击 `meatshell.exe`。 +运行时会在 `meatshell.exe` 同目录生成 `meatshell-debug.log`,SSH 连接闪退或异常时请优先查看这个文件。 + +### Linux + +```bash +tar -xzf meatshell-*-linux-x86_64.tar.gz +cd meatshell-*-linux-x86_64 +./meatshell # 直接运行 +# 可选:装应用图标 + 启动器入口(Dock / 应用列表里显示图标,无需传参) +chmod +x install-linux.sh && ./install-linux.sh +``` + +> 需要 glibc ≥ 2.35(Ubuntu 22.04+ / Debian 12+)。Wayland 下首次装完图标可能要注销重登一次。 + +### macOS + +```bash +tar -xzf meatshell-*-macos-*.tar.gz # aarch64 = Apple 芯片,x86_64 = Intel +xattr -dr com.apple.quarantine meatshell # 去掉「未签名应用」的 Gatekeeper 拦截 +./meatshell +``` + +> 从源码构建见下方 [运行](#运行)。 + +## 路线图 + +### v0.1 + +- [x] FinalShell 风格深色主题 UI +- [x] 左侧本机系统监控(CPU / 内存 / 交换 / 网络吞吐,1 Hz) +- [x] 多标签页(欢迎页 + 多个终端会话) +- [x] 会话管理:新建 / 编辑 / 删除,本地 JSON 持久化 + - 配置位置:`%APPDATA%/meatshell/sessions.json`(Windows) + / `~/.config/meatshell/sessions.json`(Linux) + / `~/Library/Application Support/meatshell/sessions.json`(macOS) +- [x] SSH 连接骨架(`russh`,纯 Rust 实现,支持密码 + 私钥) +- [x] 原始 PTY 输入 + VT/ANSI 终端视图 + +### v0.2 + +- [x] 完整 VT/ANSI 终端模拟(`vt100`/xterm 解析,支持全屏 TUI、滚动缓冲、查找、选择复制) +- [x] 远端主机资源监控(与 FinalShell 一样执行远端脚本收集) +- [x] SFTP 文件浏览 + 拖拽上传/下载 +- [x] 已知主机 (known_hosts) 校验(首次信任写入本应用 known_hosts,密钥变化拒绝连接) +- [x] 会话密码使用 OS 钥匙串存储(不可用时使用加密配置回退) + +### v0.3+ + +- [x] 多标签页终端分屏 +- [x] 会话分组 / 文件夹 +- [x] 主题切换(浅色 / 跟随系统) +- [x] 命令历史与片段管理 + +## 技术栈 + +| 模块 | 选型 | +| ------------- | ----------------------------------------------------------------- | +| UI | [Slint](https://slint.dev)(纯 Rust 编译,无 GC) | +| 异步运行时 | [`tokio`](https://tokio.rs) | +| SSH 协议 | [`russh`](https://crates.io/crates/russh)(无 libssh 依赖) | +| 系统指标 | [`sysinfo`](https://crates.io/crates/sysinfo) | +| 序列化 | `serde` + `serde_json` | +| 日志 | `tracing` + `tracing-subscriber` | + +## 运行 + +```bash +cargo run --release +``` + +首次启动会在 `%APPDATA%/meatshell/sessions.json` 建立空的会话库。点击右上 +角 **“+ 新建会话”** 添加第一台服务器。 + +## 项目布局 + +``` +meatshell/ +├── Cargo.toml +├── build.rs # Slint 编译器入口 +├── ui/ +│ ├── app.slint # 顶层窗口 +│ ├── theme.slint # 设计 tokens +│ ├── widgets.slint # 可复用按钮 / 输入框 / sparkline +│ ├── sidebar.slint # 左侧系统监控面板 +│ ├── tabs.slint # 顶部标签栏 +│ ├── welcome.slint # 欢迎页 / 快速连接 +│ ├── session_dialog.slint # 新建 / 编辑会话弹框 +│ └── terminal_view.slint # VT/ANSI 终端视图 + 命令条 / SFTP 面板 +└── src/ + ├── main.rs + ├── app.rs # UI ↔ 后端桥接 + ├── config.rs # 会话 JSON 持久化 + ├── keychain.rs # 系统钥匙串密码存储 + 加密回退 + ├── known_hosts.rs # OpenSSH known_hosts 校验 + ├── system.rs # CPU / 内存 / 网络采样 + ├── ssh.rs # SSH 会话 worker + └── sftp.rs # SFTP 文件浏览 / 传输 worker +``` + +## 开发提示 + +- Slint 控件有非常严格的布局 DSL,改 `.slint` 后 `cargo check` 是最快的 + 反馈方式。 +- 应用事件循环是单线程(Slint 要求),所有跨线程 UI 更新通过 + `slint::invoke_from_event_loop` 回调。 +- `known_hosts` 采用首次信任(TOFU):第一次连接会写入 meatshell 自己的 + `known_hosts`,之后服务端密钥变化会拒绝连接。 +- 会话密码优先存入系统钥匙串;若平台钥匙串不可用,会回退到本地 + ChaCha20-Poly1305 加密配置。 + +## License + +MIT OR Apache-2.0(双许可)。 diff --git a/assets/Info.plist b/assets/Info.plist new file mode 100644 index 0000000..a24a21c --- /dev/null +++ b/assets/Info.plist @@ -0,0 +1,44 @@ + + + + + + CFBundleExecutable + meatshell + + + CFBundleIconFile + meatshell + + CFBundleIdentifier + dev.meatshell.meatshell + + CFBundleName + meatshell + + CFBundleDisplayName + meatshell + + CFBundlePackageType + APPL + + + CFBundleShortVersionString + __VERSION__ + + CFBundleVersion + __VERSION__ + + + NSHighResolutionCapable + + + + LSMinimumSystemVersion + 11.0 + + NSHumanReadableCopyright + Copyright © 2024 meatshell contributors. MIT OR Apache-2.0. + + diff --git a/assets/icon.png b/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8abc411a80fba6c38c7524ddb6c76ddc64c565cc GIT binary patch literal 23026 zcmV+QKnlN!P)Lh6TSM!o zpAL17ZEAk}iI#aJi~b$bIzLgQ52Yj1whWzP%92Qt`iYtz&I|y~3Jy36256vx-m0p% z+H#9{@A{7ykr|nlSzWzVWp&3F$j+#U$cPv5-u=FN@4N3^VQlefbK=Bj%>4YkKKI;n zu6X3}$A73^sjNLHVvhS%pTZ$)=&imGT4d%O5cv|35;HWXCDk6ZOnw_rTbu8a?i9HS@rYkWb22fNL?|mCMr|@l2 zp7;1aHm3H{3orcP<@~pw=F{dgCq83No;>Mbe0ryGApmpY#0hiq)7>c^uf zs;Ywb4pr|}#e<6E-F_+PCB_3v=!_IZMbwBGV~j-v(ll+0$iG4O7v9V7z4+oEEyCvZ zzZ=*s0Sfw4rV2g%^oe(=+MgEuPgxr+s4C7mRMkO`Wp}BpB}&`~3fieyYb_#zbLpaD z{;7!jC(l2B^5yK@yffQzjbNvRN}hf8S(7u~ho1a%->1S)dG$XLMRCQs6z_d0^d;^z zbjiRNW37!y)1+g>{4-Jh>E~bkqkjuQBY5t)=R7;;BiJzk%O1`_=K$ zzG9618C9*MY2pAQB4w{%;%SLcGlbhU8c-snbyRMtt z`cFLZ;YX~Af6ZF+{mwbO_h~8gB}#09s;V=_MAllI^MBxc^7CK(;^$tuoxXuvE`&w< z<*6r5{H$2>KZwX|nx>`Tmnd;TX1`P1GiKd^8!Be%rn#K zs=q46{A?J`^DYzq5+zD(1FGsojJ4LH-v5@^_FwpZol+B7vJ81;`8X_56$bKtrOpkMf-Qus@h*m)F4Ai60MxGn;C_St9c$&)A3C*J>&r^TAza4z+f z!e64qZXhFp)QdI0@x=Q-^7P4*C)4W<9o{wpeEQR$HqSlxoO|l=kGwmo*nbt4KhV4& zB}$aod5Eflszw$2ubz7RBkz9hx#!%cKmF-#%k_3oly7|F8}gp_eBY#6`5iGb=e^Io z{bRGdS&0&N859vQ-g^}zb86*x-t(UCoBYN%zOn7qvbIG4Cr+HO&pr2?t5sXS9!1f+ z)3lS#-Oq(z%TM_!KRf;bP(-k4+DW4*dUvhb`t|3Yd(NFWabjDhz%>aVxBH*`;D>)E zisPS2l1?gO${?Q-CB_IMCQ6b{8pZL?Jo&*7|IBv%0b3G4X7~GN9{<=wV(qWH5aCx& z>M2oT3?U-crKuBZfBl)qKladb&pqd_Oem2@Pi-x?*Fn9SN^A<`j_$jB}$AtR5gv`O4La@fAvdW`s07F)fD1U z1YiJt;)xRr0^bl}R#nS&_)C=78&DBZRaO+<@x?EmTx7(u<3mk=XP`s?J(lQ>Q-*XeR67VBuTe_r4Dws>J4H5jj*w{go(j z$3R5{RbB2R{#{@D+UJ(ZWIlp0+wbJblWAPFKNuN1pCp|!=6?VgA(q%95Gnhv0>pdo z;DB^X>>y+t=kFnidUa70Pk7@#41DLri4!K8 zpPyF%@BJr@y<;AB8$G>tWqtUuV#^tIUWsu}brCbW*F%4|7W`q_z<_{n-XL?B-hAOo>>vi~Oon|i*wnAp z>+f+QP!SPTztU{+z}LV2xhoMsy`t|G6VEuGdSP#-^%^et!v%hDpAM)3vMB^|q^huo zsq#+8V1;FWXBvSD$N))*n*h?nYU!Vnkalk@L~xB9fkzE38_FQ2Sd9YaTDpk#ecg#r zF?a-w#oHcf>6;zY(I}=xkCij8*{`+kEWq6XctEd)NdJ5N08*AZy znIhwoR!{p0bsZXQcHcl4*)vG?v!M>ry$Jyl=SiK%c~3jpAZf0VDtHs4@dRmQhBTf8 zBqQ_C3JQh+BHA?-ibSx7OakM*M?{W5<-y1jKd2(LECO(>OTQiA?>Y3cXfF(+j<~&s zZC}NvEh<)+sKwN)lT;&1Yz@+N3T4;unUJf`1j!&Gn7E2W73@T4D3$5`07w)QPtBs< zBT-B=5d>Z#BZMlO1u5^TZ(P7~VIG9Q>#Qw&rUK` zi?Ct6gRb+>JCC{`@M43&+S)9(R>w|E6HU%w;wsU^Bw`~Zt^|{@plXMnSi=1ay|P!u zby^HF0d5|{8{1&+7CU>Wdu}v$q*nqT-jq)|XxhQGnz(j@w6TV3tl`=XT&od?A#2=X zqugbF3(CK<$dw|1*a{UJGhK^uURiIYtTkJ-HqMi_E|b&`k;GF$iz7GhdMJ(>6or1= zNkCP-wPI7JAB;dJce_B>!k`Dgzt=B1`oiBHgYgNq<}$Xu%0wmN!0a>=l_*SvR>fxu zkGeFd}P?zG`Ez*q@lGRHjYgb6uSJ0#b#v<14DI)0emSh@ZP71RVF*6e} z%}&at^(M`=Gep%H+7pLxCdQ~I%&N<6q~0)L&q>%b3C5WO0(3G$^%+&4IXuU&BCjR< z*=A;&d%PIpWSz>!A~7j*vy;qDRCAxg|8#IpyOSh$bM{sl~R0uh6%N4-bA!@HE+ zvDSya7}Ft}dqyZSzd+6xF59PsXB5FyYg8vDsUAEQ2%))7`_egDOK;(t>p>&f!^msW zWupQ0O2ow6G%L*xm)F)XNt4dx0!ciH@jjSE*$;byzS$%gR}v6GG?=!}L^8(X{+reQ z-iGEbzOGX)sQlH|72?Jc6P1{S*%_*l!TFxxOX1p655AlFvA2NZUJMw~ z!NT0Z$loo1OS`0CCZ?z#e>=4!53+vh>$I2O3M8<{-^m~m?5|g-S0WZy8pzriOnshq zbzkNnR5Twc$cGUnCxPBI$CU&iRAq!RJN_{MIw1V?)c$;GC&ENyiKu;rnaMiy(=|Xz zz4iy=h@eS_`n``*zwaHm=6av7ckig(yNsh^w0lrRT>@zbM3{c$1Gx4E>B?m!+WRB` zy_S%ACAPvnb5ks>wOHL)#JCR4`g~950nJBJGU*>Q2gVQ*I!?VS0_cm$SP?zpGXW;e1d1ZgS0tgpZRsf+{pAUgUn4X(x zlVfn4{Q=6@d2fcr?01E~FwB<=f3e8D8x4#uypw{b!q=_oyc&l|9JXuE-HtdXoNlU`ZIw;MPM6dXGO=%Hu#Yd7{JCjyUG zAxaxm8q3T~*1Br{wqLI*A{HWxYp&xqR=~W5iEG&UG-h%pd{-urY7L3vaDLJIuVfK{ z;mgrZ#tCCZ07LEm%;TRA^>sA?b<~FkWIT62)PNFsfiCrjWRTotOr|)Fv~bGQo_RUPPxLs3?++nvAnQV2lW0gzBFQKfdev_XrcM z%S1k5e*ZK^q&swT!}rc_Dbj1?+5I$4NRxJG@Ru+2RAk6Pd;w!IwK^e^u!6~B|5dxh z(f5oB*a%adxZzTxif?W7UpEWjagEhXK=Z%XxCi0u!-icCtpgzCsjFkwz0(?@?pO z=M4be2}C_DVC!n#NkrpNzr(%$MU}sQDd%eIGPTICf3k|d)xtlzl*8q;XirC5Po|LaPB2(V+k9e;`eHCNS4)ziR@Lt(JS!JWu z!M84x)Q{pt5wHDGXG5HT<6;VojRw$+No3^K_x?A7f?$dC z=96bxS+Y}fI~N>^VuUD)@!m5zImzVAWY(kidhs;ruzK|>Vhqluco(K8 z8)GoWpsK`i9JT>#EhcmLNw$vyv6i@gcpx&uzNra1S2u`VgCwel_<-D;A{X}X_qbsU z2w=1A-}C-=ZGg-fD8!vLVk=BlqaE!1N24g@xuARRNz;@xO>n8hdrut4Aznm;ef#%^ zI80->=id8JU}}1b;}1N9OA@ALrn}p72M)6DzyZ{`?)AkQS{n_{pF4wzD_p#Ap2hR$ ziE33YoH@BhW&09 z+44|DLC<^bG)-}7igONYE!A3$>6sZ0%`b3p;V}0<_z(|1^f1O+j1lg+_r75Ni%`$V z01=2{x{fyI!oDJ!MPB(Zw#H4t905OOk}xm_AJe21NF+O z*I#4t>{%|HJImsQ3#_lMu(7d$cPSzU8(E?#?rIIi=MD8#5f3>Z6tCb z?>g=>L3eqt?i?b9D2|z)nPKk0K@Kb|aQ}S|aQ{OOad6=Y(=^j=`UR_~S&YKwcbAtvi;KK*`gPuT z?KLhgUSN4?k@dAT+O1ZX*lZL9zk{`5u@EFQ^sa{1-+t}}nvhJB>p11ir4`nreKafk zFld)Ni=Qyc0zG2bc?QVu+39qU`|o>9t+mu@Rcf_b*G}9SGAIW7C`A(Rz8CbPs(6LT z#(DPHlp}Lf{i?$aqFX7_v(>!!q)E~hbP#M5F*QBS?7saRT3F!NJ@@j!+aBT2;UgS9 ze3+@3SxmhSHUjlQ*wX}DQ2z%VKBKm8HMVlDb{nO&5Jll*ZO|ZEE!Nl8SYBG>;^GC~ zc}f;@2l+co#DTWhFRD^#mh;yCX9 z;C5ki1I<-`-`D$l6!9rj8|OGQS>eER?Yh+eVGcP}B~22NB*A-!dc{T&wTTH19Gd6Q z!UFf)dz^)%$2fNHaTXR9nAx|V%Jg&)79|KvF6hqn33~CKt1E0=Sfp|G99Pbq;oRvrxv;#*l?xZ>tgmy)CHT;o*r-_2I3_WMd<_j5b7HuW zwsPRmJP$qcHqI_y;^pt0=IiIzX?9%KuhRRNO$3nN=XO31fOC#^yG^^@Ce5@_5eWoP z{6XFzDwRM4l}dcuw1PnuwnqY)-LD??q4$r|4W?R49Nj;~WF^9n>{W|4R$%F1rzd#l zaL!|`rBbc3Z*Go-!$&xL^cV}r?%}@U_i=E3oAuV2{WgsP6zzjfrxTo7nN|=*QTJutJc_-4|K2Vc+7`6 zFVbFGV)czTSwDN0t7p$~<@|XrU%AZ1PKz~{a#fUuftEG2P`ojiN=&3+jlo#E*&u1lV-C;9LKjzE7<(AV&qv-Ed^1JBrOC-(r(f5p14wBX5T(sk}`Mj zAo~s+ByG1@IC6x8M~>h+9gg4k00$2bamYCz*6Htb&~_VbwfgL0qXyE;)VU% z=|H>Pt5^|C98-Vz0qT#wjr||}NZ0Y`R#s@9yFhDkk+s)Pqj5xIZH?vEPO)BzSZSfBkDVqtw_gT}^2a5@$o>uHkGU4*rOD31HfrFz@jip>aWa(0$OhYm6Q`Z5J>ZngnVkWa-8Jjt?(C~NBA-BFh)K0$>RrsAokr=x0iniLI ztzIh^!A?#x_0Gqbde1vKm``T%3P}=r*G>nnuF#4smoHu7%B73J{2((&tmVzuUt@i3 z4QqP)ZDe`y;YYBM4d)Sh`Fg#6``d~t##$=)5&E9?( zt}76zs1-DuEt<_1Q4~?FR;W}eT@wMWhYU6k9clNU5NJ`2E%OKFc>IG;@YvHIf@UL} zob)EL_>GNC%>Mf699TbuAsdM zVVN82nyUYx(04ldXhcuNznSN_=}_R}&68}Xq|uPfUr-^ALqu7QtwT(+QGo2*+frNqSp^zKGj48K~zN?AHu} znGlE|ib8CBF9sk-zX?#>Q=-JUqrc4-On?Fl6a_kuB)rw?{dTY;vjGRqgia>`fyf%- zIFNzOCdvSX@zd~c*DbJjG{F*gD{^xmC`15+L(-c_*6F0AY3S{PBQGB$+1XL4U04t# zo2-J8B#tBr4{wZwS!g!GMi!HMkdd|R~~?O!@s)zfJ^+SOchh7pTpZU=o)T6<`cN{Ji9 zHrtANk9uF2*19)vXA(d@<8WZEc|N2lh2^p(j<+w!s=ayTs%W;fRNuXdGrCHG7=PTN zwqm`9$w^GL8h*1!uy;y2h+@SRD=b^)TJoi?AyitLg7;x9xYbpBl7RO#&YtaN-P!tf z;o9|M$HH{vIL6G(gows`72T{{-Sy&}>t*!GLqEGqNtNWVW7vVV;=RXCOtAjiYa~~% zX3Le0KlTm*XjmdVuNW$oP;oX(a^YOadDm!=UcE|dagp^?r%2b=ktm|^#v3GSYnV8u zdHy`E(EyQ9S>9h;ATvRa_w55!Y`xCJkt6sdA)cP5e*gVwl2DtUr*`xxwfT9XnHeNo zeyZD(%RNH?5=BH46Hu?? z*4A*BF40#x2_dwCgCsnEH6nfAqtr0eVWZ1q|o^wL>{n1U*2s?}}JzEV}v zwKV|JwKbY&&g2Ks&wM73gbhhDqNypW2Mf(UbFlbWb+fvxRYf%*RyjL&w=D9YOrudBwlI7*w-c~$eu^Q7!5z`rZ&NyOE5P+)E zzIcgq|N39^>K~tE<;)qv8jn`ji{nb|ixcsFrbsK6lHAQ9LKC1KcOdLDL)I$$ZU07hEs5MyIThA`< zb<#AV_&5&sc>a!@>-Of&r6t;ni>$x)8qKq3X)i6&xq9`sw-qg% zvzIXb1R#Q@9oAocl}qQ}gii_meuMHa}1G@L^o5P3_re?viw*c0S1s%I~%@M%iAyiDW#dD<5)&^&jJ#+fs;mzHQ>xo)XpL@w;ZNJ0duREVn8E-`eq zhBw||{k7M)^!d+s9aU;9E=@!J!CIYmyF*1Fd*M4jx@8j5qp$=b8?XltDq zAzeI6^Q|{nec=n776X+EW^#)9kt3Li8pc>=9=xBadyX-A^e8jOj#62e54rxF>uL*R ztI?1zp`DlII*4JUCREfwpx+^1-s93X$*EUJoJWAw zKY0N!25&6!>@52pdyE4gcpuaE-oxa=Jk`1VL{rm9)DuJ?OOlapyVw#%A)&`0ihhhN z*+#OwOzXl0B#vokz54a4@ZDbhPUr}B86^SiH55oY%e;<`Y^MMeK9cAYJ`_MGS*6Y-c90`JZEf_;98!D5W1Vqp@W&O3+ z!pO#xo@Bu?BGTs#*E9|1n6R{4w>PiX`+O1O zro!J%C<$O3U<8|Z5b%)+Uj17QRlMs9I|?HYl}cC0H4Cy*?@3lyw|!}`mMD%l6Gm}+ zSZ`hm`mUoSfZc`>q?Pj4;TmzvarjDtpNMV`2@GOLZ`;i?cRlg!rBLr#l+%HC6IL+I zlsE6K^YY(+ny>x$-^J-;6Uat_SlQhHq#QJcs+h z5&rB~pW$2Y+mByMLe``)96Bm-=b$8j-GC8H!*S-GI^X;|-$nAs9QYJ`f1-rKlq68%_Ms$zorV!?BjxO|S`hw64?A}W@tk>Rns5H{6SN;I2!9SEpdJ$$mj8?Q@a1244@)uFwgX#|K#5z6 zk^puPBH$9onP=wNc;`GuM@&G;#>TBWHa__%U;X6|^5%R6vymbt36!{nC<$N(pJriBJs z5L}ObR^skJNdUV90i082XKH-k6}azjJkP~{_A*`!rm%WY|Bu3cqsr=k@(#Z8OOJDA z)?%6twSs4~P#eH*^CKg!;Rim$l-Uw{3*)yS2=o>M(cZp05dx&n6V)R=(lJc`%1iv| zTkFjH{0FF3V!Th0!QMUl)A)qe$By&z;X2L#&zE`IcUGxQMx+DlrR2iAAqFqk&QPU5 zq)=A}^gA0(!De*XF#%G6JfE{0xYj_i`^t2u885}>Ew*KW-n$>O#=K`H17#W3G3dx% zr`WKDEyi@a8{Dw63_DgVivh%WG!mYksx$wOU*&}}Yo!0plT;5)lMcoSDv$S z%K!Kw-uQc8$A0cA7xzuEfndGjq^A{JG!cFqZ$N>nDs!4pep`La7^KNkuRU=WPV@2e|j- zD*t}@1&;i!_p|WmAyS`=BmsN^ho`vww?D|K|LIkd-@8P$8k5Arj7ynTj|YypWZMl> zfizpjYuUuKMKHiQ6KCWrG%M0Qx2B5Co^RfV`&d=(^&JGLtLKPMaM`&BG{q5!W8a?!W@Puf|_$T^t`!v2ZAa*7lB-tP1Gf_w@e&JL4>om zf(2R#7fpl#+G0q^H8`kcLO-jH8Fe_|nCnni#R(jB2{rYIz#*S@wLaL|M7bGAcD0rm z+G6^yEDD!RL|Y6BoUs*Lwtd!CaUyg?xKgdNzP!Yxr3;*0OK}ROup+aFAY^}czq5Pn z(u&PvPXJDp3d%dC;2m>w965M^H#8zbSrx-oi7+T_fmB1aMR=+{^nAHf%L8*hrJ6OS zT(!L!q}d8MgDQ63D>#H!)|2)cK1`@`P*YOipiepAQ#v9X^o}{7k^l#-A{!mPLYvb+ z|4#P*g?AC5cpZ_&D1V(|nEZp&yyNeEjfFK&I$^=xcopXw)*y=SufInW1SJunAqK0k zW-KdWiB-Eq7!x##4GI0~l8H0_K_HSG6WXIMOL(_M6UCyKn{2_k#$$jrF|3Kj(62GJ zjKu?jP(_KdV~2c7CDVQ$B;k$ASNP_o%Y0)UItaETfZ@0v0;r;V_e6*9nXU7o*=g3j zCxR|pTUFMKWmPN|<$Tt#EU;+e(8KCzfxV&f(@!XIwiK5Ij`$7+Fsj_^69nxxT2Fru zCIhB{&&-$aRV{L@ma7H{2x1Ua6Oe_@xUx`rmz(`(Im!={Q6k z-o&$R_jplLD5}hMh$)l{e6B%h=1g2R5vrkn&)FEO&=6tK#27{k?2R_A zkGY(jHIQ?PaL}hz)#C*w)Dx-VfGK16{K^{tZl%E=H!HOF00Ha?9{>a&KwAtOVrUCp zm2x5zq(eU8uqG(*Hd;gNNw|Km_$X{;Qsnk*-XlW4^GgYhJ8butpzklQ5EF zyw3Ay*GYfzDW>OVaKropg%N`Ey@&bc-+!9cuY8ray>O9eD#oea(3*qSdPk#7DKv+ z+<<$A0D7YUy=^Es{t%LE=cq(cR2v@V?i& zf3dvR^^6J~=b4|Y^YK${=05dVF8aAS2jZrJk#a5ET14%_|gbXk+sGcjG^dmEOA{$F2U?GH~O zGGaC%^wt&-xcr~LpO^lN$7p#UCKByv>2ELgQaz3vb}2U?Yz_e_hW8Zz)*;94Qe>)& zq{@NE4|D1MeZd8}RV!Ao#?m}>kuUw>You4!IB{^6NW$R2SP8(bNKG~tiV$thTbfzP`=%J9_{~aVZVvv zkeW=hl;7EQU%IlpsI6QN_6z~2_xMhSWMzfK`w(D}Rj?R?L{YEuhh&@C%TOakiRX%U zeB);y;nH7zC&mhBIzsq06S|1S-~ASE{jEPHd21az8KxY+aAlRY_x$L>9PzC*2a1B8 z*MawFlHii0w=c^1i}csLag~@82JC6=v5H5p1nS+GzAYvk0xl#gLlJ zT9VaOT&vY3lJ2{>OWMlyV*Cj}6^SEe9=VU>&wLlh=MU0uG!RwRPn`3HhQPXjL+VYLR_FguA=m880qXL4wBF5moa`ylCCC>f5 zFQV%mY?f>!RpnqM=F!QC8}|i_67)31Wr;oW-q_Y^R2LSg&CjFG5l>A~KYkod5^D4F zR2LS|b~_0D+#Dncwq8f_^kD<{9k$PBsmU;g)`bg!0P^;cWt6@v+R6=J{0RUMBgE6w zOh5cE3qSM;*w`S?ACCxhI;89Cw3e6YT)fEo>C-gcdW-hOi?lCa-js1xti{A}uLsC5 zPL-_?dik}4Qx8q?%76WSlJ_0Pc0+=P3%@az&RUx{|NG~;_*-8O-t0^mnA(veOddN%_25COhYn#TCwte- zvkrM5K6z&1G=+K{yhjIn`mIcWS`9NX0jf+r_E=Z-pMBzq9%G# zbY%shY9 zc>t5AqK>0XT@012yU+`$fJI1FJG}DDA>R0#A3*P&4P*PG7XR?U-fx__!s-9!kGc9U zU&B;vmg_I{{Etr6`GG_Gn6Jci{J`P8|tJ)ZZJrdlPMo~Cy2Al3PKCXODZ zo(cNI!UA@B8giT5x$sF6Xf}gdUVN9MoPGtBy|`~Ea`MRET`{eBvCej&t#set9>Sg> zfIO3IH-S6%;7HzfYT)ISSd70+9b2QGMXYI^c zHWruZT)G6E29hPp6l;kqadux51WJ27z^%??t44^Nve8a>`Nxm5^#6PxGFe4N%?K>^p>(5We^b8}P= z9;ANny-eMAAC-d#sU12*G&Kd)Dp(tO@m$b59kksp_#rZ($Zhc3At2iwJ-Cf+#fxC$ zsE>^H0>*AZkg!2-L51y(01kSZ^9v5EY-6Y{EKogmjM>K@5Br@XUEiRwxJYyPBI{?) zuzvO&jdK@hURIkR^a7#d)E+quKIC>_gs9`W94jw>>K$DD zi;smsjZtd?Xc$H^CgS2Be23Hj^&itYwSt)lON%*#iZy)Xz$_oyH-%ND({6)vxZDvJ zMMRU6T~&SJ$PuO}SnFk+W=8=b4Fj>!*By`r+ zXkWU_#^Mqyr{7}b)a$gCmswk0#;UAnJGfcnjAr7DTFgOpb7M-;< zHWrs@EG@Hg>J%%d-=e*|OykNG;!2D*oA~BBacmLqd$Hoyc7;h*G1ed*;gz?~a_VnA zPV(46jL(M6hP59b@(CpCE#CTjFS7IxUqVtvVuKMwM^ldOo8dov|GRk4Lk|!gK1}`C zv0%674!PVBSLo4cHv1<|-Km0pz1T)u@v7LVDWY19c(R_ov+*|v?p^{IfuW9^JV>QT z48~BInV~W_$NqP}gJa+Ov94O2Y-~Uj)4Ftt=B3NnO3eBjr|}ybRB9C(Z@wA4&BhQ} zOM9)wmmf-a{ja_anV-gtQu!f70vb!_Qj>Fk|7BKx_dL`0KY*#ksPi~$c=BEEydnKKkSb`3pbx!_4lV#W!2Mh{>X$?*%)(#EzgOfSbV<&Lp6xHRStqSV6qy z+{#&g@4%n(`U6*quwndfi-kVK7*@Wt%<`|lMtZu1)WT3(nx;f?#E*Rc_wZvM|6VGU z3cl42L!~83Y=M#hZU=I;u&~{CED^r7cADQm_A;05Z4nc79f6ymLDf{?^6#JF(r=!| zUrmsj!60;!l$q%%{-YoHLB8k1Plca2R|06Pd(FjdRcc}tk*d{ z^u!1Fi=X@v<_^r^JDreDtVD_HL`eWU2qBF7SL;>2f8#x*uXw)l@EM{g3JZH=TB0$A zwLiVg(yzTr@@fOA83e(l9%F=M(;=}yJpZ^3?GgGDTm$)q` z31AG6lRz9r{Kr4~Lx>2I^*TTH@$bc2izc_x*>^o_7L){Z$6+iN1nFCW>&{qu?V6Bm z1)546^A~^o&xg7GLU)CpZDVlx>rMN!`3BkYSlwyC{e>C+(!K93*S*c9z3x_Y7qZcD zjR6cOHGpw~NSNy{0%(W^+)9Z0)+-Ea2S^n4<|0&Lx)DbC8U)^l$x23`laQ>e76diS z8cdrlY_;0Ew}5(2T(2XOli?cHhU~@ATig?YH0f@ubAdGS@Z|3GuAdn0UMji0C<$QP zAVanX*R9W{9TQn3ihHa0IETxY$X2hcpE-m2u(;>dS6@R_Nj5fEefVsyg>c%VSKC2U+NIRulylK3A`uM>jTtpf4`cIDdilv*%cS>kO@>WttZ+(OF-|w>tocHDL|= zOvR3>)q>hxFWg$Oz*Y79*|Yb-eKU~wYwFp(Wy8tmI_FpH5{7p!^wt7CN%84<&~r%g z64A;8aXLwL-##kSQ=zOjUxjGI%?;2}eqil=Jh=ZJ)OCCk^Aj-1)Hk%}?Yc!UZXBSx&PSYq!G zfJ9MnLQPE~X#$yTTU>W}SEs`cOCXZ>>~Yjn;dAHP<;$#`dV{N{UZ-*40;{i|rm=jH zWNi)CYT=y^i-kr}PtfxoJ~ zioZAq?GBwwS6E+Mq;c*7>*vq2a_V(fPrX6w@@0G{B>XU$po_J{Q&YnQ{dSCp8UZWd zM=VEni=jidwuC4e2`{!*`TPst#8eH>Oiyw6`4@0vFmXg>b~f{u7^V&%rha&V*@quu z`ktdq&d*cbzwh?9mG0;Ie!ANjZvx1ms3fc{ z@8O52A6{T;VV=tL3^FqfXiyDP*B$-}S!w%RPXh?YhL4Xch(Y4GKO2rQ{SLX;UME>! zN1}+e({IvPTBdQ~0_~Nx;D~b`6IpDfLR71TTzJ`FaW~u09$Hm)M_^#lD60w;8<9@b znW)$3c#o*!);AzbsOHkrMV7z%Qs_IZr7}H9We3`dcptv4*;AUuo*)1K6Gz1L2`cqE z%_OCD{sJ3sonh%uz6c_iIHoc^O?Cf1_CNM03y;5#>0`&J?%$85X;`a0AHyD1Kg#Iw zabrj~8f+{svVQhFE8lsQ=JG|P64SnPIXL9j*72P%t4|0{xjeaKRINa*r^0u04(@U) zDber=35Un5`^x=1UWtGh4Uuc!w_#|(^^j3@RE0TiK`!Z%pi)?%#1PSnCV&e6HL z62`<=SJCghwynw#V=z(7rsgI>T(55)$+-m%xt&C=*w$4z@IU@3df*j0-t)$!&@p4w zUNaw%CXV)7YhgXa8!)nmk?*Z;D;~v&kT!D-pmN>i+zsqa0vLr%5OKX;TQXZdvKDIF zZ`z}>{@y9}xd$dic=z)ciJWpdP5JW0%dDghD`V!%60lW^#3q<4w*t4gtpq=!lsDLRrdV14&${TNcK-LplWY4$vXq3VBK2u4OKsRjO?D0F6T17+PYnC|7O7x{a`^T#PHUjKL_`5Lf6)mf{K?xuzg`ftvRm zOgnfaD~IAlm~|<$X-X=>{xqSY9*<$dJE8&s70a4afg3^=(4&dHqFvl7a`t(2G0-#? z%?R~!6as!)Vpy%!c~h=%rS0*Z+xb+t4ts_Ga!&OKHy?_#x$*~(Ub`U(O=Gfh87{{$ z04-x!jH_6bmRK%SDnttF*0P!jeMbywHv25^=@qD`r|NyU=XE~O8`TLQG)|WVq8L^3 z*tv>&B2_#v=Tc(tF(^knZ2)TCF`smBB2>L+pG)u0goiYqjYB|=$>sx)i}mA({JLOT#c+t`ez6^*MjQ)P9diEp$K z4=UqJj%6y15t^ny2HtGZ5Ei3Ke?uTN?zZWPY}JQ;0sR;P z=hFZO(hjM>T+-p~&2>_QiA>n?GKhi~VbY~cdB=^7#D_+H)y8y;!Kij~4SIwNaTPCt zJkM9Ec!ajGe0g#fLq91AO3izm2s18a%B3V?m`gkC%QT9Gq}@Fy*DkdC>+o;g_w<@>OR7bhECo4mlL@O9Y;8lv^S~e01veq-R(j0 zvncDvvSuS3KIwylQt7R zMTl?k33nD_O#n*PI~w6qrOKa8?&J0S3%E2aUzJY?(vbw9eb<`su1^iFcuz%@Bb|1p zb}REq2ccgj-nt02m1!%6P|8_G7FGKnRs#RXNsb z^4_aUJm#8VA&9;+hxaGNp;r&=OVi8|CVh^uqGQP3WJ4&Hz4$%soZErX#4`Ne`I}6N z#393-eHQHoj@;WxyZ6eqi}22RB@h(JZ0wGhuBNeJqppADdY{cBRJuNj;H#;r>)t$G4UT+&i zNA-rCE3)a|VaM;z#&A8jUf~(4Y25VvN7v(a%XPP7&kz9gt66(Z)hZEC*4ubt+(#)& zlqhi zLFsR|d1x}l?V&q&9^-2QloDU!PQe(rnx@2J*N zM^i(a?ah%KUyKC-TuY!8a6pS z$;4GJTuRem2JBktN|fkF1gxZvOKHkgAKGevPAAFQ^!UMSJp*rdKD~AM6eKMBZ3Pxn zSog}C?G9FMMTVdfC2kHLup+$K?y&Ba#WeK(nzh}bZF-D8+WjO zo4k4b`F=#8I9*u;&ZWY!)bm!m!(+87&6^~GL7^J99)2(9Trc@13{Q8Z^skM7Jt(ea zU&Q8h?L#?>8qlz$m*F|?9_Xg+{^i|;UJ_8Nip|=ZfsyaM_+B?12Wn#Yvv!-+)N?NF z_x=L|qXE5t2X^inc98%ECPa(&zheQk=MGeqSYR<#E;{&jv&p@c3XyExGY)GA(97&A zg@zy$GQpdo{A_?^qFzLqgujN~muhV9qy*o(E;o~NF4RSGR>J$pJ@JF7&*D#|Mz*k>KzXf}CrvQE=`BIs6Nk+Vl-_HCGuLoRO!R`cYM6(Uux+L+5x zOr*-?D5jkeK+70<$uWA@%hQg*kRhOLK!6Kzr7N5b+sj#O3m2niYk6RaDvMl7g1h zFRTynO+%sX~%BOd%50T zu#=l8HXhjvjv_w@!d>+t)mE-usD$@mvgez1DKi=Q+3TQz+{tEuRU5HlBP@zTGCR9J z)q1Y|-^o_QtrP#Pj@`H&od3RS{)p+?!B=favmLAN>tU}%(a@CJMH6KdaxX)k&9^Jm z1QMO}jw$DG86i)2-$yRF|6?n1h8yvJ^vXA?+{2JRe?^4Pt*!H&R+|?au!i(T{q?Ao1ytu3JZSkGBiJTo%FdM9CdT{xO7vA?y>`z9x7c#mW~ zOR*uu0|`M#B>~O%7Qe&x&hg|{&EZ;Eev8>}M?GUTBiE`=yXx+7`n8<=%{PqgIyk$8 zJz%12h0SVp?M(co08&9_>?DP1%D$e6Kqkn!W3c#lYz*J(cqXmEwc8|7#5*Ty842{i{yRCdZxMq6FlzV; zg5adZvxa2TjZ}#@89knRJ8s*g*i)-}d&qj`mJFs^@4x1_kh204BD~ya^7Uqew-R`z z)o?Lj;Z+%j2!_8B8qCSA@m7vHdLs+15`x#N;6oPqU)f_J11)0)q}?P z-S0ZKLl(oFnn9okudw}l759ugA?IzVD#FXn7GK@i;PnoCx#_9ol3n=fsrWMR%(CnD z{xC$U`fX#(qpG@V@-o8dPtng_JV&xW@?I+fzT60^zp}xV)bZ3*9T6efrHH{h8RON2 zZy!7mOBjy++}Z}Ow_BXSQ-hVq1VI|+muGH-) zKR~VxYYu@0r#i~nrYHEtP$d=kbiR(h%R%#+#P8~0-ud|e- ze6y{5yXA>YVQyca+MjRtA_BMW^>?jBDxtV55y)7~sp<9bJ;Be8WZ&9H1VQ+F=71 zG7o<)_{Hs_;1Blx!@d8z4e=4m7Z9ErrG)P+bklaf763?Qk!o-p6}LgC0_PIts&l-j zrZn6JZ?@aKyI$u=CC0LOZNagrj}kkIVrw%5b>9JJItgEIG+0Vf&L_&Bwmc0V`~WIF zM|3Xtz3reo^m_l^C|19w+w0VJ31JXi`9kE;4Lc?x&~N7t*%rxq{h$r>NI=x*Rc?$?dEO2={>Kt zJG{|ub1_Z1oO-_1QqFcf)(92pbvWI?o}%z)`@4RDLPHw0z1#5UMr5u3Qr3NrnXhbc zM4&fQFgFFdBtSp&Dj|N}7&w!7785vLQSPaDE_4#U6v3`oY=Swduu1qu1|5DyC*Wwu-?)&02%<{MT0Ipx=T3n=5Ap!0XV*1>ep_j?L$DzI zlIsQeYwafivMY%yRU;_E`9wLFcxocdS~w6HCT+@ersh?QWTY_|I+S0nSe6pwgHd&p z&-oYHs&u^4QCRcJhJ#C~XT?EF!@7O3DTF;s-j;?4f7cn9-%>W+d$YigMVs*;2K2mh z?o@RC{Q1U_Bgel9=7I5W1orptMJGyb5(r_&U)LW1Su_^pdj|b4`5c4Tgo;d6SxS}j zslyOvcSR!9gb>;}9!C>6-EbCvWQY^B%t_?8W^??)K>Py7``VP#Ad?MO3=nkedd^9ZIus*^hBBNAgDXRB4%-+T8ZWU0`X?_B)OF|;h6sI86DWvvA*Ofu zzTPzkiC|p3{snjuvEK9fH&@=g0@w&n2%H3we=fo&c5zP72n->Ct|<0v0wS5%7aV_G zLKu9kg2hm%vP~q=R}$?}!N3no>?ZoO#7$oV)g(Q8FZ;W{x6gME@AZpqr6}-wK={eS z=@I$o;qMa?!ATF`T>3ePnu4i~lNk_jZA~Ef46>eI3icTEb@`eN_k{m*UjmtCpcEHy zELsM=9eo=m#sOPZhxBjeA!YfF&4OD{?F&L&jPdV__um^mKY)TU&iiJNb%2xIRnZLK z56|ECuf&*7sQNK71Bw_763R)S`%ibcuX{$(;kU(keb?*#S>jHB3~mkz=P;ojQ1?fk z*MGe+6@CCGVvKtKdl!~Y{}7qXXA6RyFmTeV@Xw9#gX3og z>w3A-koO5)F34gFN)`W3g%s6*e&HQ30k#x;h70-_3qP6qFJ8#ie^b-|1kl5WA3lWd zyo|`9@pgv~3l}c-^25&4-oJf6E@}}&uUKp|#Y4rf61#+9R@vq{8`6x2^xlIuezt4i zoB>}!@2A7>Gakt8;$=+bT^BCAx=i+pqTUH7q6-&JE-x(H^S@XV{dMns3NmI(hUFMO zXCSYGL0!M)?EAw#x5fY^t-qx*Djltn&Nz4k3c#b%)yt)i0A~=~sf2j?ihY#QP7^+_Zs@eW=elmt@14TQ(e_#Lp&HcA- zKB>f=02wO&`N85Tef#?N?}hYfL~ZR{s%_Pf1v937zw~=A_&L&wze(DrNHkkY*R>OQ@=m_ zw7nO!*e8>Y})wgYGety(Rqn^wHZeij0KeopFwD)_(7cdH2X#}HxQ{qm- z^$GDF7W@pF8e=2p{Xbb;eDgmglj*^;Mm?bc^w6RE7Oc^4fXrr*^LzP?WVjJBC~-Gn z?+bkw8dO_dabDiBynK3*g6F@8QS<*jV3wCpUr_i(W2Db2=n#Ai5RQi z{kz5Gx4xGVs(+4a+4TyDhreRgzXURdGX-}Fci|(K*lWl_e*K1rzd|n}dL*v31XyMY zy!D!@|CBMZC7YBeQDRr&j1jBqKefF4)@y8``sdir8h{Rn7MIWbw)5_{jWH3B-h#rG zC{g0pA z{Y6}lVQTy@8dS~~li1mVAK z=lqS@?->caS&~4B5<80l;eYdng&%I-c8`E`e*XAhHo`y3d;&`87%WlZcEAG?Z2p@U zezwQwS0M8w@H;fGu2y^nzO(4pfWGQz(Uk^QPZ<=UafB}$aI zHc}B2sp=K4{P6Pfo1ffa&@4S4Es{d*hG3Y4$0wqe^C=_tUm`K%s z)p_}zTPgf->&Ndc;0_!(FdawrUlq*H`rsD0i)Rs*C~-q@Al8VW_}@y>#$Ug5>Czh4 zInIAA+>QXAZUN`#kN>O@{s%#3eJ}~^ZMtWP5_bwhuP-K2bj2%wV`=Hl-^z~N^2vC& zOBjW0_0fX|k3M2e^lQe*_p4VFEs3B+iOo>J2@;7Byw^W)KK=QN7tg&ywpus0!JNL` zLfB=jg+s?brRaZajG6a7BqXLZ3rduLOcsnWc<+}4`Q^psH-9}lc3Y?5??f-0I~x7m z+KYzv=FNjD*Ree}sM9dDAr9_Ewfr9#MSl_5>2jzECufKTt@|m*~J zrwuIJ^Db5Xt{^`k2wpv)DM)D=l(^HO!6`105rc;ReqV%NSX?~wa(2#+ExfbS!q)W- z0L;(d`+cB4h4K@|n2Pt^5d*UGN-`*MCqU`;g3#y>n^%Lahmt;_4FQFjxSP_E=IOi9Qk$;NlKPmM1`IP$G zs_qZNZVOfJ1k5yo`32F+Cx9PO__z^MRk~#0vyTjXN|e}b=)lJSM#KcER^Jx*H^9G8 z>HOZ(($Zq~yT10n8yFV>GTEma-E`o`;B1Wz7$N;*|VmCJ&D4*1>FyXP-mI{&T0bs~Bl+OA^U1V!lCLEV>g&&)k@ zNv!Wxk?#h5TH#R83G(@B4)w(y0ai`9oKi?QQKOfZ^i{5@1{%*F=jd)kIz$?2q`Q&s?(S~be&hZ5{{GsY z?LPOOc%8WCo*Sm7B8Q1af(8HpFcsvbH2?q*{3{3mMuvY}xlKI)07Xg)(h^#3=||6& zKj`M2cTu1x+}y4)BDV{-NQKhcKw}+(;tF~Iu5#>Gd&{?JW)W7I>R586``bfg>RCMA zOyTh(WWy=kBns&%lRwNosOPP6P(fx1h(KKN&qg0Grwqk`+KGR+Tcu?K?aXgZytues z9kFh~G4e6}p=Xami3BIL^=VCup0|*s+e~8{0+9XDTqX9}0Ap4p3c1tM-TD0XHWS!i zjWu!GiVOuNFI}8dD2Jea-v0P$ZRND()_1Wr#+W#`lDgS(M zMey0N@G(ER+D{C394L>FM^Z(6I1JU&Qpdscr}`M%YSiPYYW|4X#pNP8@-F@GT3d@+ zc~eGPK?YlEk*Y0%R%g2QcKvk4X;SG?6}qMR^TFs8J~{QvGzFp zRM(TGcl-QzDHf{i822Hsh*+SgaciijBI@|VVc={!g>sd%l>#ae{yOlh%O}jPIT1JQ zhh{>8T?4fh++b>|LKX)y&Ud?N%5Bv3c5YtrbWad-3(Ffhv}j5(3W|5%rN!ZLWCnDBUbZ!M95-jOXU%J>7C^Wf4L&fWjtEkPI+=ekg=@l^p8a3MwSI9?wY3kzLm+LB9R7-NbrnM? zCQ8b`9ewcsv4BSWJXtM2KX9onz)N zp6G!e3@cHc;FQsX9zK6=r$P8_8vGSgC0zjLiu75I()-Gosu~v3IY<;IWkMWBrx#^3 z(8MY1`4|n?0iT>ncLIe(>}^A_$FI;=xs6YwZI>CR25c&9VSY|)tfc1Y$W)9f>Gofc z?pJPGU88d!0?`Ao=q)b})$z&yp?$>FBGAUg319l@T@Y+StS?1DPenkDkK<1zjkqDu zijBN}`at)LYjQ|x1bdi`_}r=O-56)mTO2_q<|EAH`KT&<{woWEPMCsmK+Ikx8ozkb zQyK96x83S56XM=$32g;ndP2pNTvkNq8AO@)-F=ju*FI-N09;fQJG7`uVB=o&2Mm~L zj0hj)-W47P8g!INY#$^SZ8z2pF=zc?FA8d?sCm z-qe-*qx$)W@tVOo1plM{)kg_=^0m6oLOY=hv+r;4r3)jV<5gYd!Z6j1lSAeKcgZ)a zs&D&mK;&|-#e6Q)R-1oN>gJ*_RH+zmL@wAtckCKhA4*p>zIQ>M?p8&otk__*I8aM$ zS(J`|=f!jSQs=(VMKhuummTuLia+6oy7T=qc2XKkF; zlW7>1Oh!B0Omh@cRgG~mKB-2-L{9J5z5N(T1NNul zzV0+)uzZ5RX6jm>+>_Hu{6uWeE`%XyXM4ZJe7L|9kjRVCPA-fMf%EKC)sgCgHk2;7 zPzZ{PDWr3loD|}7!EG7&9k8d2)2C~hy}#6+aUzy?|B!rS94Pz6!aDcFMct(h=aPo| z>|R!-Nx|%=0pSLkNT+uviNgvsD%UdE@s}JyRHN(NfK$(>fGjmsC}ac)Ws;}EGixiz z+w;Vc6b`T1z+$U|bo2nK?#HW~uMcgH3;bQtb7u_uXN+sg<6&xUOYYi;0wv){+{$J*Mq zWNjwI!4B+OmtcAN;(9t|(No^%w&Rzv1b}<4C`2#?Wxb@wJEG{Uq`^ltp+g|_>&wgy(){jzYt4=Jdsu)~vGiEEb2 z2$H3h;meDapT3eIs&BQZ_S|PZ_VTMhJzY!`jc38W-}_-AG2VMI0qx#2%9?}MFH&Dr zQ76Sl^n0%fD_DKFN%G13^b>cEz$AiZ3)WA23JYVTfSnlynw*8vDG09(-Tn89@;6U| zcsfyx0JwqQg}^rAfg>MKztMd|PRw2-PJ3|(m#p~9Jw?Zuc1y!(U3Wd;3N7f2I z|8+dNe@xw`OZaQZ3&d`*|8BY*_^)j~?&KQ^x*P?FWz5%_3jOU+omKqi4)gU$bw(Q-`A%D@O7aCW*s^_(9r z)*C^8fpQ9&9-OBE&y~xLET4-3#?8Y|c=pQ}rT-&bV=jzlt&v!t8~Osq+{#Jm_F7Vd z|9h%RkZ$KA0-EDd<4ZmNPp=8`4O|t(H1*2~NVaL~!}*d=x&K>=A>%t8RqPpejL3~& zOc$fGPyyyj8Q2%$3GRsUyNpko@lsTHum4Ah(gjUvHPtA=kI9^)2A)u z$R7YI=~Uo=2FPLhltxzm|BaTzPI};RRUKqXT+1=Og0+K^`mkGOpSFSZdSm=)e>qb>Fy zm+)vBis*pbr%vqMtiG$ssG6yShT>5&_ZDcs(H*u1N812xO!Fz839%1Nw5@^>T-#kA z0+^yV1u(i)g)jOaMIA1-2FzF^Ky`FT_V8@$?Bx}>v|De5Sd6YxL5TX-K5*FvSIVhT zIpeNbLhkfe9~N}c(*#fW7sA25;tU|Fr_*knVk?WL7Y2x>aI|H}r~_f2%->fZZ~FYM zMECu+vI=3r@W-N4h!2;qho-#DXA&x(Os7DC+<`*k-1g-fU`haJafj{UIgl~xT)hMt zVp1t-e}U)(uE^Ry6vj5xL3oTRh*?itjGBXwFDBai;e$4o+T4Oe^Id&pHJOkLo3QhY2x~L%h!yqmm2Fq#SEiBm+&vY`ll^8lT^|GL-W1 zbjbfx_8X3iA}4=3g$+e~Z{y0hnOg1nNa7R^s+68b0hIOi61)il|EN+<1cyi9gioIZAj-}g^bHhwW(}(nI_Udz*FehL_j^ci8 zG*IH~^=SgWO(*4l!#sGLIWXdRp6B77nG=TEpuDnIVj~Lxw{OOXwXPN<&dQi6Ru4ey zoGeXV#&ZGAXlRNT>?Iy+?cjMv(&aH}ar!+Vumz#^8d#21!+#x zfjgPAw4kWjY0TiIuZZGn{M+Y!u(Rknl{Gr)h4Usx9lUcDfV0!6X`E=(W;|H;Gz z|CvYuw_vW~KQYuB2Erd+e!H(|$1EkTA75&*`e!G^Sna-^KcK zdmM&a<-fJic87+`;*Y>{l6r+PjB6}!0qF|H_{Chi{+L-XfS>tTWYhwWXeVmb+IWWS*&+P#GnUR4s4Hc{x^CW@Da zyFxly#m4`1>`)jQ>d~_GKe6$1R;u6|4})J)tj-skvLt(+@q+bQRtDbAIPr_0g4o*M}i ztf&|B=mZW8k$DM&JKeRF-)#PmZvypc9&qPdLnyxv)KUjP-QUK)) zbWm0eJNgSh3$r&6RaKOhV&rTl;;$Txl&}2PdBlf4Sl1IqS;YoJaP=q2T_KS-Q>tlbAi zy{Y8Ibb6kx@#)~IP5btnbXb8h221zElufXr3EN~9o@x3g8TmB0daiCZKdiRxr;}A4 zz%qvKB7IH|lhyenTl%chL^8{kyW67~C^55l^DUOxpML`dnSECdAa$$7Fjt0IiuglJ zM)Pu+(Kc&$5jbT>t1eK|45*8!o7re@B~Qo8n`<{%B$#6gz%2s*m59fpex$ftQDmEo zEb`93ub(z}`CM1d*hxj&xgxFe``GoD_mDkp1M137@M<_UD&A05>=m%FRQx_0K~iUf z7WlTYsG?~-DT3gDm9wzO$Ab2E!h}MGUqhpay~&|}U`xEZKPg<|O^7#5GdSGUNE7|A z4;T zsC~Eh3NsW0g$FfrE#BT{*kQMywUQrP?c~pR zcNl|*x0&1(QAvD>9&y0F-M*_UPEzaB88HK0X>EA=ZJy%`Lu}*|J9;NSSCD!r`B+*T zBuQ-jEi~e^#nlsb-e~nmmDhTZ`~;Ewxvb9o7rKIS?M-spL z>U@fA!gs#9CH1Y9hS3Y;@a!rUWVM3`I+(r+CO(DFO=iGjNtqi{*_RJ6a~n*W?9_QT zMX^e?e=t>5O0W4avf3xu&D+L4vAK%dQzP%8SYcTE*A5bWrb2{0X+VDdt64-bXL3$^klyhCmQdN{ zSIpnbX*rxc1~BOK;$zv@=_0AOq4(EE7@KX}Wu07nBRj*{uS6TR+APnJ?-^cC-CPFz z82Wo^d+P2a-ozsDU>%@nr!UR)c#GNWF|D%IK1YF=|FTN|A)piPfrDN`nn^=>vu!~_7FQJP6B>;RWl5mrbW}}h(U)?XX@Uv zFRULUz}c;r$TEhy`{4mc?HiDfg89uxgBmoaZ*w0hynB7@$Jfqg^m0YnNh-EOi+d%o zM`Gz<*mrg>+vA_s0NhF=lfilUdI)=$7+ZInAljIt&gxDxA>g77n62eCF@LD_ZmiY+ zYn`us$aE{_TX_iwa!ig#6;|Hhpr;98^iMzUHRZSaEHv9TQGt?Oa z(s$vyd^G|KA@SIn8oRo)6nOzTZ7hcW{HJ z5iv>-=H$J7!+hCkojJf0Joih#x~j!4=SO|`UIACX^3bf&rUpgII(J86R@ae}Q)>2VP+Cn#Lemk0&y@Z~36IyI(MA((|) zG8GG(=^d^}kpFV3FO)~TeAY@Sc3R0~L2yo=f5Ya;+n9bU6c9kf4PH#fHQ z7aGD+d%Q~`gWfNHfE3^c@N425X7_|`{Y>?7@yjH{??oqHo@-^N17zL9LhO`F)=G|5RXMyK$ zr)TK>bA!H`lM!^V(j9=2y5E`8^lAMF!q~OOQE9XzK-xq@Q^+!z{XF)47w^m8_sj>6 zGdUVEIcOZk7+g9j=jCi22Wr4>cc2iWu9 z-8&#>q2fX@mQPbfl}8#_K8|)|I1trOq^ouRh@YsP)xfqFJQj+VS}CV(S<>}O;0Kc) zb+~RJAHqb1Vu^<@T`DqJPHVwKo9Rr%qgoyw^Bxh(C+ab=&&D+i06d_nlooH9^teI# z#bG;)7g22*O^BAd(PGY^A5yV?`i)hL^4nd8ou(x_9-VWJ+iSYP+X8{JaK}y?-fR+N zt>3;yOwx#;q-D^GHREiV_=X%m+C(Y-KaN39!M`ZvSS^Kuga*#V1%94c8uJj^#2~3p zI8+TChD;bP3$XkYIZAVo$+8|BTET2Vt|i(x=g+2t>QvyA#^=2~OLXmG{#Btl`6Q$u zkAH9UuQPj7G}i_@<>eFjM8DlUQQ!tFcS3m%0)?2D0CGjGX`=*w z5fs$K|L_o^zxD;cqE{jbJSXiQXR{PgHc07dQq%>@ua6UDdO-72R~6__+gK5GI6)cuN(I}nwH}ujLyCXu1AiZ6Q*SHb)t!7kc z`kDbDDwAO~*HvEa(q(fHdh-H)LQTQX)NKg2Wwv}TUiOoQ5sp?=dHZX@llesbU#B~hwK@#V6 za?AC~#CvAkz#76)JfjA%1T=MJQoxf%wHi!PckWQ)Xv@KdgpzUSE@Entlh?L=!w%w} z4sG}tc&m7nn5d)Fk}>wR0ABkCt5+%EbE;c@%K!9eh68+g~yVGd|^;rsS9i+&4_uPPB77!bnD5+3+WMm_h$ z-Elj?B4}jjnglxqG@YG$k0-IMagd{&^KI(KA!3Ua?{)V_o`L48prL*XWN7rzhb@Z6 ztJf}By)DS~p}NJVe@!#2KkSCzJ}fttm6Buka!Nk;+|E0kA<%*Mrl^?o&?E>@K?}MZ zV}{M4h`P`O%_y`1^0yh~K)qE-qlsNw@QA{=smo)lfc7fX6v@ux3HJBRT`1Eb4C* zY>ygp%>T5VptyOCLmhdjm6jA5PoM>wcv?!a>UN?xt|e4QUFwbU$?CXOSUTUE_GCdv z3A-VeT(r&c4jNbWKtIIyS~$UB7g^uGcqE?ni_d0ba=#G)0R^v-Qi$Ey@eoqQbYd9Z zh<>A$@U3r0?BMuqgi)h8`kgy}MMcl@%V8H1D2LfWK&s^DEV$5RKLfuLMbR0G@It>ZRbtG|{H2Bh`0|C`tgEOsLwkFD-KL^I$I|d$t^bB7#aZZ${vK zUQ48W=BnB;3F(1Tm$HcJw zDuLnP_Pi85*ARHE;wd(^bu0ad8(8rg@pzx}QZ^OZ3;f_nED#3-w%`+WCd#4eZ=^aE?H7YAOG$(BcK! z{`^7MVDHr+aUFOkHpxKWz0FFE8Ojf4RVX z_xhAuHX9qD`(v$jEbb|R3WF$~PC*`2AIZbasT-uKwF&cSBzMoYqupB~h(Z`_r#$_O^vu7thWu;o(z<~k&$J36 z8!2q=9Ox#-zhSaqM)tz%HT>;K`8Bo9k0;oLG+hcDdb28jJyv>`8)e69`N@m5gtgv@ z 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 PAg}lGs&dsbrosOQs_VOU literal 0 HcmV?d00001 diff --git a/assets/install-linux.sh b/assets/install-linux.sh new file mode 100644 index 0000000..b75605a --- /dev/null +++ b/assets/install-linux.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +# +# Install meatshell's icon + desktop entry on Linux so the GNOME/Ubuntu dock and +# the app launcher show the app icon. +# +# Why this is needed: the Windows build embeds the icon in the .exe, but on Linux +# the icon comes from a freedesktop ".desktop" entry plus an icon installed into +# the hicolor icon theme. On Wayland (Ubuntu's default) the shell matches a +# running window to its .desktop file via the window's app_id — meatshell sets +# that to "meatshell" (slint::set_xdg_app_id), and this script's StartupWMClass +# matches it. +# +# Usage: +# ./install-linux.sh [/path/to/meatshell-binary] +# You normally don't need an argument: when run from inside a release package +# (the `meatshell` binary sits next to this script) it is picked up automatically. +# In the source tree it falls back to ./target/release/meatshell. + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Resolve the binary: explicit arg > sibling (release package) > source-tree build. +if [ -n "${1:-}" ]; then + BIN="$1" +elif [ -x "$SCRIPT_DIR/meatshell" ]; then + BIN="$SCRIPT_DIR/meatshell" +else + BIN="$SCRIPT_DIR/../target/release/meatshell" +fi +BIN="$(readlink -f "$BIN" 2>/dev/null || echo "$BIN")" + +# Make sure the binary is executable (a downloaded tarball may have lost +x). +[ -f "$BIN" ] && chmod +x "$BIN" 2>/dev/null || true + +if [ ! -x "$BIN" ]; then + echo "error: meatshell binary not found: $BIN" >&2 + echo "Run this script from the extracted release folder (it sits next to the" >&2 + echo "'meatshell' binary), or pass the binary path as an argument." >&2 + exit 1 +fi + +ICON_SRC="$SCRIPT_DIR/icon@512.png" +ICON_DIR="$HOME/.local/share/icons/hicolor/512x512/apps" +APP_DIR="$HOME/.local/share/applications" + +mkdir -p "$ICON_DIR" "$APP_DIR" +if [ -f "$ICON_SRC" ]; then + install -m644 "$ICON_SRC" "$ICON_DIR/meatshell.png" +else + echo "warning: icon not found ($ICON_SRC); the desktop entry will use a generic icon" >&2 +fi + +cat > "$APP_DIR/meatshell.desktop" </dev/null || true +gtk-update-icon-cache -f -t "$HOME/.local/share/icons/hicolor" 2>/dev/null || true + +echo "Installed:" +echo " icon -> $ICON_DIR/meatshell.png" +echo " desktop -> $APP_DIR/meatshell.desktop" +echo " exec -> $BIN" +echo +echo "If the dock still shows the generic icon, log out/in (Wayland) or run" +echo "'killall -3 gnome-shell' (X11) to refresh the shell." diff --git a/assets/make_icon.py b/assets/make_icon.py new file mode 100644 index 0000000..9d1ec6c --- /dev/null +++ b/assets/make_icon.py @@ -0,0 +1,169 @@ +# -*- coding: utf-8 -*- +"""Generate the meatshell app icon (braised pork-belly + terminal prompt). + +Pure-Pillow, 4x supersampled for crisp anti-aliasing. +Outputs: icon.png (256), icon@512.png, meatshell.ico (multi-size) +""" +import math +from PIL import Image, ImageDraw, ImageFilter, ImageFont, ImageChops + +SS = 4 +BASE = 256 +S = BASE * SS # working canvas 1024 + +OUT_DIR = "." # script is run from assets/ + + +def lerp(a, b, t): + return int(round(a + (b - a) * t)) + + +def vgradient(size, top, bot): + """Vertical gradient RGB image.""" + w, h = size + col = Image.new("RGB", (1, h)) + px = col.load() + for y in range(h): + t = y / (h - 1) + px[0, y] = (lerp(top[0], bot[0], t), + lerp(top[1], bot[1], t), + lerp(top[2], bot[2], t)) + return col.resize((w, h)) + + +def wavy_band(x0, x1, y_top, y_bot, amp, phase, n=60): + """Polygon points for a horizontal band with wavy top & bottom edges.""" + pts = [] + for i in range(n + 1): + x = x0 + (x1 - x0) * i / n + y = y_top + amp * math.sin(i / n * math.pi * 2.5 + phase) + pts.append((x, y)) + for i in range(n, -1, -1): + x = x0 + (x1 - x0) * i / n + y = y_bot + amp * math.sin(i / n * math.pi * 2.5 + phase + 0.6) + pts.append((x, y)) + return pts + + +img = Image.new("RGBA", (S, S), (0, 0, 0, 0)) + +# ---------------------------------------------------------------- tile (dark terminal) +tile_mask = Image.new("L", (S, S), 0) +ImageDraw.Draw(tile_mask).rounded_rectangle( + [0, 0, S - 1, S - 1], radius=int(S * 0.22), fill=255) + +grad = vgradient((S, S), (37, 36, 46), (22, 21, 28)).convert("RGBA") +img.paste(grad, (0, 0), tile_mask) + +# subtle top sheen on the tile +sheen = Image.new("RGBA", (S, S), (0, 0, 0, 0)) +ImageDraw.Draw(sheen).ellipse( + [int(-S * 0.3), int(-S * 0.55), int(S * 1.3), int(S * 0.35)], + fill=(255, 255, 255, 22)) +sheen.putalpha(ImageChops.multiply(sheen.getchannel("A"), tile_mask)) +img = Image.alpha_composite(img, sheen) + +# ---------------------------------------------------------------- meat block geometry +mx0, my0 = int(S * 0.165), int(S * 0.175) +mx1, my1 = int(S * 0.835), int(S * 0.825) +mw, mh = mx1 - mx0, my1 - my0 +block_radius = int(mw * 0.17) + +# drop shadow under the block +shadow = Image.new("RGBA", (S, S), (0, 0, 0, 0)) +ImageDraw.Draw(shadow).rounded_rectangle( + [mx0, my0 + int(S * 0.02), mx1, my1 + int(S * 0.03)], + radius=block_radius, fill=(0, 0, 0, 150)) +shadow = shadow.filter(ImageFilter.GaussianBlur(S * 0.025)) +img = Image.alpha_composite(img, shadow) + +# meat layers on their own layer, then clip to rounded rect +meat = Image.new("RGBA", (S, S), (0, 0, 0, 0)) +md = ImageDraw.Draw(meat) +# base fill so wavy edges never leave gaps +md.rounded_rectangle([mx0, my0, mx1, my1], radius=block_radius, + fill=(178, 47, 38, 255)) + +amp = mh * 0.025 +# (start_frac, end_frac, color) top -> bottom, 五花肉 cross-section +layers = [ + (-0.02, 0.15, (94, 52, 32)), # skin / caramel glaze + (0.13, 0.31, (255, 224, 209)), # fat + (0.29, 0.52, (199, 60, 45)), # lean + (0.50, 0.66, (255, 216, 201)), # fat + (0.64, 1.04, (181, 48, 39)), # lean +] +for idx, (a, b, col) in enumerate(layers): + yt = my0 + mh * a + yb = my0 + mh * b + md.polygon(wavy_band(mx0 - 4, mx1 + 4, yt, yb, amp, idx * 1.7), + fill=col + (255,)) + +# marbling: faint warm streaks of fat running through the lean layers +for (ly, ph) in [(0.42, 0.0), (0.74, 1.1), (0.92, 2.0)]: + yc = my0 + mh * ly + pts = [] + n = 60 + for i in range(n + 1): + x = mx0 + mw * i / n + y = yc + mh * 0.010 * math.sin(i / n * math.pi * 3 + ph) + pts.append((x, y)) + md.line(pts, fill=(255, 228, 214, 70), width=int(S * 0.007), joint="curve") + +# glossy highlight on the glaze (top skin) — warm, not gray +md.ellipse([mx0 + mw * 0.12, my0 + mh * 0.012, + mx0 + mw * 0.60, my0 + mh * 0.085], + fill=(255, 240, 224, 90)) + +# clip meat to rounded-rect +meat_mask = Image.new("L", (S, S), 0) +ImageDraw.Draw(meat_mask).rounded_rectangle( + [mx0, my0, mx1, my1], radius=block_radius, fill=255) +meat.putalpha(ImageChops.multiply(meat.getchannel("A"), meat_mask)) +img = Image.alpha_composite(img, meat) + +# thin inner rim to define the block edge +rim = Image.new("RGBA", (S, S), (0, 0, 0, 0)) +ImageDraw.Draw(rim).rounded_rectangle( + [mx0, my0, mx1, my1], radius=block_radius, outline=(40, 18, 12, 160), + width=int(S * 0.006)) +img = Image.alpha_composite(img, rim) + +# ---------------------------------------------------------------- terminal prompt >_ +def load_font(size): + for path in (r"C:\Windows\Fonts\consolab.ttf", + r"C:\Windows\Fonts\consola.ttf", + r"C:\Windows\Fonts\lucon.ttf"): + try: + return ImageFont.truetype(path, size) + except OSError: + continue + return ImageFont.load_default() + + +prompt = Image.new("RGBA", (S, S), (0, 0, 0, 0)) +pd = ImageDraw.Draw(prompt) +font = load_font(int(S * 0.30)) +text = ">_" +bbox = pd.textbbox((0, 0), text, font=font) +tw, th = bbox[2] - bbox[0], bbox[3] - bbox[1] +tx = (S - tw) / 2 - bbox[0] +ty = (S - th) / 2 - bbox[1] + +# dark shadow for legibility on the meat +pd.text((tx + S * 0.012, ty + S * 0.012), text, font=font, fill=(20, 8, 4, 180)) +# bright terminal green +pd.text((tx, ty), text, font=font, fill=(126, 255, 122, 255)) +prompt = prompt.filter(ImageFilter.GaussianBlur(1.2)) +img = Image.alpha_composite(img, prompt) + +# ---------------------------------------------------------------- export +img256 = img.resize((BASE, BASE), Image.LANCZOS) +img512 = img.resize((512, 512), Image.LANCZOS) +img256.save("icon.png") +img512.save("icon@512.png") +img.resize((512, 512), Image.LANCZOS).save("icon@1024_preview.png") # for review +img256.save("meatshell.ico", format="ICO", + sizes=[(256, 256), (128, 128), (64, 64), + (48, 48), (32, 32), (16, 16)]) +print("OK: icon.png, icon@512.png, meatshell.ico written") diff --git a/assets/meatshell.desktop b/assets/meatshell.desktop new file mode 100644 index 0000000..fbb21ae --- /dev/null +++ b/assets/meatshell.desktop @@ -0,0 +1,13 @@ +[Desktop Entry] +Type=Application +Name=meatshell +GenericName=SSH Client +Comment=Lightweight Rust + Slint SSH/SFTP client +Comment[zh_CN]=轻量级 Rust + Slint SSH/SFTP 客户端 +Exec=meatshell +Icon=meatshell +Terminal=false +Categories=Network;System;TerminalEmulator;Utility; +Keywords=ssh;sftp;terminal;shell; +StartupNotify=true +StartupWMClass=meatshell diff --git a/assets/meatshell.ico b/assets/meatshell.ico new file mode 100644 index 0000000000000000000000000000000000000000..69815fb957540adf1609cae9085dd81c79a5f254 GIT binary patch literal 45154 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Úxp;t@z29$DtH?7m0Yo{dA<4DSxs5Q?~ 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/LC_MESSAGES/meatshell.po` + // provides other locales. No per-component context, so msgids are the raw + // Chinese strings. + println!("cargo:rerun-if-changed=lang"); + slint_build::compile_with_config( + "ui/app.slint", + slint_build::CompilerConfiguration::new() + .with_style("fluent".into()) + .with_bundled_translations("lang") + .with_default_translation_context(slint_build::DefaultTranslationContext::None), + ) + .expect("Slint build failed"); + + // Embed the application icon into the Windows executable so it shows up in + // Explorer, the taskbar and shortcuts. Build scripts run on the host, so a + // Linux -> Windows cross build must check the target OS via Cargo env vars + // instead of `#[cfg(windows)]`. + println!("cargo:rerun-if-env-changed=CARGO_CFG_TARGET_OS"); + if std::env::var("CARGO_CFG_TARGET_OS").as_deref() == Ok("windows") { + println!("cargo:rerun-if-changed=assets/meatshell.ico"); + let mut res = winresource::WindowsResource::new(); + res.set_icon("assets/meatshell.ico"); + if let Err(e) = res.compile() { + println!("cargo:warning=failed to embed Windows icon: {e}"); + } + } +} diff --git a/docs/screenshots/01-welcome-en.png b/docs/screenshots/01-welcome-en.png new file mode 100644 index 0000000000000000000000000000000000000000..b03022c2b24fee5d8b5d5091544395fc0c7198cd GIT binary patch literal 74606 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