[3.6.3] - 2026-04-25
Unified Tool Dispatcher + Cloud Provider Sweep + AeroVault Pro Foundations
The post-3.6.2 sprint consolidates three years of organically-grown AeroAgent surface into a single, audited tool engine shared by the Tauri GUI, the standalone aeroftp-cli binary and the MCP server. In parallel, eighteen cloud providers gain trash management, version history, share links and label/tag CRUD, while the desktop backend grows new pillars (server health diagnostics, TOTP 2FA scaffold, vault history) that prepare the ground for AeroVault Pro and the upcoming biometric unlock work.
Added
- Unified AI tool dispatcher (T3 Gate 2) — All AeroAgent tools (53 entries across local, system, remote and RAG/memory areas) now flow through a single
ai_core::tools::dispatch_toolwith surface-aware filtering (GUI / CLI / MCP). Per-area handler modules (local_tools.rs,system_tools.rs,remote_tools.rs,agent_tools.rs) host the canonical implementations; per-surfaceToolCtximpls (TauriToolCtx,CliToolCtx,McpToolCtx) bridge to the appropriate runtime. The legacyexecute_ai_tool/execute_cli_tool/mcp::execute_tooldispatchers stay as thin fast-path wrappers, eliminating the long-standing drift between three parallel match statements. 11 parity tests prove identical output across surfaces; the security regression suite gains an Area B check ensuringsystem_toolsalways delegatesshell_executeto the canonical denylist source. Behavioural wins:local_trashis now available on CLI,clipboard_*andarchive_compress/archive_decompressuse native Rust libraries instead of subprocess shellouts (no morexclip/zip/tar/7zruntime dependencies on CLI), andvalidate_pathadopts component-aware matching so/bootcampis no longer falsely flagged as/boot. - Provider trait expansion — 7 new optional methods:
list_trash,restore_from_trash,permanent_delete,list_versions,download_version,restore_version,create_share_link,get_storage_quota. TheRemoteEntrystruct grows MIME type, owner/group, octal permissions, symlink target, and a free-form metadata bag. Box, Google Drive, Dropbox, OneDrive, Zoho WorkDrive light up the full feature matrix. - Box Pro feature set: trash management, file move/comment/collaboration, watermark (Enterprise), folder locks (Enterprise), inline tag chips with PRO badge.
- Google Drive starring + comments + properties: star/unstar from context menu, add comments via prompt dialog, set custom key-value properties and description; file listing now includes
starred,description,propertiesfields. - Dropbox tag management + Trash Manager: full tag CRUD via Dropbox Tags API (reuses generic
BoxTagsDialog); dedicated modal for deleted files (restore + permanent delete). - OneDrive Trash Manager: full recycle bin lifecycle (move to trash, list, restore, permanent delete).
- Zoho WorkDrive labels + versioning: list team labels, get/add/remove labels on files via
ZohoLabelsDialogwith color-coded toggle list; list versions, download specific version, restore/promote version through the StorageProvider trait. - Server Health Check — Real-time diagnostics for saved servers: DNS / TCP / TLS / HTTP probes with latency stats, 0–100 health score, SVG radial gauge, latency bars, Canvas 2D area chart for trend. Right-click any server card → Connect / Edit / Duplicate / Health Check / Delete (
useContextMenuhook). Batch health check across all saved servers in parallel with healthy/degraded/unreachable summary. - TOTP 2FA scaffold (
totp.rs) — RFC 6238 authenticator core ready for the optional vault second factor: issuer, period, digits, base32 secret import/export, code verification with drift window. Will surface in Settings > Security in a follow-up release. - Vault history (
vault_history.rs) — SQLite-backed recents tracker for AeroVault Pro: last-opened timestamp, security badges, dedupe by canonical path. Powers the new VaultHome recents grid and "reopen" one-click flow. - AeroAgent server context tools registered in unified registry:
server_list_saved,server_exec, plus the fullaeroftp_*↔remote_*alias map (including newly-registeredserver_list_savedalias). - Aerorsync standalone serve binary —
bin/aerorsync_serve.rs(renamed fromrsync_proto_serve.rs) ships as a separate[[bin]]target for capture/test workflows.
Changed
rsync_native_proto/module renamed toaerorsync/— Aligns the experimental Rust-native rsync protocol implementation with the AeroFTP product naming. 41 source files, the capture harness, all fixtures and the standalone serve binary move undersrc-tauri/src/aerorsync/. CI workflows, Cargo bin section,lib.rsmodule declaration and the integration test path are updated to match. No on-the-wire changes: the protocol stays byte-identical to v3.6.x.- AeroAgent tool count: 53 unified registry entries — formerly counted as ~47 across three parallel dispatchers, now consolidated into a single
TOOL_DEFINITIONStable where the same handler runs unmodified on GUI, CLI and MCP. - CLI relative-path resolution snapshot at process start —
CliToolCtx::new()capturesstd::env::current_dir()once at construction and exposes it viaToolCtx::context_local_path(). Eliminates the silent regression where the unified dispatcher saw paths "as-is" instead of resolved against cwd. Behaviour matches the legacy CLIresolve_pathclosure exactly. shell_executeworking_dir validation hardened — The unifiedsystem_tools::shell_executenow runsvalidate_path(working_dir, ...)against the system deny-list (/etc/shadow,/proc,/sys,/boot,/root,/etc/ssh,/etc/sudoers, …) before delegating to the legacy GUI helper, restoring CLI parity that was lost during Area B migration.upload_many/delete_manynow report real elapsed seconds — the placeholderelapsed_secs: 0u64returned to MCP and AI clients is replaced withInstant::now().elapsed().as_secs()measured around the inner loop.- Vite 5 → 8 +
@vitejs/plugin-react4 → 6 — Major bump of the frontend build chain. Dev server, production build and Tauri packaging stay green.package-lock.jsonregenerated. Cargo.lockrefreshed — picks up transitive dependency churn from the v3.6.x feature work (provider crates, ai_core additions, server_health, totp, vault history, aerorsync rename).
Fixed
- SFTP symlink-aware listing —
SftpProvider::list()now follows symlinks viasftp.metadata()so directory traversal works on NAS devices that report symlinks for share roots (WD MyCloud, Synology DSM6, ASUSTOR ADM). - Azure Blob server-side copy —
Copy BlobAPI withx-ms-copy-sourceand saferesolve_blob_path()prefix resolution; eliminates the GET+PUT roundtrip for in-account moves. local_trashnow available on CLI — was GUI-only in the legacy dispatcher; the unified registry exposes it on both surfaces with the same semantics.path_styleno longer false-coalesced in App.tsx — Drop the|| falseoneffectiveParams.options?.pathStyleandcloudServer.options?.pathStyleso explicit user choices (true/false/undefined) reach the backend faithfully without being squashed.vault_remote.rsvalidation tightened — null-byte rejection on remote vault paths, symlink refusal on Unix mode lookup, parent canonicalization before opening.aerovaultfiles served from remote providers.
Security
- russh 0.59 → 0.60.1 — Closes Dependabot HIGH (GHSA-f5v4-2wr6-hqmg): pre-auth DoS via unbounded allocation in the keyboard-interactive auth handler. AeroFTP exposes a russh-based SSH server through
aeroftp-cli serve sftp, so the fix is mandatory. The bump required updating the ed25519 server-key generation call site to the newCryptoRngbound — added a narrowrand_010(rand 0.10) alias for that single line, with the rest of the codebase staying on rand 0.8. - rand 0.8.5 → 0.8.6 — Closes Dependabot LOW (GHSA-cq8v-f236-94qc): rand was unsound when paired with a custom logger using
rand::rng(). Direct dep bump only; the build-time-only transitiverand 0.7.3(pulled by phf_generator 0.8.0 / selectors 0.24.0 in the Tauri stack) is left in place — not in the runtime path and the upstream chain is locked at this combination by Tauri's wry dependency. validate_pathcomponent-aware matching —path_matches_prefix(path, prefix)helper replaces 11 occurrences ofs.starts_with(d). Eliminates false positives on prefix matches (e.g./bootcampwas being blocked as if it were under/boot).- Single source of truth for
shell_executedenylist — Both the GUI fast-path and the newsystem_tools::shell_executedelegate toai_tools::shell_executefor the canonical 35+ regex denylist + meta-character filter. The CI security regression script (security-regression.cjs) now actively verifies this delegation chain stays intact.
Internal
- 53 entries in
TOOL_DEFINITIONSdistributed: Area Alocal_*= 21, Area Bclipboard/shell/archive= 5, Area Cremote_*/aeroftp_*/server_exec= 24 (incl.server_list_savedalias), Area Drag_*/agent_memory_*= 3. tool_parity.rsintegration test suite — 11 tests proving identical output across GUI and CLI surfaces forlocal_read,local_write,local_mkdir,local_delete,local_grep,shell_execute,rag_index,rag_search, plus 3 remote alias parity tests with aFakeRemoteBackend.security-regression.cjsArea B coverage — verifiessystem_tools::shell_executecallscrate::ai_tools::shell_execute(single denylist source) and validatesworking_diragainst the deny-list before the call.- Quality bar at closure:
cargo check --features aerorsync --lib,cargo clippy --all-targets --features aerorsync -- -D warnings,cargo test --features aerorsync --lib(1018 / 1018 passed),cargo test --features aerorsync --test tool_parity(11 / 11 passed) andnode .github/scripts/security-regression.cjs(5 / 5 passed) all green.
Downloads:
- Windows:
.msiinstaller,.exe, or.zipportable (no installation required) - macOS:
.dmgdisk image - Linux:
.deb,.rpm,.snap, or.AppImage