From e77c815a868954b37bc987f35745cd0845a73151 Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Wed, 15 Apr 2026 21:49:25 +0800 Subject: [PATCH] feat: add new stores for cron, locale, providers, script, shared data, skills, and user info - Implemented `cron` store to manage scheduled tasks with CRUD operations. - Created `locale` store for language settings with persistence and system language detection. - Added `providers` store to handle provider accounts and configurations with API interactions. - Developed `script` store for managing automation scripts, including recording and execution. - Introduced `sharedStore` for managing shared data across components. - Established `skills` store for fetching, installing, and managing skills from a marketplace. - Created `userinfo` store for user authentication and session management. chore: update path aliases from `@store` to `@stores` in TypeScript configuration and Vite config --- dist-electron/main/main.js | 9 +- dist-electron/preload/preload.js | 119 +++++++++++++++++- global.d.ts | 2 +- src/App.vue | 2 +- src/components/TaskList/List.vue | 74 ----------- src/components/TaskList/index.vue | 43 ++++--- src/composables/useLocale.ts | 2 +- .../agents/components/ProvidersSettings.vue | 2 +- src/pages/cron/index.vue | 2 +- src/pages/home/ChatBox.vue | 4 +- src/pages/home/ChatHistory.vue | 2 +- src/pages/home/components/Task.vue | 23 ++-- .../home/components/chat/ChatMessage.vue | 2 +- src/pages/home/index.vue | 8 +- src/pages/login/index.vue | 4 +- .../scripts/components/ScriptEditorDialog.vue | 2 +- src/pages/scripts/index.vue | 2 +- .../setting/components/Version/index.vue | 2 +- .../skills/components/MarketplaceDrawer.vue | 2 +- .../skills/components/SkillDetailDrawer.vue | 2 +- src/pages/skills/index.vue | 2 +- src/{store => stores}/chat.ts | 2 +- src/{store => stores}/cron.ts | 0 src/{store => stores}/locale.ts | 0 src/{store => stores}/providers.ts | 0 src/{store => stores}/script.ts | 0 src/{store => stores}/sharedStore.ts | 0 src/{store => stores}/skills.ts | 0 src/{store => stores}/userinfo.ts | 0 tsconfig.app.json | 2 +- tsconfig.json | 2 +- vite.config.ts | 4 +- 32 files changed, 192 insertions(+), 128 deletions(-) delete mode 100644 src/components/TaskList/List.vue rename src/{store => stores}/chat.ts (99%) rename src/{store => stores}/cron.ts (100%) rename src/{store => stores}/locale.ts (100%) rename src/{store => stores}/providers.ts (100%) rename src/{store => stores}/script.ts (100%) rename src/{store => stores}/sharedStore.ts (100%) rename src/{store => stores}/skills.ts (100%) rename src/{store => stores}/userinfo.ts (100%) diff --git a/dist-electron/main/main.js b/dist-electron/main/main.js index a8c04dd..2a3e22d 100644 --- a/dist-electron/main/main.js +++ b/dist-electron/main/main.js @@ -1,2 +1,7 @@ -require('bytenode') -require('./main.jsc') \ No newline at end of file +"use strict"; +require("electron"); +require("./main-D4EDpIiu.js"); +require("electron-squirrel-startup"); +require("electron-log"); +require("bytenode"); +require("axios"); diff --git a/dist-electron/preload/preload.js b/dist-electron/preload/preload.js index fbd36fb..d7b783e 100644 --- a/dist-electron/preload/preload.js +++ b/dist-electron/preload/preload.js @@ -1 +1,118 @@ -"use strict";const i=require("electron");var n=(e=>(e.EXTERNAL_OPEN="external-open",e.APP_SET_FRAMELESS="app:set-frameless",e.APP_LOAD_PAGE="app:load-page",e.TAB_CREATE="tab:create",e.TAB_LIST="tab:list",e.TAB_NAVIGATE="tab:navigate",e.TAB_RELOAD="tab:reload",e.TAB_BACK="tab:back",e.TAB_FORWARD="tab:forward",e.TAB_SWITCH="tab:switch",e.TAB_CLOSE="tab:close",e.LOG_TO_MAIN="log-to-main",e.READ_FILE="read-file",e.INVOKE="ipc:invoke",e.INVOKE_ASYNC="ipc:invokeAsync",e.APP_MINIMIZE="app:minimize",e.APP_MAXIMIZE="app:maximize",e.APP_QUIT="app:quit",e.FILE_READ="file:read",e.FILE_WRITE="file:write",e.GET_WINDOW_ID="get-window-id",e.CUSTOM_EVENT="custom:event",e.TIME_UPDATE="time:update",e.RENDERER_IS_READY="renderer-ready",e.SHOW_CONTEXT_MENU="show-context-menu",e.START_A_DIALOGUE="start-a-dialogue",e.OPEN_WINDOW="open-window",e.LOG_DEBUG="log-debug",e.LOG_INFO="log-info",e.LOG_WARN="log-warn",e.LOG_ERROR="log-error",e.CONFIG_UPDATED="config-updated",e.SET_CONFIG="set-config",e.GET_CONFIG="get-config",e.UPDATE_CONFIG="update-config",e.SET_THEME_MODE="set-theme-mode",e.GET_THEME_MODE="get-theme-mode",e.IS_DARK_THEME="is-dark-theme",e.THEME_MODE_UPDATED="theme-mode-updated",e.EXECUTE_SCRIPT="execute-script",e.OPEN_CHANNEL="open-channel",e.SCRIPT_LIST="script:list",e.SCRIPT_GET="script:get",e.SCRIPT_SAVE="script:save",e.SCRIPT_DELETE="script:delete",e.SCRIPT_TOGGLE="script:toggle",e.SCRIPT_RUN="script:run",e.SCRIPT_RECORD_START="script:record-start",e.SCRIPT_RECORD_STOP="script:record-stop",e.SCRIPT_CODEGEN="script:codegen",e.GATEWAY_RPC="gateway:rpc",e.GATEWAY_EVENT="gateway:event",e.UPDATE_CHECK="update:check",e.UPDATE_DOWNLOAD="update:download",e.UPDATE_INSTALL="update:install",e.UPDATE_VERSION="update:version",e.UPDATE_STATUS_CHANGED="update:status-changed",e))(n||{});const t={versions:process.versions,external:{open:e=>i.ipcRenderer.invoke("external-open",e)},platform:process.platform,windowMinimize:()=>i.ipcRenderer.invoke("window:minimize"),windowMaximize:()=>i.ipcRenderer.invoke("window:maximize"),windowClose:()=>i.ipcRenderer.invoke("window:close"),windowIsMaximized:()=>i.ipcRenderer.invoke("window:isMaximized"),viewIsReady:()=>i.ipcRenderer.send(n.RENDERER_IS_READY),app:{setFrameless:e=>i.ipcRenderer.invoke(n.APP_SET_FRAMELESS,e),loadPage:e=>i.ipcRenderer.invoke(n.APP_LOAD_PAGE,e)},readFile:e=>i.ipcRenderer.invoke(n.READ_FILE,e),invoke:(e,...r)=>i.ipcRenderer.invoke(e,...r),invokeAsync:(e,...r)=>i.ipcRenderer.invoke(e,...r),on:(e,r)=>{const o=(d,...R)=>r(...R);return i.ipcRenderer.on(e,o),()=>i.ipcRenderer.removeListener(e,o)},send:(e,...r)=>i.ipcRenderer.send(e,...r),getCurrentWindowId:()=>i.ipcRenderer.sendSync(n.GET_WINDOW_ID),logger:{debug:(e,...r)=>i.ipcRenderer.send(n.LOG_DEBUG,e,...r),info:(e,...r)=>i.ipcRenderer.send(n.LOG_INFO,e,...r),warn:(e,...r)=>i.ipcRenderer.send(n.LOG_WARN,e,...r),error:(e,...r)=>i.ipcRenderer.send(n.LOG_ERROR,e,...r)},executeScript:e=>i.ipcRenderer.invoke(n.EXECUTE_SCRIPT,e),openChannel:e=>i.ipcRenderer.invoke(n.OPEN_CHANNEL,e),scriptApi:{list:()=>i.ipcRenderer.invoke(n.SCRIPT_LIST),get:e=>i.ipcRenderer.invoke(n.SCRIPT_GET,e),save:e=>i.ipcRenderer.invoke(n.SCRIPT_SAVE,e),delete:e=>i.ipcRenderer.invoke(n.SCRIPT_DELETE,e),toggle:(e,r)=>i.ipcRenderer.invoke(n.SCRIPT_TOGGLE,e,r),run:e=>i.ipcRenderer.invoke(n.SCRIPT_RUN,e),startRecording:e=>i.ipcRenderer.invoke(n.SCRIPT_RECORD_START,e),stopRecording:()=>i.ipcRenderer.invoke(n.SCRIPT_RECORD_STOP),codegen:(e,r)=>i.ipcRenderer.invoke(n.SCRIPT_CODEGEN,e,r)}};i.contextBridge.exposeInMainWorld("api",t); +"use strict"; +const electron = require("electron"); +var IPC_EVENTS = /* @__PURE__ */ ((IPC_EVENTS2) => { + IPC_EVENTS2["EXTERNAL_OPEN"] = "external-open"; + IPC_EVENTS2["APP_SET_FRAMELESS"] = "app:set-frameless"; + IPC_EVENTS2["APP_LOAD_PAGE"] = "app:load-page"; + IPC_EVENTS2["TAB_CREATE"] = "tab:create"; + IPC_EVENTS2["TAB_LIST"] = "tab:list"; + IPC_EVENTS2["TAB_NAVIGATE"] = "tab:navigate"; + IPC_EVENTS2["TAB_RELOAD"] = "tab:reload"; + IPC_EVENTS2["TAB_BACK"] = "tab:back"; + IPC_EVENTS2["TAB_FORWARD"] = "tab:forward"; + IPC_EVENTS2["TAB_SWITCH"] = "tab:switch"; + IPC_EVENTS2["TAB_CLOSE"] = "tab:close"; + IPC_EVENTS2["LOG_TO_MAIN"] = "log-to-main"; + IPC_EVENTS2["READ_FILE"] = "read-file"; + IPC_EVENTS2["INVOKE"] = "ipc:invoke"; + IPC_EVENTS2["INVOKE_ASYNC"] = "ipc:invokeAsync"; + IPC_EVENTS2["APP_MINIMIZE"] = "app:minimize"; + IPC_EVENTS2["APP_MAXIMIZE"] = "app:maximize"; + IPC_EVENTS2["APP_QUIT"] = "app:quit"; + IPC_EVENTS2["FILE_READ"] = "file:read"; + IPC_EVENTS2["FILE_WRITE"] = "file:write"; + IPC_EVENTS2["GET_WINDOW_ID"] = "get-window-id"; + IPC_EVENTS2["CUSTOM_EVENT"] = "custom:event"; + IPC_EVENTS2["TIME_UPDATE"] = "time:update"; + IPC_EVENTS2["RENDERER_IS_READY"] = "renderer-ready"; + IPC_EVENTS2["SHOW_CONTEXT_MENU"] = "show-context-menu"; + IPC_EVENTS2["START_A_DIALOGUE"] = "start-a-dialogue"; + IPC_EVENTS2["OPEN_WINDOW"] = "open-window"; + IPC_EVENTS2["LOG_DEBUG"] = "log-debug"; + IPC_EVENTS2["LOG_INFO"] = "log-info"; + IPC_EVENTS2["LOG_WARN"] = "log-warn"; + IPC_EVENTS2["LOG_ERROR"] = "log-error"; + IPC_EVENTS2["CONFIG_UPDATED"] = "config-updated"; + IPC_EVENTS2["SET_CONFIG"] = "set-config"; + IPC_EVENTS2["GET_CONFIG"] = "get-config"; + IPC_EVENTS2["UPDATE_CONFIG"] = "update-config"; + IPC_EVENTS2["SET_THEME_MODE"] = "set-theme-mode"; + IPC_EVENTS2["GET_THEME_MODE"] = "get-theme-mode"; + IPC_EVENTS2["IS_DARK_THEME"] = "is-dark-theme"; + IPC_EVENTS2["THEME_MODE_UPDATED"] = "theme-mode-updated"; + IPC_EVENTS2["EXECUTE_SCRIPT"] = "execute-script"; + IPC_EVENTS2["OPEN_CHANNEL"] = "open-channel"; + IPC_EVENTS2["SCRIPT_LIST"] = "script:list"; + IPC_EVENTS2["SCRIPT_GET"] = "script:get"; + IPC_EVENTS2["SCRIPT_SAVE"] = "script:save"; + IPC_EVENTS2["SCRIPT_DELETE"] = "script:delete"; + IPC_EVENTS2["SCRIPT_TOGGLE"] = "script:toggle"; + IPC_EVENTS2["SCRIPT_RUN"] = "script:run"; + IPC_EVENTS2["SCRIPT_RECORD_START"] = "script:record-start"; + IPC_EVENTS2["SCRIPT_RECORD_STOP"] = "script:record-stop"; + IPC_EVENTS2["SCRIPT_CODEGEN"] = "script:codegen"; + IPC_EVENTS2["GATEWAY_RPC"] = "gateway:rpc"; + IPC_EVENTS2["GATEWAY_EVENT"] = "gateway:event"; + IPC_EVENTS2["UPDATE_CHECK"] = "update:check"; + IPC_EVENTS2["UPDATE_DOWNLOAD"] = "update:download"; + IPC_EVENTS2["UPDATE_INSTALL"] = "update:install"; + IPC_EVENTS2["UPDATE_VERSION"] = "update:version"; + IPC_EVENTS2["UPDATE_STATUS_CHANGED"] = "update:status-changed"; + return IPC_EVENTS2; +})(IPC_EVENTS || {}); +const api = { + versions: process.versions, + external: { + open: (url) => electron.ipcRenderer.invoke("external-open", url) + }, + platform: process.platform, + windowMinimize: () => electron.ipcRenderer.invoke("window:minimize"), + windowMaximize: () => electron.ipcRenderer.invoke("window:maximize"), + windowClose: () => electron.ipcRenderer.invoke("window:close"), + windowIsMaximized: () => electron.ipcRenderer.invoke("window:isMaximized"), + viewIsReady: () => electron.ipcRenderer.send(IPC_EVENTS.RENDERER_IS_READY), + app: { + setFrameless: (route) => electron.ipcRenderer.invoke(IPC_EVENTS.APP_SET_FRAMELESS, route), + loadPage: (page) => electron.ipcRenderer.invoke(IPC_EVENTS.APP_LOAD_PAGE, page) + }, + // 通过 IPC 调用主进程 + readFile: (filePath) => electron.ipcRenderer.invoke(IPC_EVENTS.READ_FILE, filePath), + // 异步调用(映射为 electron 的 invoke) + invoke: (channel, ...args) => electron.ipcRenderer.invoke(channel, ...args), + // 异步调用(为了兼容老代码) + invokeAsync: (channel, ...args) => electron.ipcRenderer.invoke(channel, ...args), + // 监听主进程消息 + on: (event, callback) => { + const subscription = (_event, ...args) => callback(...args); + electron.ipcRenderer.on(event, subscription); + return () => electron.ipcRenderer.removeListener(event, subscription); + }, + // 发送消息到主进程 + send: (channel, ...args) => electron.ipcRenderer.send(channel, ...args), + // 获取窗口ID + getCurrentWindowId: () => electron.ipcRenderer.sendSync(IPC_EVENTS.GET_WINDOW_ID), + // 发送日志 + logger: { + debug: (message, ...meta) => electron.ipcRenderer.send(IPC_EVENTS.LOG_DEBUG, message, ...meta), + info: (message, ...meta) => electron.ipcRenderer.send(IPC_EVENTS.LOG_INFO, message, ...meta), + warn: (message, ...meta) => electron.ipcRenderer.send(IPC_EVENTS.LOG_WARN, message, ...meta), + error: (message, ...meta) => electron.ipcRenderer.send(IPC_EVENTS.LOG_ERROR, message, ...meta) + }, + // 执行脚本 + executeScript: (params) => electron.ipcRenderer.invoke(IPC_EVENTS.EXECUTE_SCRIPT, params), + // 打开渠道 + openChannel: (channels) => electron.ipcRenderer.invoke(IPC_EVENTS.OPEN_CHANNEL, channels), + // 脚本管理 + scriptApi: { + list: () => electron.ipcRenderer.invoke(IPC_EVENTS.SCRIPT_LIST), + get: (id) => electron.ipcRenderer.invoke(IPC_EVENTS.SCRIPT_GET, id), + save: (input) => electron.ipcRenderer.invoke(IPC_EVENTS.SCRIPT_SAVE, input), + delete: (id) => electron.ipcRenderer.invoke(IPC_EVENTS.SCRIPT_DELETE, id), + toggle: (id, enabled) => electron.ipcRenderer.invoke(IPC_EVENTS.SCRIPT_TOGGLE, id, enabled), + run: (id) => electron.ipcRenderer.invoke(IPC_EVENTS.SCRIPT_RUN, id), + startRecording: (url) => electron.ipcRenderer.invoke(IPC_EVENTS.SCRIPT_RECORD_START, url), + stopRecording: () => electron.ipcRenderer.invoke(IPC_EVENTS.SCRIPT_RECORD_STOP), + codegen: (id, url) => electron.ipcRenderer.invoke(IPC_EVENTS.SCRIPT_CODEGEN, id, url) + } +}; +electron.contextBridge.exposeInMainWorld("api", api); diff --git a/global.d.ts b/global.d.ts index 3f03ede..162dd9a 100644 --- a/global.d.ts +++ b/global.d.ts @@ -221,7 +221,7 @@ declare module "*.vue" { export default component } -declare module "@store/*"; +declare module "@stores/*"; declare module "@service/*"; declare module "@utils/*"; declare module "@assets/images/*"; diff --git a/src/App.vue b/src/App.vue index e9028df..cdf246c 100644 --- a/src/App.vue +++ b/src/App.vue @@ -9,7 +9,7 @@ - - \ No newline at end of file diff --git a/src/components/TaskList/index.vue b/src/components/TaskList/index.vue index 85dc920..25f7158 100644 --- a/src/components/TaskList/index.vue +++ b/src/components/TaskList/index.vue @@ -1,25 +1,38 @@ diff --git a/src/composables/useLocale.ts b/src/composables/useLocale.ts index 9e046b3..533571b 100644 --- a/src/composables/useLocale.ts +++ b/src/composables/useLocale.ts @@ -1,5 +1,5 @@ import { useI18n } from 'vue-i18n'; -import { useLocaleStore } from '@src/store/locale'; +import { useLocaleStore } from '@src/stores/locale'; import { SUPPORTED_LANGUAGES, type LanguageCode, type Namespace } from '@src/i18n/constants'; /** diff --git a/src/pages/agents/components/ProvidersSettings.vue b/src/pages/agents/components/ProvidersSettings.vue index 11d8177..05ac8f9 100644 --- a/src/pages/agents/components/ProvidersSettings.vue +++ b/src/pages/agents/components/ProvidersSettings.vue @@ -192,7 +192,7 @@ import { ref, computed, onMounted } from 'vue'; import { useI18n } from 'vue-i18n'; import { Plus, Loading, Check, Warning, Close, TopRight } from '@element-plus/icons-vue'; import { ElMessage } from 'element-plus'; -import { useProviderStore } from '@src/store/providers'; +import { useProviderStore } from '@src/stores/providers'; import { PROVIDER_TYPE_INFO, type ProviderTypeInfo } from '@lib/providers'; import type { ProviderListItem } from '@lib/provider-accounts'; diff --git a/src/pages/cron/index.vue b/src/pages/cron/index.vue index a1467bd..b2f96cf 100644 --- a/src/pages/cron/index.vue +++ b/src/pages/cron/index.vue @@ -115,7 +115,7 @@ import { RiErrorWarningLine, RiTimeLine, } from '@remixicon/vue'; -import { useCronStore } from '@src/store/cron'; +import { useCronStore } from '@src/stores/cron'; import type { CronJob, CronJobCreateInput } from '@lib/cron-types'; import CronStats from './components/CronStats.vue'; import CronJobCard from './components/CronJobCard.vue'; diff --git a/src/pages/home/ChatBox.vue b/src/pages/home/ChatBox.vue index 49c7dad..b7b8770 100644 --- a/src/pages/home/ChatBox.vue +++ b/src/pages/home/ChatBox.vue @@ -49,8 +49,8 @@