From 25ab2b036833baa922d21cac6b1ce181829e3c0e Mon Sep 17 00:00:00 2001 From: lencx Date: Sat, 24 Dec 2022 20:04:14 +0800 Subject: [PATCH 1/4] chore: optim --- src-tauri/Cargo.toml | 1 + src-tauri/src/app/cmd.rs | 77 +++++++++++++++++++++++++--- src-tauri/src/app/menu.rs | 10 ++-- src-tauri/src/app/setup.rs | 8 +-- src-tauri/src/app/window.rs | 14 +++++ src-tauri/src/assets/cmd.js | 2 - src-tauri/src/assets/core.js | 20 ++++++++ src-tauri/src/main.rs | 3 +- src-tauri/src/utils.rs | 21 ++++++++ src/hooks/useData.ts | 2 - src/hooks/useEvent.ts | 34 ------------ src/main.tsx | 14 ++--- src/utils.ts | 8 ++- src/view/model/SyncCustom/Form.tsx | 17 ++++-- src/view/model/SyncCustom/config.tsx | 12 ++++- src/view/model/SyncCustom/index.tsx | 4 +- src/view/model/SyncPrompts/index.tsx | 19 +++---- src/view/model/SyncRecord/config.tsx | 2 +- 18 files changed, 179 insertions(+), 89 deletions(-) delete mode 100644 src/hooks/useEvent.ts diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 1d1b9a9..134b983 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -23,6 +23,7 @@ log = "0.4.17" csv = "1.1.6" thiserror = "1.0.38" walkdir = "2.3.2" +regex = "1.7.0" # tokio = { version = "1.23.0", features = ["macros"] } # reqwest = "0.11.13" diff --git a/src-tauri/src/app/cmd.rs b/src-tauri/src/app/cmd.rs index 25784a4..d5f624e 100644 --- a/src-tauri/src/app/cmd.rs +++ b/src-tauri/src/app/cmd.rs @@ -1,5 +1,5 @@ use crate::{conf::ChatConfJson, utils}; -use std::{fs, path::PathBuf}; +use std::{collections::HashMap, fs, path::PathBuf}; use tauri::{api, command, AppHandle, Manager}; #[command] @@ -72,7 +72,7 @@ pub fn get_chat_model_cmd() -> serde_json::Value { serde_json::from_str(&content).unwrap() } -#[derive(Debug, serde::Serialize, serde::Deserialize)] +#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] pub struct PromptRecord { pub cmd: Option, pub act: String, @@ -99,9 +99,8 @@ pub fn window_reload(app: AppHandle, label: &str) { .unwrap(); } - -use walkdir::WalkDir; use utils::chat_root; +use walkdir::WalkDir; #[derive(serde::Serialize, serde::Deserialize, Debug, Clone)] pub struct ModelRecord { @@ -115,12 +114,14 @@ pub struct ModelRecord { #[command] pub fn cmd_list() -> Vec { let mut list = vec![]; - for entry in WalkDir::new(chat_root().join("cache_model")).into_iter().filter_map(|e| e.ok()) { + for entry in WalkDir::new(chat_root().join("cache_model")) + .into_iter() + .filter_map(|e| e.ok()) + { let file = fs::read_to_string(entry.path().display().to_string()); if let Ok(v) = file { let data: Vec = serde_json::from_str(&v).unwrap_or_else(|_| vec![]); - let enable_list = data.into_iter() - .filter(|v| v.enable); + let enable_list = data.into_iter().filter(|v| v.enable); list.extend(enable_list) } } @@ -128,3 +129,65 @@ pub fn cmd_list() -> Vec { list.sort_by(|a, b| a.cmd.len().cmp(&b.cmd.len())); list } + +#[command] +pub fn sync_prompts(app: AppHandle, data: String, time: u64) { + let data = parse_prompt(data) + .iter() + .map(move |i| ModelRecord { + cmd: if i.cmd.is_some() { + i.cmd.clone().unwrap() + } else { + utils::gen_cmd(i.act.clone()) + }, + act: i.act.clone(), + prompt: i.prompt.clone(), + tags: vec!["chatgpt-prompts".to_string()], + enable: true, + }) + .collect::>(); + + let model = chat_root().join("chat.model.json"); + let model_cmd = chat_root().join("chat.model.cmd.json"); + let chatgpt_prompts = chat_root().join("cache_model").join("chatgpt_prompts.json"); + + // chatgpt_prompts.json + fs::write( + chatgpt_prompts, + serde_json::to_string_pretty(&data).unwrap(), + ) + .unwrap(); + let cmd_data = cmd_list(); + + // chat.model.cmd.json + fs::write( + model_cmd, + serde_json::to_string_pretty(&serde_json::json!({ + "name": "ChatGPT CMD", + "last_updated": time, + "data": cmd_data, + })) + .unwrap(), + ) + .unwrap(); + let mut kv = HashMap::new(); + kv.insert( + "sync_prompts".to_string(), + serde_json::json!({ "id": "chatgpt_prompts", "last_updated": time }), + ); + let model_data = utils::merge( + &serde_json::from_str(&fs::read_to_string(&model).unwrap()).unwrap(), + &kv, + ); + + // chat.model.json + fs::write(model, serde_json::to_string_pretty(&model_data).unwrap()).unwrap(); + + // refresh window + api::dialog::message( + app.get_window("core").as_ref(), + "Sync Prompts", + "ChatGPT Prompts data has been synchronized!", + ); + window_reload(app, "core"); +} diff --git a/src-tauri/src/app/menu.rs b/src-tauri/src/app/menu.rs index e59b8aa..8cf63eb 100644 --- a/src-tauri/src/app/menu.rs +++ b/src-tauri/src/app/menu.rs @@ -8,6 +8,8 @@ use tauri::{ }; use tauri_plugin_positioner::{on_tray_event, Position, WindowExt}; +use super::window; + // --- Menu pub fn init() -> Menu { let chat_conf = ChatConfJson::get_chat_conf(); @@ -174,7 +176,7 @@ pub fn menu_handler(event: WindowMenuEvent) { match menu_id { // Preferences - "control_center" => app.get_window("main").unwrap().show().unwrap(), + "control_center" => window::control_window(&app), "restart" => tauri::api::process::restart(&app.env()), "inject_script" => open(&app, script_path), "go_conf" => utils::open_file(utils::chat_root()), @@ -182,12 +184,12 @@ pub fn menu_handler(event: WindowMenuEvent) { "awesome" => open(&app, conf::AWESOME_URL.to_string()), "sync_prompts" => { tauri::api::dialog::ask( - app.get_window("main").as_ref(), + app.get_window("core").as_ref(), "Sync Prompts", "Data sync will enable all prompts, are you sure you want to sync?", move |is_restart| { if is_restart { - app.get_window("main") + app.get_window("core") .unwrap() .eval("window.__sync_prompts && window.__sync_prompts()") .unwrap() @@ -304,7 +306,7 @@ pub fn tray_handler(handle: &AppHandle, event: SystemTrayEvent) { } } SystemTrayEvent::MenuItemClick { id, .. } => match id.as_str() { - "control_center" => app.get_window("main").unwrap().show().unwrap(), + "control_center" => window::control_window(&app), "restart" => tauri::api::process::restart(&handle.env()), "show_dock_icon" => { ChatConfJson::amend(&serde_json::json!({ "hide_dock_icon": false }), Some(app)) diff --git a/src-tauri/src/app/setup.rs b/src-tauri/src/app/setup.rs index 7d342a4..dffaeef 100644 --- a/src-tauri/src/app/setup.rs +++ b/src-tauri/src/app/setup.rs @@ -5,11 +5,11 @@ pub fn init(app: &mut App) -> std::result::Result<(), Box let chat_conf = ChatConfJson::get_chat_conf(); let url = chat_conf.origin.to_string(); let theme = ChatConfJson::theme(); - let handle = app.app_handle(); + // let handle = app.app_handle(); - std::thread::spawn(move || { - window::tray_window(&handle); - }); + // std::thread::spawn(move || { + // window::tray_window(&handle); + // }); if chat_conf.hide_dock_icon { #[cfg(target_os = "macos")] diff --git a/src-tauri/src/app/window.rs b/src-tauri/src/app/window.rs index e3c6413..68aeae1 100644 --- a/src-tauri/src/app/window.rs +++ b/src-tauri/src/app/window.rs @@ -28,3 +28,17 @@ pub fn tray_window(handle: &tauri::AppHandle) { .unwrap(); }); } + +pub fn control_window(handle: &tauri::AppHandle) { + let app = handle.clone(); + std::thread::spawn(move || { + WindowBuilder::new(&app, "main", WindowUrl::App("index.html".into())) + .title("ChatGPT") + .resizable(false) + .fullscreen(false) + .inner_size(800.0, 600.0) + .min_inner_size(800.0, 600.0) + .build() + .unwrap(); + }); +} diff --git a/src-tauri/src/assets/cmd.js b/src-tauri/src/assets/cmd.js index 42e4dcb..97164d7 100644 --- a/src-tauri/src/assets/cmd.js +++ b/src-tauri/src/assets/cmd.js @@ -106,8 +106,6 @@ async function cmdTip() { // input text if (window.__CHAT_MODEL_STATUS__ === 2 && event.keyCode === 9) { - console.log('«110» /src/assets/cmd.js ~> ', __CHAT_MODEL_STATUS__); - searchInput.value = window.__CHAT_MODEL_CMD_PROMPT__; modelDom.innerHTML = ''; delete window.__CHAT_MODEL_STATUS__; diff --git a/src-tauri/src/assets/core.js b/src-tauri/src/assets/core.js index 3a2a433..35715b6 100644 --- a/src-tauri/src/assets/core.js +++ b/src-tauri/src/assets/core.js @@ -86,6 +86,26 @@ async function init() { } } }); + + window.__sync_prompts = async function() { + const res = await fetch('https://raw.githubusercontent.com/f/awesome-chatgpt-prompts/main/prompts.csv'); + if (res.ok) { + const data = await res.text(); + console.log('«94» /src/assets/core.js ~> ', data); + + await invoke('sync_prompts', { data, time: Date.now() }); + } else { + invoke('messageDialog', { + __tauriModule: 'Dialog', + message: { + cmd: 'messageDialog', + message: 'ChatGPT Prompts data sync failed, please try again!'.toString(), + title: 'Sync Prompts'.toString(), + type: 'error' + } + }) + } + } } if ( diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index e53314f..c94338e 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -61,6 +61,7 @@ fn main() { cmd::open_file, cmd::get_chat_model_cmd, cmd::parse_prompt, + cmd::sync_prompts, cmd::window_reload, cmd::cmd_list, fs_extra::metadata, @@ -76,7 +77,7 @@ fn main() { if let tauri::WindowEvent::CloseRequested { api, .. } = event.event() { let win = event.window(); if win.label() == "main" { - win.hide().unwrap(); + win.close().unwrap(); } else { // TODO: https://github.com/tauri-apps/tauri/issues/3084 // event.window().hide().unwrap(); diff --git a/src-tauri/src/utils.rs b/src-tauri/src/utils.rs index e8fe0fb..502e3f5 100644 --- a/src-tauri/src/utils.rs +++ b/src-tauri/src/utils.rs @@ -1,6 +1,9 @@ use anyhow::Result; use log::info; +use regex::Regex; +use serde_json::Value; use std::{ + collections::HashMap, fs::{self, File}, path::{Path, PathBuf}, process::Command, @@ -89,3 +92,21 @@ pub fn clear_conf(app: &tauri::AppHandle) { }, ); } + +pub fn merge(v: &Value, fields: &HashMap) -> Value { + match v { + Value::Object(m) => { + let mut m = m.clone(); + for (k, v) in fields { + m.insert(k.clone(), v.clone()); + } + Value::Object(m) + } + v => v.clone(), + } +} + +pub fn gen_cmd(name: String) -> String { + let re = Regex::new(r"[^a-zA-Z0-9]").unwrap(); + re.replace_all(&name, "_").to_lowercase() +} diff --git a/src/hooks/useData.ts b/src/hooks/useData.ts index 39b52f1..86cf9fa 100644 --- a/src/hooks/useData.ts +++ b/src/hooks/useData.ts @@ -18,8 +18,6 @@ export default function useData(oData: any[]) { const opInit = (val: any[] = []) => { if (!val || !Array.isArray(val)) return; - console.log('«20» /src/hooks/useData.ts ~> ', val); - const nData = val.map(i => ({ [safeKey]: v4(), ...i })); setData(nData); }; diff --git a/src/hooks/useEvent.ts b/src/hooks/useEvent.ts deleted file mode 100644 index 3a4146e..0000000 --- a/src/hooks/useEvent.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { invoke, path, http, fs, dialog } from '@tauri-apps/api'; - -import useInit from '@/hooks/useInit'; -import useChatModel, { useCacheModel } from '@/hooks/useChatModel'; -import { GITHUB_PROMPTS_CSV_URL, chatRoot, genCmd } from '@/utils'; - -export default function useEvent() { - const { modelSet } = useChatModel('sync_prompts'); - const { modelCacheSet } = useCacheModel(); - // Using `emit` and `listen` will be triggered multiple times in development mode. - // So here we use `eval` to call `__sync_prompt` - useInit(() => { - (window as any).__sync_prompts = async () => { - const res = await http.fetch(GITHUB_PROMPTS_CSV_URL, { - method: 'GET', - responseType: http.ResponseType.Text, - }); - const data = (res.data || '') as string; - if (res.ok) { - const file = await path.join(await chatRoot(), 'cache_model', 'chatgpt_prompts.json'); - const list: Record[] = await invoke('parse_prompt', { data }); - const fmtList = list.map(i => ({ ...i, cmd: i.cmd ? i.cmd : genCmd(i.act), enable: true, tags: ['chatgpt-prompts'] })); - await modelCacheSet(fmtList, file); - modelSet({ - id: 'chatgpt_prompts', - last_updated: Date.now(), - }); - dialog.message('ChatGPT Prompts data has been synchronized!'); - } else { - dialog.message('ChatGPT Prompts data sync failed, please try again!'); - } - } - }) -} diff --git a/src/main.tsx b/src/main.tsx index 2bbdc78..488f0cd 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -2,23 +2,15 @@ import { StrictMode, Suspense } from 'react'; import { BrowserRouter } from 'react-router-dom'; import ReactDOM from 'react-dom/client'; -import useEvent from '@/hooks/useEvent'; import Layout from '@/layout'; import './main.scss'; -const App = () => { - useEvent(); - return ( - - - - ); -} - ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( - + + + ); diff --git a/src/utils.ts b/src/utils.ts index ee31d64..570c300 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -20,10 +20,6 @@ export const chatModelPath = async (): Promise => { return join(await chatRoot(), CHAT_MODEL_JSON); } -// export const chatModelSyncPath = async (): Promise => { -// return join(await chatRoot(), CHAT_MODEL_SYNC_JSON); -// } - export const chatPromptsPath = async (): Promise => { return join(await chatRoot(), CHAT_PROMPTS_CSV); } @@ -35,7 +31,9 @@ export const readJSON = async (path: string, opts: readJSONOpts = {}) => { const file = await join(isRoot ? '' : root, path); if (!await exists(file)) { - await createDir(await dirname(file), { recursive: true }); + if (await dirname(file) !== root) { + await createDir(await dirname(file), { recursive: true }); + } await writeTextFile(file, isList ? '[]' : JSON.stringify({ name: 'ChatGPT', link: 'https://github.com/lencx/ChatGPT', diff --git a/src/view/model/SyncCustom/Form.tsx b/src/view/model/SyncCustom/Form.tsx index f823808..adbb4c0 100644 --- a/src/view/model/SyncCustom/Form.tsx +++ b/src/view/model/SyncCustom/Form.tsx @@ -8,6 +8,7 @@ import useInit from '@/hooks/useInit'; interface SyncFormProps { record?: Record | null; + type: string; } const initFormValue = { @@ -17,7 +18,8 @@ const initFormValue = { prompt: '', }; -const SyncForm: ForwardRefRenderFunction = ({ record }, ref) => { +const SyncForm: ForwardRefRenderFunction = ({ record, type }, ref) => { + const isDisabled = type === 'edit'; const [form] = Form.useForm(); useImperativeHandle(ref, () => ({ form })); const [root, setRoot] = useState(''); @@ -34,7 +36,7 @@ const SyncForm: ForwardRefRenderFunction = ({ record } const pathOptions = ( - {root} http:// https:// @@ -43,7 +45,7 @@ const SyncForm: ForwardRefRenderFunction = ({ record } ); const extOptions = ( - .csv .json @@ -90,8 +92,13 @@ const SyncForm: ForwardRefRenderFunction = ({ record } label="PATH" name="path" rules={[{ required: true, message: 'Please input path!' }]} - > - + > + diff --git a/src/view/model/SyncCustom/config.tsx b/src/view/model/SyncCustom/config.tsx index 2c214d9..d491cfc 100644 --- a/src/view/model/SyncCustom/config.tsx +++ b/src/view/model/SyncCustom/config.tsx @@ -34,7 +34,7 @@ export const syncColumns = () => [ key: 'last_updated', width: 140, render: (v: number) => ( -
+
{ v ? fmtDate(v) : ''}
@@ -47,7 +47,15 @@ export const syncColumns = () => [ render: (_: any, row: any, actions: any) => { return ( - actions.setRecord(row, 'sync')}>Sync + actions.setRecord(row, 'sync')} + okText="Yes" + cancelText="No" + > + Sync + {row.last_updated && View} actions.setRecord(row, 'edit')}>Edit - +
) diff --git a/src/view/model/SyncPrompts/index.tsx b/src/view/model/SyncPrompts/index.tsx index d6add56..e6d5f3b 100644 --- a/src/view/model/SyncPrompts/index.tsx +++ b/src/view/model/SyncPrompts/index.tsx @@ -69,6 +69,16 @@ export default function SyncPrompts() { return (
+ + +
{selectedItems.length > 0 && ( <> @@ -78,15 +88,6 @@ export default function SyncPrompts() { )}
- Data sync will enable all prompts,
are you sure you want to sync?} - placement="topLeft" - onConfirm={handleSync} - okText="Yes" - cancelText="No" - > - -
diff --git a/src/view/model/SyncRecord/config.tsx b/src/view/model/SyncRecord/config.tsx index 32fbf6a..c040ebc 100644 --- a/src/view/model/SyncRecord/config.tsx +++ b/src/view/model/SyncRecord/config.tsx @@ -10,7 +10,7 @@ export const syncColumns = () => [ // width: 120, key: 'cmd', render: (_: string, row: Record) => ( - /{genCmd(row.act)} + /{row.cmd ? row.cmd : genCmd(row.act)} ), }, { From 6fe90dea5bc90e6ba54a0ebded380aa8e653bf11 Mon Sep 17 00:00:00 2001 From: lencx Date: Sat, 24 Dec 2022 20:04:24 +0800 Subject: [PATCH 2/4] fix: path not allowed on the configured scope (#64) --- src-tauri/tauri.conf.json | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index cac5794..591e440 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -22,9 +22,7 @@ "fs": { "all": true, "scope": [ - "$HOME/.chatgpt/*", - "$HOME/.chatgpt/**", - "$HOME/.chatgpt/cache_model/*" + "*" ] } }, @@ -79,18 +77,6 @@ "https://lencx.github.io/ChatGPT/install.json" ], "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IEIxMjY4OUI5MTVFNjBEMDUKUldRRkRlWVZ1WWttc1NGWEE0RFNSb0RqdnhsekRJZTkwK2hVLzhBZTZnaHExSEZ1ZEdzWkpXTHkK" - }, - "windows": [ - { - "label": "main", - "url": "index.html", - "title": "ChatGPT", - "visible": false, - "width": 800, - "height": 600, - "minWidth": 800, - "minHeight": 600 - } - ] + } } } \ No newline at end of file From f1c7fff800a2de4e66d3d42e2b4e791dc4c37df7 Mon Sep 17 00:00:00 2001 From: lencx Date: Sat, 24 Dec 2022 20:06:56 +0800 Subject: [PATCH 3/4] readme --- README-ZH_CN.md | 6 +++--- README.md | 6 +++--- UPDATE_LOG.md | 4 ++++ 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/README-ZH_CN.md b/README-ZH_CN.md index 9706601..9fd18d0 100644 --- a/README-ZH_CN.md +++ b/README-ZH_CN.md @@ -22,9 +22,9 @@ **最新版:** -- `Mac`: [ChatGPT_0.6.4_x64.dmg](https://github.com/lencx/ChatGPT/releases/download/v0.6.4/ChatGPT_0.6.4_x64.dmg) -- `Linux`: [chat-gpt_0.6.4_amd64.deb](https://github.com/lencx/ChatGPT/releases/download/v0.6.4/chat-gpt_0.6.4_amd64.deb) -- `Windows`: [ChatGPT_0.6.4_x64_en-US.msi](https://github.com/lencx/ChatGPT/releases/download/v0.6.4/ChatGPT_0.6.4_x64_en-US.msi) +- `Mac`: [ChatGPT_0.6.5_x64.dmg](https://github.com/lencx/ChatGPT/releases/download/v0.6.5/ChatGPT_0.6.5_x64.dmg) +- `Linux`: [chat-gpt_0.6.5_amd64.deb](https://github.com/lencx/ChatGPT/releases/download/v0.6.5/chat-gpt_0.6.5_amd64.deb) +- `Windows`: [ChatGPT_0.6.5_x64_en-US.msi](https://github.com/lencx/ChatGPT/releases/download/v0.6.5/ChatGPT_0.6.5_x64_en-US.msi) [其他版本...](https://github.com/lencx/ChatGPT/releases) diff --git a/README.md b/README.md index a8e0294..55e7090 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,9 @@ **Latest:** -- `Mac`: [ChatGPT_0.6.4_x64.dmg](https://github.com/lencx/ChatGPT/releases/download/v0.6.4/ChatGPT_0.6.4_x64.dmg) -- `Linux`: [chat-gpt_0.6.4_amd64.deb](https://github.com/lencx/ChatGPT/releases/download/v0.6.4/chat-gpt_0.6.4_amd64.deb) -- `Windows`: [ChatGPT_0.6.4_x64_en-US.msi](https://github.com/lencx/ChatGPT/releases/download/v0.6.4/ChatGPT_0.6.4_x64_en-US.msi) +- `Mac`: [ChatGPT_0.6.5_x64.dmg](https://github.com/lencx/ChatGPT/releases/download/v0.6.5/ChatGPT_0.6.5_x64.dmg) +- `Linux`: [chat-gpt_0.6.5_amd64.deb](https://github.com/lencx/ChatGPT/releases/download/v0.6.5/chat-gpt_0.6.5_amd64.deb) +- `Windows`: [ChatGPT_0.6.5_x64_en-US.msi](https://github.com/lencx/ChatGPT/releases/download/v0.6.5/ChatGPT_0.6.5_x64_en-US.msi) [Other version...](https://github.com/lencx/ChatGPT/releases) diff --git a/UPDATE_LOG.md b/UPDATE_LOG.md index d07b451..0a5964c 100644 --- a/UPDATE_LOG.md +++ b/UPDATE_LOG.md @@ -1,5 +1,9 @@ # UPDATE LOG +## v0.6.5 + +fix: unable to synchronize + ## v0.6.4 fix: path not allowed on the configured scope From 413d3354c7a486d4d979e60950cbea933b9eb1f7 Mon Sep 17 00:00:00 2001 From: lencx Date: Sat, 24 Dec 2022 20:07:07 +0800 Subject: [PATCH 4/4] v0.6.5 --- src-tauri/tauri.conf.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 591e440..860fd87 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -7,7 +7,7 @@ }, "package": { "productName": "ChatGPT", - "version": "0.6.4" + "version": "0.6.5" }, "tauri": { "allowlist": {