From d7513a6dc452ff71020680ee78dc256ce5dadec8 Mon Sep 17 00:00:00 2001 From: Loocor Date: Wed, 27 May 2026 13:49:47 +0800 Subject: [PATCH 1/3] chore(build): generate tray icon in rust Replace the macOS sips pipeline with Rust PNG decoding, scaling, and writing so the build script no longer depends on platform shell tools. --- src-tauri/Cargo.lock | 1 + src-tauri/Cargo.toml | 1 + src-tauri/build.rs | 182 ++++++++++++++++++++++++++++--------------- 3 files changed, 121 insertions(+), 63 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index f0c9306..ed492d3 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -350,6 +350,7 @@ dependencies = [ "chrono", "dirs", "futures-util", + "png 0.17.16", "reqwest 0.12.28", "rusqlite", "serde", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 47cadf7..efec04c 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -16,6 +16,7 @@ name = "codex-helper-bridge" path = "src/bridge_cli.rs" [build-dependencies] +png = "0.17" serde_json = "1" tauri-build = { version = "2.0.0", features = [] } diff --git a/src-tauri/build.rs b/src-tauri/build.rs index 5b90433..8caae13 100644 --- a/src-tauri/build.rs +++ b/src-tauri/build.rs @@ -1,7 +1,8 @@ use std::env; use std::fs; +use std::fs::File; +use std::io::{BufReader, BufWriter}; use std::path::{Path, PathBuf}; -use std::process::Command; fn main() { assert_app_icon(); @@ -120,13 +121,11 @@ fn assert_app_icon() { /// Edit `tray.png` (any size, black + transparent). Cargo embeds the generated /// 44×44 asset via `include_image!` so icon changes rebuild reliably. fn prepare_tray_icon() { - const MENU_BAR_PX: &str = "44"; + const MENU_BAR_PX: u32 = 44; let manifest_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").expect("CARGO_MANIFEST_DIR")); let icons_dir = manifest_dir.join("icons"); let tray_source = icons_dir.join("tray.png"); - let tray_flat = icons_dir.join("tray-flat.png"); - let tray_scaled = icons_dir.join("tray-menu-scaled.png"); let tray_menu = icons_dir.join("tray-menu.png"); if !tray_source.is_file() { @@ -142,74 +141,131 @@ fn prepare_tray_icon() { println!("cargo:rerun-if-changed={}", tray_source.display()); - // Interlaced PNG (Adam7) breaks Tauri tray embedding; flatten before resize. - deinterlace_png(&tray_source, &tray_flat); - - let fit = Command::new("sips") - .arg("-Z") - .arg(MENU_BAR_PX) - .arg(&tray_flat) - .arg("--out") - .arg(&tray_scaled) - .status() - .unwrap_or_else(|error| panic!("failed to run sips for tray icon fit: {error}")); - if !fit.success() { + let source = read_rgba_png(&tray_source); + let menu = fit_and_pad_rgba(&source, MENU_BAR_PX); + write_rgba_png(&tray_menu, &menu); + + println!("cargo:rerun-if-changed={}", tray_menu.display()); +} + +struct RgbaImage { + width: u32, + height: u32, + pixels: Vec, +} + +fn read_rgba_png(path: &Path) -> RgbaImage { + let file = File::open(path) + .unwrap_or_else(|error| panic!("failed to open {}: {error}", path.display())); + let mut decoder = png::Decoder::new(BufReader::new(file)); + decoder.set_transformations( + png::Transformations::normalize_to_color8() | png::Transformations::ALPHA, + ); + let mut reader = decoder + .read_info() + .unwrap_or_else(|error| panic!("failed to read PNG metadata {}: {error}", path.display())); + let mut buffer = vec![0; reader.output_buffer_size()]; + let info = reader + .next_frame(&mut buffer) + .unwrap_or_else(|error| panic!("failed to decode PNG {}: {error}", path.display())); + if info.color_type != png::ColorType::Rgba || info.bit_depth != png::BitDepth::Eight { panic!( - "failed to fit tray icon {} within {MENU_BAR_PX}px", - tray_flat.display() + "tray icon {} must decode to 8-bit RGBA, got {:?} {:?}", + path.display(), + info.color_type, + info.bit_depth ); } + buffer.truncate(info.buffer_size()); + RgbaImage { + width: info.width, + height: info.height, + pixels: buffer, + } +} - let pad = Command::new("sips") - .arg("--padToHeightWidth") - .arg(MENU_BAR_PX) - .arg(MENU_BAR_PX) - .arg(&tray_scaled) - .arg("--out") - .arg(&tray_menu) - .status() - .unwrap_or_else(|error| panic!("failed to run sips for tray icon pad: {error}")); - let _ = fs::remove_file(&tray_flat); - let _ = fs::remove_file(&tray_scaled); - if !pad.success() { - panic!( - "failed to pad tray icon {} to {MENU_BAR_PX}x{MENU_BAR_PX}", - tray_scaled.display() - ); +fn write_rgba_png(path: &Path, image: &RgbaImage) { + let file = File::create(path) + .unwrap_or_else(|error| panic!("failed to create {}: {error}", path.display())); + let mut encoder = png::Encoder::new(BufWriter::new(file), image.width, image.height); + encoder.set_color(png::ColorType::Rgba); + encoder.set_depth(png::BitDepth::Eight); + let mut writer = encoder + .write_header() + .unwrap_or_else(|error| panic!("failed to write PNG header {}: {error}", path.display())); + writer + .write_image_data(&image.pixels) + .unwrap_or_else(|error| panic!("failed to write PNG data {}: {error}", path.display())); +} + +fn fit_and_pad_rgba(source: &RgbaImage, canvas_size: u32) -> RgbaImage { + let scale = + (canvas_size as f64 / source.width as f64).min(canvas_size as f64 / source.height as f64); + let scaled_width = ((source.width as f64 * scale).round() as u32).clamp(1, canvas_size); + let scaled_height = ((source.height as f64 * scale).round() as u32).clamp(1, canvas_size); + let offset_x = (canvas_size - scaled_width) / 2; + let offset_y = (canvas_size - scaled_height) / 2; + let mut pixels = vec![0; (canvas_size * canvas_size * 4) as usize]; + + for y in 0..scaled_height { + for x in 0..scaled_width { + let source_x = (x as f64 + 0.5) / scale - 0.5; + let source_y = (y as f64 + 0.5) / scale - 0.5; + let pixel = sample_rgba(source, source_x, source_y); + let dest = (((y + offset_y) * canvas_size + x + offset_x) * 4) as usize; + pixels[dest..dest + 4].copy_from_slice(&pixel); + } } - println!("cargo:rerun-if-changed={}", tray_menu.display()); + RgbaImage { + width: canvas_size, + height: canvas_size, + pixels, + } } -fn deinterlace_png(source: &Path, dest: &Path) { - let tiff = dest.with_extension("tif"); - let to_tiff = Command::new("sips") - .arg("-s") - .arg("format") - .arg("tiff") - .arg(source) - .arg("--out") - .arg(&tiff) - .status() - .unwrap_or_else(|error| panic!("failed to run sips for tray deinterlace: {error}")); - if !to_tiff.success() { - panic!( - "failed to deinterlace tray icon {} via TIFF", - source.display() - ); +fn sample_rgba(source: &RgbaImage, x: f64, y: f64) -> [u8; 4] { + let x = x.clamp(0.0, (source.width - 1) as f64); + let y = y.clamp(0.0, (source.height - 1) as f64); + let x0 = x.floor() as u32; + let y0 = y.floor() as u32; + let x1 = (x0 + 1).min(source.width - 1); + let y1 = (y0 + 1).min(source.height - 1); + let tx = x - x0 as f64; + let ty = y - y0 as f64; + + let top = mix_pixel(source.pixel(x0, y0), source.pixel(x1, y0), tx); + let bottom = mix_pixel(source.pixel(x0, y1), source.pixel(x1, y1), tx); + mix_pixel(top, bottom, ty) +} + +fn mix_pixel(a: [u8; 4], b: [u8; 4], t: f64) -> [u8; 4] { + let alpha_a = a[3] as f64 / 255.0; + let alpha_b = b[3] as f64 / 255.0; + let alpha = alpha_a + (alpha_b - alpha_a) * t; + if alpha <= f64::EPSILON { + return [0, 0, 0, 0]; } - let to_png = Command::new("sips") - .arg("-s") - .arg("format") - .arg("png") - .arg(&tiff) - .arg("--out") - .arg(dest) - .status() - .unwrap_or_else(|error| panic!("failed to run sips for tray PNG export: {error}")); - let _ = fs::remove_file(&tiff); - if !to_png.success() { - panic!("failed to write deinterlaced tray icon {}", dest.display()); + let mut out = [0; 4]; + for channel in 0..3 { + let premultiplied_a = a[channel] as f64 * alpha_a; + let premultiplied_b = b[channel] as f64 * alpha_b; + let premultiplied = premultiplied_a + (premultiplied_b - premultiplied_a) * t; + out[channel] = (premultiplied / alpha).round().clamp(0.0, 255.0) as u8; + } + out[3] = (alpha * 255.0).round().clamp(0.0, 255.0) as u8; + out +} + +impl RgbaImage { + fn pixel(&self, x: u32, y: u32) -> [u8; 4] { + let index = ((y * self.width + x) * 4) as usize; + [ + self.pixels[index], + self.pixels[index + 1], + self.pixels[index + 2], + self.pixels[index + 3], + ] } } From 3f64a53cbc15515521f65bf86570d4c9e8d071ff Mon Sep 17 00:00:00 2001 From: Loocor Date: Wed, 27 May 2026 13:53:25 +0800 Subject: [PATCH 2/3] refactor(platform): route opens through adapters Keep file, URL, and Zed opening behind cross-platform helpers instead of scattering direct macOS open command usage across dev and Tauri paths. --- src-tauri/Cargo.toml | 2 ++ src-tauri/src/routes.rs | 13 ++++++------- src-tauri/src/zed.rs | 30 ++++++++++++++---------------- src/routes.ts | 8 +++----- src/system-open.ts | 41 +++++++++++++++++++++++++++++++++++++++++ src/zed.ts | 28 ++++++++++++++++++---------- 6 files changed, 84 insertions(+), 38 deletions(-) create mode 100644 src/system-open.ts diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index efec04c..767fdec 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -31,6 +31,8 @@ rusqlite = { version = "0.32", features = ["bundled"] } serde = { version = "1", features = ["derive"] } serde_json = "1" tauri = { version = "2.0.0", features = ["tray-icon"] } +tauri-plugin-dialog = "2" +tauri-plugin-opener = "2" tempfile = "3" tokio = { version = "1", features = ["macros", "process", "rt-multi-thread", "time"] } tokio-tungstenite = { version = "0.26", features = ["rustls-tls-webpki-roots"] } diff --git a/src-tauri/src/routes.rs b/src-tauri/src/routes.rs index 4204ddf..6d82343 100644 --- a/src-tauri/src/routes.rs +++ b/src-tauri/src/routes.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use serde_json::{json, Value}; +use tauri_plugin_opener::{open_path, open_url, reveal_item_in_dir}; use crate::cdp::{list_targets, pick_codex_page_target, CdpTarget}; use crate::logging::DiagnosticLogger; @@ -145,12 +146,9 @@ fn read_latest_log_response(logger: &DiagnosticLogger) -> Value { fn reveal_path_response(path: &std::path::Path) -> Value { let result = if path.is_dir() { - std::process::Command::new("open").arg(path).spawn() + open_path(path, None::<&str>) } else { - std::process::Command::new("open") - .arg("-R") - .arg(path) - .spawn() + reveal_item_in_dir(path) }; match result { Ok(_) => json!({ "status": "ok", "path": path.to_string_lossy() }), @@ -177,7 +175,8 @@ async fn open_devtools_response(debug_port: u16) -> Value { Ok(url) => url, Err(error) => return json!({ "status": "failed", "message": error.to_string() }), }; - match std::process::Command::new("open").arg(&url).spawn() { + let target_id = target_id.trim(); + match open_url(&url, None::<&str>) { Ok(_) => json!({ "status": "ok", "targetId": target_id, "url": url }), Err(error) => json!({ "status": "failed", "message": error.to_string() }), } @@ -188,7 +187,7 @@ fn open_external_local_url_response(payload: &Value) -> Value { Ok(url) => url, Err(message) => return json!({ "status": "failed", "message": message }), }; - match std::process::Command::new("open").arg(&url).spawn() { + match open_url(&url, None::<&str>) { Ok(_) => json!({ "status": "ok", "url": url }), Err(error) => json!({ "status": "failed", "message": error.to_string() }), } diff --git a/src-tauri/src/zed.rs b/src-tauri/src/zed.rs index a7a66b5..c4a23bf 100644 --- a/src-tauri/src/zed.rs +++ b/src-tauri/src/zed.rs @@ -6,13 +6,14 @@ use std::process::Command; use serde::Serialize; use serde_json::{json, Value}; +use tauri_plugin_opener::open_url; #[derive(Debug)] pub enum ZedRemoteError { Validation(&'static str), StateRead(std::io::Error), StateParse(serde_json::Error), - Launch(std::io::Error), + Launch(String), } impl std::fmt::Display for ZedRemoteError { @@ -21,7 +22,7 @@ impl std::fmt::Display for ZedRemoteError { Self::Validation(message) => f.write_str(message), Self::StateRead(_) => f.write_str("Cannot read Codex remote connection state"), Self::StateParse(_) => f.write_str("Cannot parse Codex remote connection state"), - Self::Launch(error) => write!(f, "Failed to launch Zed: {error}"), + Self::Launch(message) => write!(f, "Failed to launch Zed: {message}"), } } } @@ -31,7 +32,7 @@ impl std::error::Error for ZedRemoteError { match self { Self::StateRead(error) => Some(error), Self::StateParse(error) => Some(error), - Self::Launch(error) => Some(error), + Self::Launch(_) => None, Self::Validation(_) => None, } } @@ -295,26 +296,23 @@ fn percent_encode_segment(segment: &str) -> String { } fn launch_zed_url(url: &str) -> Result<(), ZedRemoteError> { - let app_path = find_zed_app_path(); let cli_path = find_zed_cli_path(); - if cfg!(target_os = "macos") { - if let Some(app_path) = app_path { - Command::new("open") - .arg("-a") - .arg(app_path) - .arg(url) - .spawn() - .map_err(ZedRemoteError::Launch)?; - return Ok(()); - } - } if !cli_path.is_empty() { Command::new(cli_path) .arg(url) .spawn() - .map_err(ZedRemoteError::Launch)?; + .map_err(|error| ZedRemoteError::Launch(error.to_string()))?; return Ok(()); } + let app_path = find_zed_app_path(); + if cfg!(target_os = "macos") { + if let Some(app_path) = app_path { + let app = app_path.to_string_lossy().into_owned(); + open_url(url, Some(app.as_str())) + .map_err(|error| ZedRemoteError::Launch(error.to_string()))?; + return Ok(()); + } + } Err(ZedRemoteError::Validation( "Zed is not installed or not available on PATH", )) diff --git a/src/routes.ts b/src/routes.ts index 3e64c35..379ed6b 100644 --- a/src/routes.ts +++ b/src/routes.ts @@ -1,4 +1,3 @@ -import { spawn } from "node:child_process"; import { appendFileSync, existsSync, @@ -11,12 +10,13 @@ import { homedir } from "node:os"; import { join } from "node:path"; import { listTargets, pickCodexPageTarget } from "./cdp"; import { - PortForwardManager, discoverRemoteListeningPorts, discoveryRequestFromPayload, + PortForwardManager, requestFromPayload, } from "./ports"; import { invokeRustBridge, isRustBridgePath } from "./rust-bridge"; +import { launchSystemOpen } from "./system-open"; import { fallbackOpenRequestResponse, @@ -241,9 +241,7 @@ function readLatestLogContents(): string { function openPath(path: string, reveal = false): JsonValue { try { - const args = reveal ? ["-R", path] : [path]; - const child = spawn("open", args, { stdio: "ignore", detached: true }); - child.unref(); + launchSystemOpen(path, { reveal }); return { status: "ok", path }; } catch (error) { return { diff --git a/src/system-open.ts b/src/system-open.ts new file mode 100644 index 0000000..bf6a429 --- /dev/null +++ b/src/system-open.ts @@ -0,0 +1,41 @@ +import { spawn } from "node:child_process"; +import { dirname } from "node:path"; + +export type SystemOpenCommand = { + program: string; + args: string[]; +}; + +export function systemOpenCommand( + target: string, + options: { reveal?: boolean } = {}, +): SystemOpenCommand { + switch (process.platform) { + case "darwin": + return { program: "open", args: options.reveal ? ["-R", target] : [target] }; + case "win32": + if (options.reveal) { + return { program: "explorer.exe", args: ["/select,", target] }; + } + return { program: "explorer.exe", args: [target] }; + case "linux": + return { + program: "xdg-open", + args: [options.reveal ? dirname(target) : target], + }; + default: + throw new Error(`Opening paths is not supported on ${process.platform}`); + } +} + +export function launchSystemOpen( + target: string, + options: { reveal?: boolean } = {}, +): void { + const command = systemOpenCommand(target, options); + const child = spawn(command.program, command.args, { + stdio: "ignore", + detached: true, + }); + child.unref(); +} diff --git a/src/zed.ts b/src/zed.ts index 75f1918..d0f30dd 100644 --- a/src/zed.ts +++ b/src/zed.ts @@ -24,6 +24,19 @@ class ZedRemoteError extends Error { } } +type LaunchCommand = { + program: string; + args: string[]; +}; + +function spawnDetached(command: LaunchCommand): void { + const child = spawn(command.program, command.args, { + detached: true, + stdio: "ignore", + }); + child.unref(); +} + function stringValue(value: unknown): string { if (typeof value === "string") return value.trim(); if (typeof value === "number") return String(value); @@ -338,19 +351,14 @@ function fallbackOpenRequestFromGlobalState( } function launchZedUrl(url: string): void { - const appPath = findZedAppPath(); const cliPath = findZedCliPath(); - if (process.platform === "darwin" && appPath) { - const child = spawn("open", ["-a", appPath, url], { - detached: true, - stdio: "ignore", - }); - child.unref(); + if (cliPath) { + spawnDetached({ program: cliPath, args: [url] }); return; } - if (cliPath) { - const child = spawn(cliPath, [url], { detached: true, stdio: "ignore" }); - child.unref(); + const appPath = findZedAppPath(); + if (process.platform === "darwin" && appPath) { + spawnDetached({ program: "open", args: ["-a", appPath, url] }); return; } throw new ZedRemoteError("Zed is not installed or not available on PATH"); From 4ef4a5aff9a7e1606e684c238b9fe4097656839b Mon Sep 17 00:00:00 2001 From: Loocor Date: Wed, 27 May 2026 14:29:10 +0800 Subject: [PATCH 3/3] chore(platform): update tauri plugin lockfile Keep the lockfile in sync with the Tauri dialog and opener plugins introduced by the platform adapter cleanup. --- src-tauri/Cargo.lock | 923 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 762 insertions(+), 161 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index ed492d3..59093f5 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -59,6 +59,137 @@ version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "atk" version = "0.18.2" @@ -145,13 +276,35 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + [[package]] name = "block2" version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2", + "objc2 0.6.4", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", ] [[package]] @@ -357,6 +510,8 @@ dependencies = [ "serde_json", "tauri", "tauri-build", + "tauri-plugin-dialog", + "tauri-plugin-opener", "tempfile", "tokio", "tokio-tungstenite", @@ -372,6 +527,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "cookie" version = "0.18.1" @@ -398,6 +562,19 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.11.1", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + [[package]] name = "core-graphics" version = "0.25.0" @@ -624,9 +801,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ "bitflags 2.11.1", - "block2", + "block2 0.6.2", "libc", - "objc2", + "objc2 0.6.4", ] [[package]] @@ -749,6 +926,33 @@ version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "equivalent" version = "1.0.2" @@ -776,6 +980,27 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "fallible-iterator" version = "0.3.0" @@ -915,6 +1140,19 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.32" @@ -1165,7 +1403,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ "heck 0.4.1", - "proc-macro-crate 2.0.2", + "proc-macro-crate 2.0.0", "proc-macro-error", "proc-macro2", "quote", @@ -1302,6 +1540,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "hex" version = "0.4.3" @@ -1603,6 +1847,25 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + [[package]] name = "itoa" version = "1.0.18" @@ -1678,12 +1941,10 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.98" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67df7112613f8bfd9150013a0314e196f4800d3201ae742489d999db2f979f08" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ - "cfg-if", - "futures-util", "once_cell", "wasm-bindgen", ] @@ -1778,10 +2039,11 @@ dependencies = [ [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ + "bitflags 2.11.1", "libc", ] @@ -1892,10 +2154,10 @@ dependencies = [ "dpi", "gtk", "keyboard-types", - "objc2", + "objc2 0.6.4", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation", + "objc2-foundation 0.3.2", "once_cell", "png 0.18.1", "serde", @@ -1950,9 +2212,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.6" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" +checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" dependencies = [ "num_enum_derive", "rustversion", @@ -1960,9 +2222,9 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.6" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" dependencies = [ "proc-macro-crate 3.5.0", "proc-macro2", @@ -1970,6 +2232,22 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + [[package]] name = "objc2" version = "0.6.4" @@ -1987,10 +2265,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ "bitflags 2.11.1", - "block2", - "objc2", + "block2 0.6.2", + "objc2 0.6.4", "objc2-core-foundation", - "objc2-foundation", + "objc2-foundation 0.3.2", ] [[package]] @@ -2000,8 +2278,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ "bitflags 2.11.1", - "objc2", - "objc2-foundation", + "objc2 0.6.4", + "objc2-foundation 0.3.2", ] [[package]] @@ -2010,8 +2288,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ - "objc2", - "objc2-foundation", + "objc2 0.6.4", + "objc2-foundation 0.3.2", ] [[package]] @@ -2022,7 +2300,7 @@ checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ "bitflags 2.11.1", "dispatch2", - "objc2", + "objc2 0.6.4", ] [[package]] @@ -2033,7 +2311,7 @@ checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ "bitflags 2.11.1", "dispatch2", - "objc2", + "objc2 0.6.4", "objc2-core-foundation", "objc2-io-surface", ] @@ -2044,8 +2322,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" dependencies = [ - "objc2", - "objc2-foundation", + "objc2 0.6.4", + "objc2-foundation 0.3.2", ] [[package]] @@ -2054,20 +2332,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" dependencies = [ - "objc2", - "objc2-foundation", -] - -[[package]] -name = "objc2-core-text" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" -dependencies = [ - "bitflags 2.11.1", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", + "objc2 0.6.4", + "objc2-foundation 0.3.2", ] [[package]] @@ -2085,6 +2351,18 @@ dependencies = [ "cc", ] +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.11.1", + "block2 0.5.1", + "libc", + "objc2 0.5.2", +] + [[package]] name = "objc2-foundation" version = "0.3.2" @@ -2092,8 +2370,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ "bitflags 2.11.1", - "block2", - "objc2", + "block2 0.6.2", + "libc", + "objc2 0.6.4", "objc2-core-foundation", ] @@ -2104,10 +2383,35 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ "bitflags 2.11.1", - "objc2", + "objc2 0.6.4", "objc2-core-foundation", ] +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.11.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.11.1", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + [[package]] name = "objc2-quartz-core" version = "0.3.2" @@ -2115,29 +2419,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ "bitflags 2.11.1", - "objc2", + "objc2 0.6.4", "objc2-core-foundation", - "objc2-foundation", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-ui-kit" -version = "0.3.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" dependencies = [ "bitflags 2.11.1", - "block2", - "objc2", + "block2 0.6.2", + "objc2 0.6.4", "objc2-cloud-kit", "objc2-core-data", "objc2-core-foundation", "objc2-core-graphics", "objc2-core-image", "objc2-core-location", - "objc2-core-text", - "objc2-foundation", - "objc2-quartz-core", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", "objc2-user-notifications", ] @@ -2147,8 +2450,8 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" dependencies = [ - "objc2", - "objc2-foundation", + "objc2 0.6.4", + "objc2-foundation 0.3.2", ] [[package]] @@ -2158,11 +2461,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" dependencies = [ "bitflags 2.11.1", - "block2", - "objc2", + "block2 0.6.2", + "objc2 0.6.4", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation", + "objc2-foundation 0.3.2", ] [[package]] @@ -2171,12 +2474,34 @@ version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" +[[package]] +name = "open" +version = "5.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fbaa89d2ddc8473c78a3adf69eea8cffa28c483b8e02a971ef31527cd0fc92c" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + [[package]] name = "option-ext" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "pango" version = "0.18.3" @@ -2202,6 +2527,12 @@ dependencies = [ "system-deps", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.5" @@ -2225,6 +2556,12 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "percent-encoding" version = "2.3.2" @@ -2290,6 +2627,17 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" +[[package]] +name = "piper" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkg-config" version = "0.3.33" @@ -2335,6 +2683,20 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "potential_utf" version = "0.1.5" @@ -2387,12 +2749,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" dependencies = [ - "toml_datetime 0.6.3", - "toml_edit 0.20.2", + "toml_edit 0.20.7", ] [[package]] @@ -2559,9 +2920,9 @@ checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" [[package]] name = "redox_syscall" -version = "0.5.18" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags 2.11.1", ] @@ -2666,9 +3027,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.13.3" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" +checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" dependencies = [ "base64 0.22.1", "bytes", @@ -2698,6 +3059,30 @@ dependencies = [ "web-sys", ] +[[package]] +name = "rfd" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" +dependencies = [ + "block2 0.6.2", + "dispatch2", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc2 0.6.4", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.60.2", +] + [[package]] name = "ring" version = "0.17.14" @@ -3140,24 +3525,24 @@ dependencies = [ [[package]] name = "softbuffer" -version = "0.4.8" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aac18da81ebbf05109ab275b157c22a653bb3c12cf884450179942f81bcbf6c3" +checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" dependencies = [ "bytemuck", + "cfg_aliases", + "core-graphics 0.24.0", + "foreign-types", "js-sys", - "ndk", - "objc2", - "objc2-core-foundation", - "objc2-core-graphics", - "objc2-foundation", - "objc2-quartz-core", + "log", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", "raw-window-handle", "redox_syscall", - "tracing", "wasm-bindgen", "web-sys", - "windows-sys 0.61.2", + "windows-sys 0.59.0", ] [[package]] @@ -3289,7 +3674,7 @@ dependencies = [ "cfg-expr", "heck 0.5.0", "pkg-config", - "toml 0.8.2", + "toml 0.8.23", "version-compare", ] @@ -3300,9 +3685,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a33f7f9e486ade65fcf1e45c440f9236c904f5c1002cdc7fc6ae582777345ce4" dependencies = [ "bitflags 2.11.1", - "block2", + "block2 0.6.2", "core-foundation", - "core-graphics", + "core-graphics 0.25.0", "crossbeam-channel", "dbus", "dispatch2", @@ -3316,9 +3701,9 @@ dependencies = [ "log", "ndk", "ndk-sys", - "objc2", + "objc2 0.6.4", "objc2-app-kit", - "objc2-foundation", + "objc2-foundation 0.3.2", "objc2-ui-kit", "once_cell", "parking_lot", @@ -3372,15 +3757,15 @@ dependencies = [ "log", "mime", "muda", - "objc2", + "objc2 0.6.4", "objc2-app-kit", - "objc2-foundation", + "objc2-foundation 0.3.2", "objc2-ui-kit", "objc2-web-kit", "percent-encoding", "plist", "raw-window-handle", - "reqwest 0.13.3", + "reqwest 0.13.2", "serde", "serde_json", "serde_repr", @@ -3463,6 +3848,86 @@ dependencies = [ "tauri-utils", ] +[[package]] +name = "tauri-plugin" +version = "2.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e126abc9e84e35cdfd01596140a73a1850cdb0df0a23acf0185776c30b469a6e" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "walkdir", +] + +[[package]] +name = "tauri-plugin-dialog" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65981abb771e74e571a38196c3baa11c459379164791eba0e67abc1a5fac9884" +dependencies = [ + "log", + "raw-window-handle", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.18", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7ecc274121aca0c036a2b42d1cbe83d368d348f54e0bb8a735c2b1548e8f371" +dependencies = [ + "anyhow", + "dunce", + "glob", + "log", + "objc2-foundation 0.3.2", + "percent-encoding", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.18", + "toml 1.1.2+spec-1.1.0", + "url", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17e1bea14edce6b793a04e2417e3fd924b9bc4faae83cdee7d714156cceeed29" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation 0.3.2", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.18", + "url", + "windows", + "zbus", +] + [[package]] name = "tauri-runtime" version = "2.11.2" @@ -3474,7 +3939,7 @@ dependencies = [ "gtk", "http", "jni", - "objc2", + "objc2 0.6.4", "objc2-ui-kit", "objc2-web-kit", "raw-window-handle", @@ -3498,7 +3963,7 @@ dependencies = [ "http", "jni", "log", - "objc2", + "objc2 0.6.4", "objc2-app-kit", "once_cell", "percent-encoding", @@ -3750,14 +4215,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.2" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "toml_edit 0.20.2", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", ] [[package]] @@ -3792,9 +4257,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] @@ -3824,21 +4289,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.14.0", - "toml_datetime 0.6.3", + "toml_datetime 0.6.11", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.20.2" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +dependencies = [ + "indexmap 2.14.0", + "toml_datetime 0.6.11", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ "indexmap 2.14.0", "serde", "serde_spanned 0.6.9", - "toml_datetime 0.6.3", - "winnow 0.5.40", + "toml_datetime 0.6.11", + "winnow 0.7.15", ] [[package]] @@ -3920,9 +4396,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "tracing-core" version = "0.1.36" @@ -3942,11 +4430,11 @@ dependencies = [ "dirs", "libappindicator", "muda", - "objc2", + "objc2 0.6.4", "objc2-app-kit", "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation", + "objc2-foundation 0.3.2", "once_cell", "png 0.18.1", "serde", @@ -3991,6 +4479,17 @@ version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + [[package]] name = "unic-char-property" version = "0.9.0" @@ -4170,11 +4669,11 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasip2" -version = "1.0.3+wasi-0.2.9" +version = "1.0.2+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" dependencies = [ - "wit-bindgen 0.57.1", + "wit-bindgen", ] [[package]] @@ -4183,14 +4682,14 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen 0.51.0", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.121" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49ace1d07c165b0864824eee619580c4689389afa9dc9ed3a4c75040d82e6790" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -4201,19 +4700,23 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.71" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96492d0d3ffba25305a7dc88720d250b1401d7edca02cc3bcd50633b424673b8" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ + "cfg-if", + "futures-util", "js-sys", + "once_cell", "wasm-bindgen", + "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.121" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e68e6f4afd367a562002c05637acb8578ff2dea1943df76afb9e83d177c8578" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4221,9 +4724,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.121" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d95a9ec35c64b2a7cb35d3fead40c4238d0940c86d107136999567a4703259f2" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", @@ -4234,9 +4737,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.121" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4e0100b01e9f0d03189a92b96772a1fb998639d981193d7dbab487302513441" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] @@ -4290,9 +4793,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.98" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b572dff8bcf38bad0fa19729c89bb5748b2b9b1d8be70cf90df697e3a8f32aa" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -4384,9 +4887,9 @@ dependencies = [ [[package]] name = "webview2-com" -version = "0.38.2" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" +checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4" dependencies = [ "webview2-com-macros", "webview2-com-sys", @@ -4398,9 +4901,9 @@ dependencies = [ [[package]] name = "webview2-com-macros" -version = "0.8.1" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a921c1b6914c367b2b823cd4cde6f96beec77d30a939c8199bb377cf9b9b54" +checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" dependencies = [ "proc-macro2", "quote", @@ -4409,9 +4912,9 @@ dependencies = [ [[package]] name = "webview2-com-sys" -version = "0.38.2" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" +checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" dependencies = [ "thiserror 2.0.18", "windows", @@ -4455,10 +4958,10 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" dependencies = [ - "objc2", + "objc2 0.6.4", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation", + "objc2-foundation 0.3.2", "raw-window-handle", "windows-sys 0.59.0", "windows-version", @@ -4636,7 +5139,7 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.5", + "windows-targets 0.53.4", ] [[package]] @@ -4681,19 +5184,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.5" +version = "0.53.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" dependencies = [ "windows-link 0.2.1", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", ] [[package]] @@ -4707,9 +5210,9 @@ dependencies = [ [[package]] name = "windows-version" -version = "0.1.7" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +checksum = "700dad7c058606087f6fdc1f88da5841e06da40334413c6cd4367b25ef26d24e" dependencies = [ "windows-link 0.2.1", ] @@ -4728,9 +5231,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" [[package]] name = "windows_aarch64_msvc" @@ -4746,9 +5249,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" [[package]] name = "windows_i686_gnu" @@ -4764,9 +5267,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" [[package]] name = "windows_i686_gnullvm" @@ -4776,9 +5279,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" [[package]] name = "windows_i686_msvc" @@ -4794,9 +5297,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" [[package]] name = "windows_x86_64_gnu" @@ -4812,9 +5315,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" [[package]] name = "windows_x86_64_gnullvm" @@ -4830,9 +5333,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" [[package]] name = "windows_x86_64_msvc" @@ -4848,9 +5351,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" [[package]] name = "winnow" @@ -4866,6 +5369,9 @@ name = "winnow" version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] [[package]] name = "winnow" @@ -4895,12 +5401,6 @@ dependencies = [ "wit-bindgen-rust-macro", ] -[[package]] -name = "wit-bindgen" -version = "0.57.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" - [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -4993,7 +5493,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" dependencies = [ "base64 0.22.1", - "block2", + "block2 0.6.2", "cookie", "crossbeam-channel", "dirs", @@ -5007,10 +5507,10 @@ dependencies = [ "jni", "libc", "ndk", - "objc2", + "objc2 0.6.4", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation", + "objc2-foundation 0.3.2", "objc2-ui-kit", "objc2-web-kit", "once_cell", @@ -5074,6 +5574,67 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zbus" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3bcbf15c8708d7fc1be0c993622e0a5cbd5e8b52bfa40afa4c3e0cd8d724ac1" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "libc", + "ordered-stream", + "rustix", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.3", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51fa5406ad9175a8c825a931f8cf347116b531b3634fcb0b627c290f1f2516ff" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" +dependencies = [ + "serde", + "winnow 1.0.3", + "zvariant", +] + [[package]] name = "zerocopy" version = "0.8.48" @@ -5159,3 +5720,43 @@ name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" + +[[package]] +name = "zvariant" +version = "5.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db0ecb8987cf5e92653c57c098f7f0e39a03112edb796f4fe089fb7eaa14ff" +dependencies = [ + "endi", + "enumflags2", + "serde", + "winnow 1.0.3", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b949b639ab1b4bed763aa7481ba0e368af68d8b55532f8ed4bec86a59f2ca98" +dependencies = [ + "proc-macro-crate 3.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d464f5733ffa07a3164d656f18533caace9d0638596721355d73256a410d691" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.117", + "winnow 1.0.3", +]