Skip to content

Aegis AI v0.8.0 — Bug-sweep & i18n completion

Choose a tag to compare

@hieulouisdev hieulouisdev released this 18 Aug 15:50
· 20 commits to main since this release

Aegis AI v0.8.0 — Bug-sweep & i18n completion

Release type: Bug-fix release on top of v0.7.0. Same external API surface;
no breaking changes for end users. Rust 1.97.1 (pinned via
rust-toolchain.toml).

This release is a comprehensive bug-sweep that closes a broken GitHub
Actions workflow, completes the v0.7 i18n expansion (5 languages were
declared but never wired through the backend), fixes a boot-time panic,
restores the quarantine panel in the Security view, and closes a markdown
link XSS vector.


Critical fixes

1. GitHub Actions build-release.yml — broken YAML

The workflow's on.push.branches and on.pull_request.branches keys
contained a malformed YAML literal (branches: ain]) — i.e. the closing bracket of [main] was dropped — that silently
disabled the entire pipeline. Rewritten to branches: [main] and the
per-OS job matrix was aligned with the release.yml workflow:

  • correct target path src-tauri/target/<triple>/release/bundle
  • Linux runner bumped to ubuntu-22.04 with full system-deps list
  • both runners cache the Cargo registry/target via actions/cache@v4
  • cargo fmt + cargo clippy run as informational lint gates
  • checksums uploaded as artifacts (checksums-linux, checksums-windows)

2. i18n Locale expansion — backend now matches frontend

v0.7's CHANGELOG claimed "5 new languages added" but the backend
Locale enum still only had En, Vi. Selecting any of es / fr / de / ja / zh-CN silently fell back to English on the backend and was
narrowed back to en/vi by App.tsx and Settings.tsx on the
frontend. The full 7-locale pipeline now works end-to-end:

  • src-tauri/src/i18n/mod.rs: Locale enum expanded to 7 variants
    (En, Vi, Es, Fr, De, Ja, ZhCn); from_code accepts
    BCP-47 codes incl. zh-CN / zh_cn / zh-Hans; code() round-trips
    for all 7 variants.
  • src/i18n/index.ts exports SUPPORTED_LOCALES and LOCALE_LABELS.
  • App.tsx validates persisted language against SUPPORTED_LOCALES
    instead of hard-narrowing to en/vi.
  • Settings.tsx language picker now renders all 7 locales — English,
    Tiếng Việt, Español, Français, Deutsch, 日本語, 简体中文 — and
    save() calls i18nSetLocale() so the backend stays in sync.

3. state.rs boot-time panic

The in-memory SQLite fallback was
unwrap_or_else(|e| { log; open_in_memory().expect(...) }) — if the
first call failed, the second expect() would also panic and the app
would crash on launch. Reworked to a match with a single retry and
a clear tracing::error! log.

4. Markdown XSS — link href scheme allow-list

The link renderer in Markdown.tsx accepted any href scheme,
including javascript: and data:. Now restricted to http(s) only;
other schemes are rewritten to #.


High-impact fixes

  • Quarantine panel (Security.tsx): was a hardcoded "Phase 2:
    placeholder" even though security_quarantine_list and
    security_restore_file were fully wired end-to-end. The panel now
    loads the live quarantine list, shows original path + reason, and
    exposes a one-click Restore button.
  • Sidebar version (Sidebar.tsx): hardcoded "0.7.0" initial state
    caused a stale version badge before appVersion() resolved. Bumped
    default to "0.8.0".
  • Chat error bubble (Chat.tsx): always labeled "No AI provider
    configured" regardless of the actual error. Now shows the real error
    message via t("common.error"). Also replaced array-index React keys
    with stable ${role}-${i}-${content.length} keys.
  • Settings.tsx save() was missing the i18nSetLocale() call, so
    backend locale never synced after a Settings change. Added with a
    try/catch so dev mode (no Tauri) doesn't break.
  • Backend i18n missing keys: added nav.web, nav.guide,
    nav.theme.toggle, nav.sidebar.toggle, chat.empty.feature*,
    chat.copy, chat.copied, chat.regenerate, settings.bypass_mode,
    settings.theme.*, settings.data.*, settings.encryption.*,
    settings.sandbox.*, settings.telemetry.*, security.quarantine.*,
    security.integrity, security.network_scan, security.threats.recent
    — closes ~20 keys that previously round-tripped as bare key strings
    on the backend.

Version bump 0.7.0 → 0.8.0

Bumped across:

  • package.json
  • Cargo.toml workspace
  • src-tauri/tauri.conf.json
  • Sidebar.tsx default version
  • README.md "Current release" line
  • ROADMAP.md "current release" line

Validation

  • Frontend: tsc --noEmit clean; vite build clean (296 KB JS bundle).
  • Rust backend: full cargo check requires Linux system packages
    (libwebkit2gtk-4.1-dev, libgtk-3-dev, libayatana-appindicator3-dev,
    libxdo-dev, tesseract-ocr, patchelf) that aren't installable in
    a rootless dev shell. The Locale expansion was validated via a
    standalone rustc smoke-test that compiles and exercises every
    from_code / code() / t() code path. The full cargo check will
    run automatically on push via the Build & Release GitHub Actions
    workflow.

Screenshots

Two UI screenshots are attached to this release:

  • aegis-ai-screenshot-1-chat.png — main Chat view with the sidebar
    showing the v0.8.0 version badge and the empty-state chat panel.
  • aegis-ai-screenshot-2-guide.png — the in-app User Guide panel,
    rendered from the static Guide.tsx content.

What's next

The next release (v0.9 / v1.0) will focus on:

  • Wiring the dead-loop subsystems flagged in this bug-sweep
    (modes::continuous::start, modes::ondemand::start,
    clipboard_poll, alerts::send_alert, telemetry::record_event).
  • Persisting CalendarConfig to config.toml (currently lives only
    in process memory).
  • SQLCipher encryption (currently always returns not_supported).
  • Removing unsafe-inline from the production CSP.

See ROADMAP.md and the in-app User Guide for the full plan.