diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 312392eb5..20df85561 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -43,3 +43,6 @@ rmcp = { git = "https://github.com/modelcontextprotocol/rust-sdk", branch = "mai "transport-child-process", "tower", ] } + +[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] +tauri-plugin-updater = "2" diff --git a/src-tauri/src/core/mcp.rs b/src-tauri/src/core/mcp.rs index c016effd7..98bf0ad3b 100644 --- a/src-tauri/src/core/mcp.rs +++ b/src-tauri/src/core/mcp.rs @@ -30,16 +30,19 @@ pub async fn run_mcp_commands( if let Some(server_map) = mcp_servers.get("mcpServers").and_then(Value::as_object) { println!("MCP Servers: {server_map:#?}"); - + for (name, config) in server_map { if let Some((command, args)) = extract_command_args(config) { let mut cmd = Command::new(command); - args.iter().filter_map(Value::as_str).for_each(|arg| { cmd.arg(arg); }); - - let service = ().serve(TokioChildProcess::new(&mut cmd).map_err(|e| e.to_string())?) - .await - .map_err(|e| e.to_string())?; - + args.iter().filter_map(Value::as_str).for_each(|arg| { + cmd.arg(arg); + }); + + let service = + ().serve(TokioChildProcess::new(&mut cmd).map_err(|e| e.to_string())?) + .await + .map_err(|e| e.to_string())?; + servers_state.lock().await.insert(name.clone(), service); } } diff --git a/src-tauri/src/core/mod.rs b/src-tauri/src/core/mod.rs index baa8c2834..e4f0ee6c4 100644 --- a/src-tauri/src/core/mod.rs +++ b/src-tauri/src/core/mod.rs @@ -1,6 +1,6 @@ pub mod cmd; pub mod fs; +pub mod mcp; +pub mod server; pub mod setup; pub mod state; -pub mod server; -pub mod mcp; \ No newline at end of file diff --git a/src-tauri/src/core/state.rs b/src-tauri/src/core/state.rs index 93d770bc2..925030085 100644 --- a/src-tauri/src/core/state.rs +++ b/src-tauri/src/core/state.rs @@ -7,7 +7,7 @@ use tokio::sync::Mutex; #[derive(Default)] pub struct AppState { pub app_token: Option, - pub mcp_servers: Arc>>> + pub mcp_servers: Arc>>>, } pub fn generate_app_token() -> String { rand::thread_rng() diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index d59949f8b..3b44dc079 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -40,9 +40,18 @@ } } }, + "plugins": { + "updater": { + "pubkey": "", + "endpoints": [ + "https://github.com/menloresearch/jan/releases/latest/download/latest.json" + ] + } + }, "bundle": { "active": true, "targets": "all", + "createUpdaterArtifacts": true, "icon": [ "icons/32x32.png", "icons/128x128.png", diff --git a/web/containers/ModalAppUpdaterChangelog/index.tsx b/web/containers/ModalAppUpdaterChangelog/index.tsx index 705623a90..fa519780c 100644 --- a/web/containers/ModalAppUpdaterChangelog/index.tsx +++ b/web/containers/ModalAppUpdaterChangelog/index.tsx @@ -1,7 +1,8 @@ -import React, { useEffect, useState } from 'react' +import React, { useEffect, useRef, useState } from 'react' import { Button, Modal } from '@janhq/joi' +import { check, Update } from '@tauri-apps/plugin-updater' import { useAtom } from 'jotai' import { useGetLatestRelease } from '@/hooks/useGetLatestRelease' @@ -16,6 +17,7 @@ const ModalAppUpdaterChangelog = () => { const [appUpdateAvailable, setAppUpdateAvailable] = useAtom( appUpdateAvailableAtom ) + const updaterRef = useRef(null) const [open, setOpen] = useState(appUpdateAvailable) @@ -26,6 +28,17 @@ const ModalAppUpdaterChangelog = () => { const beta = VERSION.includes('beta') const nightly = VERSION.includes('-') + const checkForUpdate = async () => { + const update = await check() + if (update) { + setAppUpdateAvailable(true) + updaterRef.current = update + } + } + useEffect(() => { + checkForUpdate() + }, []) + const { release } = useGetLatestRelease(beta ? true : false) return ( @@ -73,8 +86,8 @@ const ModalAppUpdaterChangelog = () => {