From 66db6c462ea87febdfe497208cf6f80c28ff3d41 Mon Sep 17 00:00:00 2001 From: duanshuwen Date: Sun, 12 Apr 2026 22:12:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E8=84=9A=E6=9C=AC=E5=BD=95=E5=88=B6?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dist-electron/main/main.js | 155 ++++++++++++------ dist-electron/main/main.js.bak | 5 +- dist-electron/main/main.jsc | Bin 111944 -> 134184 bytes dist-electron/preload/preload.js | 4 +- dist/index.html | 4 +- electron/preload/index.ts | 1 + electron/process/runTaskOperationService.ts | 103 +++++++++++- electron/scripts/scripts.meta.json | 7 +- .../service/script-recorder-service/index.ts | 56 ------- global.d.ts | 5 + src/lib/constants.ts | 1 + src/lib/script-api.ts | 2 + .../scripts/components/ScriptCreateDialog.vue | 6 +- src/pages/scripts/index.vue | 13 +- src/store/script.ts | 15 ++ vite.config.ts | 9 + 16 files changed, 262 insertions(+), 124 deletions(-) delete mode 100644 electron/service/script-recorder-service/index.ts diff --git a/dist-electron/main/main.js b/dist-electron/main/main.js index 5e08ac0..9900f36 100644 --- a/dist-electron/main/main.js +++ b/dist-electron/main/main.js @@ -1,4 +1,26 @@ "use strict"; +var __create = Object.create; +var __defProp = Object.defineProperty; +var __getOwnPropDesc = Object.getOwnPropertyDescriptor; +var __getOwnPropNames = Object.getOwnPropertyNames; +var __getProtoOf = Object.getPrototypeOf; +var __hasOwnProp = Object.prototype.hasOwnProperty; +var __copyProps = (to, from, except, desc) => { + if (from && typeof from === "object" || typeof from === "function") { + for (let key of __getOwnPropNames(from)) + if (!__hasOwnProp.call(to, key) && key !== except) + __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); + } + return to; +}; +var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( + // If the importer is in node compatibility mode or this is not an ESM + // file that has been converted to a CommonJS file using a Babel- + // compatible transform (i.e. "__esModule" has not been set), then set + // "default" to the CommonJS "module.exports" for node compatibility. + isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, + mod +)); const electron = require("electron"); const OpenAI = require("openai"); const util = require("util"); @@ -13,7 +35,6 @@ const net = require("net"); const http = require("http"); const child_process = require("child_process"); const events = require("events"); -const playwright = require("playwright"); require("bytenode"); const electronUpdater = require("electron-updater"); function _interopNamespaceDefault(e) { @@ -88,6 +109,7 @@ var IPC_EVENTS = /* @__PURE__ */ ((IPC_EVENTS2) => { 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["UPDATE_CHECK"] = "update:check"; IPC_EVENTS2["UPDATE_DOWNLOAD"] = "update:download"; IPC_EVENTS2["UPDATE_INSTALL"] = "update:install"; @@ -793,7 +815,7 @@ class WindowService { } _loadPage(window2, pageName) { { - return window2.loadURL(`${"http://localhost:5173"}/${pageName}.html`); + return window2.loadURL(`${"http://localhost:5173/"}/${pageName}.html`); } } _loadWindowTemplate(window2, name) { @@ -1702,59 +1724,15 @@ async function runScriptById(id, channel) { }); return result; } -let recorderBrowser = null; -let recorderContext = null; -async function startRecording(url) { - try { - await launchLocalChrome(); - if (recorderBrowser) { - await stopRecording(); - } - recorderBrowser = await playwright.chromium.connectOverCDP("http://127.0.0.1:9222"); - recorderContext = recorderBrowser.contexts()[0] || await recorderBrowser.newContext(); - const page = await recorderContext.newPage(); - const targetUrl = url || "about:blank"; - await page.goto(targetUrl, { waitUntil: "domcontentloaded" }); - await page.pause(); - return { - success: true, - code: "" - }; - } catch (error) { - log.error("[script-recorder-service] Failed to start recording:", error); - return { - success: false, - error: error?.message || "Failed to start recording" - }; - } -} -async function stopRecording() { - try { - if (recorderContext) { - await recorderContext.close().catch(() => { - }); - recorderContext = null; - } - if (recorderBrowser) { - await recorderBrowser.close().catch(() => { - }); - recorderBrowser = null; - } - return { success: true, code: "" }; - } catch (error) { - log.error("[script-recorder-service] Failed to stop recording:", error); - return { - success: false, - error: error?.message || "Failed to stop recording" - }; - } -} const openedTabIndexByChannelName = /* @__PURE__ */ new Map(); function getScriptsDir() { return electron.app.isPackaged ? path.join(__dirname, "scripts") : path.join(process.cwd(), "electron/scripts"); } function runTaskOperationService() { const executeScriptServiceInstance = new executeScriptService(); + const playwrightCoreDir = path.dirname(require.resolve("playwright-core")); + const cliPath = path.join(playwrightCoreDir, "cli.js"); + let recorderProc = null; electron.ipcMain.handle(IPC_EVENTS.SCRIPT_LIST, async () => { try { return listScripts(); @@ -1806,7 +1784,29 @@ function runTaskOperationService() { }); electron.ipcMain.handle(IPC_EVENTS.SCRIPT_RECORD_START, async (_event, url) => { try { - return await startRecording(url); + if (recorderProc) { + recorderProc.kill("SIGINT"); + recorderProc = null; + } + const targetUrl = url || "about:blank"; + recorderProc = child_process.spawn(process.execPath, [cliPath, "codegen", "--target", "javascript", "--channel", "chrome", "--viewport-size", "1920,1080", "--color-scheme", "light", targetUrl], { + env: { ...process.env, ELECTRON_RUN_AS_NODE: "1" }, + stdio: "pipe" + }); + recorderProc.on("error", (err) => { + log.error("[SCRIPT_RECORD_START] Failed to start codegen process:", err); + }); + recorderProc.on("exit", (code, signal) => { + log.info(`[SCRIPT_RECORD_START] Process exited code=${code} signal=${signal}`); + recorderProc = null; + }); + recorderProc.stdout?.on("data", (data) => { + log.info(`[SCRIPT_RECORD_START] stdout: ${data.toString()}`); + }); + recorderProc.stderr?.on("data", (data) => { + log.error(`[SCRIPT_RECORD_START] stderr: ${data.toString()}`); + }); + return { success: true }; } catch (error) { log.error("[SCRIPT_RECORD_START] error:", error); return { success: false, error: error?.message || "Recording start failed" }; @@ -1814,12 +1814,65 @@ function runTaskOperationService() { }); electron.ipcMain.handle(IPC_EVENTS.SCRIPT_RECORD_STOP, async () => { try { - return await stopRecording(); + if (recorderProc) { + recorderProc.kill("SIGINT"); + recorderProc = null; + } + return { success: true, code: "" }; } catch (error) { log.error("[SCRIPT_RECORD_STOP] error:", error); return { success: false, error: error?.message || "Recording stop failed" }; } }); + electron.ipcMain.handle(IPC_EVENTS.SCRIPT_CODEGEN, async (_event, id, url) => { + try { + const script = getScript(id); + if (!script) { + return { success: false, error: "Script not found" }; + } + const scriptsDir = getScriptsDir(); + const scriptPath = path.join(scriptsDir, script.filename); + const targetUrl = url || "about:blank"; + log.info(`[SCRIPT_CODEGEN] Starting codegen for script ${id} at ${scriptPath} with url ${targetUrl}`); + return await new Promise((resolve) => { + const proc = child_process.spawn(process.execPath, [cliPath, "codegen", "--target", "javascript", "--channel", "chrome", "-o", scriptPath, targetUrl], { + env: { ...process.env, ELECTRON_RUN_AS_NODE: "1" }, + stdio: "pipe" + }); + proc.on("exit", () => { + try { + let generatedCode = fs.readFileSync(scriptPath, "utf-8"); + if (generatedCode.includes("require('playwright')") && !generatedCode.includes("createRequire")) { + generatedCode = `import { createRequire } from 'node:module'; +const require = createRequire(import.meta.url); + +${generatedCode}`; + } + fs.writeFileSync(scriptPath, generatedCode, "utf-8"); + saveScript({ + id, + name: script.name, + description: script.description, + code: generatedCode, + channel: script.channel, + enabled: script.enabled + }); + resolve({ success: true, code: generatedCode }); + } catch (err) { + log.error("[SCRIPT_CODEGEN] Failed to process generated code:", err); + resolve({ success: false, error: err?.message || "Failed to process generated code" }); + } + }); + proc.on("error", (err) => { + log.error("[SCRIPT_CODEGEN] Failed to start codegen:", err); + resolve({ success: false, error: err.message }); + }); + }); + } catch (error) { + log.error("[SCRIPT_CODEGEN] error:", error); + return { success: false, error: error?.message || "Codegen failed" }; + } + }); electron.ipcMain.handle(IPC_EVENTS.OPEN_CHANNEL, async (_event, channels) => { try { await launchLocalChrome(); diff --git a/dist-electron/main/main.js.bak b/dist-electron/main/main.js.bak index 6995c38..9e75660 100644 --- a/dist-electron/main/main.js.bak +++ b/dist-electron/main/main.js.bak @@ -1 +1,4 @@ -"use strict";const s=require("electron"),ae=require("openai"),$=require("util"),h=require("electron-log"),U=require("path"),ee=require("fs"),te=require("js-base64"),C=require("node:path"),ce=require("crypto"),le=require("electron-squirrel-startup"),de=require("net"),ue=require("http"),he=require("child_process"),pe=require("events");require("bytenode");const y=require("electron-updater");function ne(n){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const t in n)if(t!=="default"){const i=Object.getOwnPropertyDescriptor(n,t);Object.defineProperty(e,t,i.get?i:{enumerable:!0,get:()=>n[t]})}}return e.default=n,Object.freeze(e)}const S=ne(U),v=ne(ee);var r=(n=>(n.EXTERNAL_OPEN="external-open",n.WINDOW_MINIMIZE="window-minimize",n.WINDOW_MAXIMIZE="window-maximize",n.WINDOW_CLOSE="window-close",n.IS_WINDOW_MAXIMIZED="is-window-maximized",n.APP_SET_FRAMELESS="app:set-frameless",n.APP_LOAD_PAGE="app:load-page",n.TAB_CREATE="tab:create",n.TAB_LIST="tab:list",n.TAB_NAVIGATE="tab:navigate",n.TAB_RELOAD="tab:reload",n.TAB_BACK="tab:back",n.TAB_FORWARD="tab:forward",n.TAB_SWITCH="tab:switch",n.TAB_CLOSE="tab:close",n.LOG_TO_MAIN="log-to-main",n.READ_FILE="read-file",n.INVOKE="ipc:invoke",n.INVOKE_ASYNC="ipc:invokeAsync",n.APP_MINIMIZE="app:minimize",n.APP_MAXIMIZE="app:maximize",n.APP_QUIT="app:quit",n.FILE_READ="file:read",n.FILE_WRITE="file:write",n.GET_WINDOW_ID="get-window-id",n.CUSTOM_EVENT="custom:event",n.TIME_UPDATE="time:update",n.RENDERER_IS_READY="renderer-ready",n.SHOW_CONTEXT_MENU="show-context-menu",n.START_A_DIALOGUE="start-a-dialogue",n.OPEN_WINDOW="open-window",n.LOG_DEBUG="log-debug",n.LOG_INFO="log-info",n.LOG_WARN="log-warn",n.LOG_ERROR="log-error",n.CONFIG_UPDATED="config-updated",n.SET_CONFIG="set-config",n.GET_CONFIG="get-config",n.UPDATE_CONFIG="update-config",n.SET_THEME_MODE="set-theme-mode",n.GET_THEME_MODE="get-theme-mode",n.IS_DARK_THEME="is-dark-theme",n.THEME_MODE_UPDATED="theme-mode-updated",n.EXECUTE_SCRIPT="execute-script",n.OPEN_CHANNEL="open-channel",n.UPDATE_CHECK="update:check",n.UPDATE_DOWNLOAD="update:download",n.UPDATE_INSTALL="update:install",n.UPDATE_VERSION="update:version",n.UPDATE_STATUS_CHANGED="update:status-changed",n))(r||{});const ie={width:1440,height:900,minWidth:1440,minHeight:900};var w=(n=>(n.MAIN="main",n.SETTING="setting",n.DIALOG="dialog",n.LOADING="loading",n))(w||{}),g=(n=>(n.THEME_MODE="themeMode",n.PRIMARY_COLOR="primaryColor",n.LANGUAGE="language",n.FONT_SIZE="fontSize",n.MINIMIZE_TO_TRAY="minimizeToTray",n.PROVIDER="provider",n.DEFAULT_MODEL="defaultModel",n.AUTO_CHECK_UPDATE="autoCheckUpdate",n.AUTO_DOWNLOAD_UPDATE="autoDownloadUpdate",n))(g||{}),E=(n=>(n.CONVERSATION_ITEM="conversation-item",n.CONVERSATION_LIST="conversation-list",n.MESSAGE_ITEM="message-item",n))(E||{}),D=(n=>(n.PIN="pin",n.RENAME="rename",n.DEL="del",n))(D||{}),_=(n=>(n.NEW_CONVERSATION="newConversation",n.SORT_BY="sortBy",n.SORT_BY_CREATE_TIME="sortByCreateTime",n.SORT_BY_UPDATE_TIME="sortByUpdateTime",n.SORT_BY_NAME="sortByName",n.SORT_BY_MODEL="sortByModel",n.SORT_ASCENDING="sortAscending",n.SORT_DESCENDING="sortDescending",n.BATCH_OPERATIONS="batchOperations",n))(_||{}),O=(n=>(n.COPY="copy",n.DELETE="delete",n.SELECT="select",n))(O||{});class ge{}const fe=$.promisify(v.readdir),_e=$.promisify(v.stat),me=$.promisify(v.unlink);class z{static _instance;LOG_RETENTION_DAYS=7;CLEANUP_INTERVAL_MS=1440*60*1e3;constructor(){const e=S.join(s.app.getPath("userData"),"logs");try{v.existsSync(e)||v.mkdirSync(e,{recursive:!0})}catch(t){this.error("Failed to create log directory:",t)}h.transports.file.resolvePathFn=()=>{const t=new Date,i=`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")}`;return S.join(e,`${i}.log`)},h.transports.file.format="[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}] {text}",h.transports.file.maxSize=10*1024*1024,h.transports.console.level=process.env.NODE_ENV==="development"?"debug":"info",h.transports.file.level="debug",this._setupIpcEvents(),this._rewriteConsole(),this.info("LogService initialized successfully."),this._cleanupOldLogs(),setInterval(()=>this._cleanupOldLogs(),this.CLEANUP_INTERVAL_MS)}_setupIpcEvents(){s.ipcMain.on(r.LOG_DEBUG,(e,t,...i)=>this.debug(t,...i)),s.ipcMain.on(r.LOG_INFO,(e,t,...i)=>this.info(t,...i)),s.ipcMain.on(r.LOG_WARN,(e,t,...i)=>this.warn(t,...i)),s.ipcMain.on(r.LOG_ERROR,(e,t,...i)=>this.error(t,...i))}_rewriteConsole(){console.debug=h.debug,console.log=h.info,console.info=h.info,console.warn=h.warn,console.error=h.error}async _cleanupOldLogs(){try{const e=S.join(s.app.getPath("userData"),"logs");if(!v.existsSync(e))return;const t=new Date,i=new Date(t.getTime()-this.LOG_RETENTION_DAYS*24*60*60*1e3),o=await fe(e);let a=0;for(const c of o){if(!c.endsWith(".log"))continue;const d=S.join(e,c);try{const f=await _e(d);f.isFile()&&f.birthtime0&&this.info(`Successfully cleaned up ${a} old log files.`)}catch(e){this.error("Failed to cleanup old logs:",e)}}static getInstance(){return this._instance||(this._instance=new z),this._instance}debug(e,...t){h.debug(e,...t)}info(e,...t){h.info(e,...t)}warn(e,...t){h.warn(e,...t)}error(e,...t){h.error(e,...t)}logApiRequest(e,t={},i="POST"){this.info(`API Request: ${e}, Method: ${i}, Request: ${JSON.stringify(t)}`)}logApiResponse(e,t={},i=200,o=0){i>=400?this.error(`API Error Response: ${e}, Status: ${i}, Response Time: ${o}ms, Response: ${JSON.stringify(t)}`):this.debug(`API Response: ${e}, Status: ${i}, Response Time: ${o}ms, Response: ${JSON.stringify(t)}`)}logUserOperation(e,t="unknown",i={}){this.info(`User Operation: ${e} by ${t}, Details: ${JSON.stringify(i)}`)}}const u=z.getInstance();function we(n){const e=n.choices[0];return{isEnd:e?.finish_reason==="stop",result:e?.delta?.content??""}}class Ae extends ge{client;constructor(e,t){super(),this.client=new ae({apiKey:e,baseURL:t})}async chat(e,t){const i=Date.now(),o=e[e.length-1];u.logApiRequest("chat.completions.create",{model:t,lastMessage:o?.content?.substring(0,100)+(o?.content?.length>100?"...":""),messageCount:e.length},"POST");try{const a=await this.client.chat.completions.create({model:t,messages:e,stream:!0}),c=Date.now()-i;return u.logApiResponse("chat.completions.create",{success:!0},200,c),{async*[Symbol.asyncIterator](){for await(const d of a)yield we(d)}}}catch(a){const c=Date.now()-i;throw u.logApiResponse("chat.completions.create",{error:a instanceof Error?a.message:String(a)},500,c),a}}}function se(n,e){let t=null;return function(...i){t&&clearTimeout(t),t=setTimeout(()=>{n.apply(this,i)},e)}}function G(n){if(n===null||typeof n!="object")return n;if(Array.isArray(n))return n.map(t=>G(t));const e=Object.assign({},n);for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(e[t]=G(e[t]));return e}function Te(n){try{return JSON.parse(JSON.stringify(n))}catch(e){return console.error("simpleCloneDeep failed:",e),n}}function ye(n){try{return JSON.parse(te.decode(n))}catch(e){return console.error("parseOpenAISetting failed:",e),{}}}const Ee={[g.THEME_MODE]:"system",[g.PRIMARY_COLOR]:"#BB5BE7",[g.LANGUAGE]:"zh",[g.FONT_SIZE]:14,[g.MINIMIZE_TO_TRAY]:!1,[g.PROVIDER]:"",[g.DEFAULT_MODEL]:null};class F{static _instance;_config;_configPath;_defaultConfig=Ee;_listeners=[];constructor(){this._configPath=S.join(s.app.getPath("userData"),"config.json"),this._config=this._loadConfig(),this._setupIpcEvents(),u.info("ConfigService initialized successfully.")}_setupIpcEvents(){const t=se(i=>this.update(i),200);s.ipcMain.handle(r.GET_CONFIG,(i,o)=>this.get(o)),s.ipcMain.on(r.SET_CONFIG,(i,o,a)=>this.set(o,a)),s.ipcMain.on(r.UPDATE_CONFIG,(i,o)=>t(o))}static getInstance(){return this._instance||(this._instance=new F),this._instance}_loadConfig(){try{if(v.existsSync(this._configPath)){const e=v.readFileSync(this._configPath,"utf-8"),t={...this._defaultConfig,...JSON.parse(e)};return u.info("Config loaded successfully from:",this._configPath),t}}catch(e){u.error("Failed to load config:",e)}return{...this._defaultConfig}}_saveConfig(){try{v.mkdirSync(S.dirname(this._configPath),{recursive:!0}),v.writeFileSync(this._configPath,JSON.stringify(this._config,null,2),"utf-8"),this._notifyListeners(),u.info("Config saved successfully to:",this._configPath)}catch(e){u.error("Failed to save config:",e)}}_notifyListeners(){s.BrowserWindow.getAllWindows().forEach(e=>e.webContents.send(r.CONFIG_UPDATED,this._config)),this._listeners.forEach(e=>e({...this._config}))}getConfig(){return Te(this._config)}get(e){return this._config[e]}set(e,t,i=!0){!(e in this._config)||this._config[e]===t||(this._config[e]=t,u.debug(`Config set: ${e} = ${t}`),i&&this._saveConfig())}update(e,t=!0){this._config={...this._config,...e},t&&this._saveConfig()}resetToDefault(){this._config={...this._defaultConfig},u.info("Config reset to default."),this._saveConfig()}onConfigChange(e){return this._listeners.push(e),()=>this._listeners=this._listeners.filter(t=>t!==e)}}const T=F.getInstance();process.env.BIGMODEL_API_KEY,new Date().getTime(),new Date().getTime(),process.env.DEEPSEEK_API_KEY,new Date().getTime(),new Date().getTime(),process.env.SILICONFLOW_API_KEY,new Date().getTime(),new Date().getTime(),process.env.QIANFAN_API_KEY,new Date().getTime(),new Date().getTime();const ve=()=>{let n=[],e=!1;const t=T.get(g.PROVIDER),i=o=>({...o,openAISetting:typeof o.openAISetting=="string"?ye(o.openAISetting??""):o.openAISetting});try{n=JSON.parse(te.decode(t)),e=!0}catch(o){u.error(`parse base64 provider failed: ${o}`)}if(!e)try{n=JSON.parse(t)}catch(o){u.error(`parse provider failed: ${o}`)}if(n.length)return n.map(i)},Me=()=>{try{return ve()}catch(n){return u.error(`get provider config failed: ${n}`),null}};function De(n){const e=Me();if(!e)throw new Error("provider config not found");for(const t of e)if(t.name===n){if(!t.openAISetting?.apiKey||!t.openAISetting?.baseURL)throw new Error("apiKey or baseURL not found");return new Ae(t.openAISetting.apiKey,t.openAISetting.baseURL)}}const Oe={minimize:"Minimize",maximize:"Maximize",restore:"Restore",close:"Close"},Ce={welcome:{helloMessage:"Hello, I'm Diona"},conversation:{placeholder:"Type a message...",newConversation:"New Conversation",selectModel:"Please select model",createConversation:"Create Conversation",searchPlaceholder:"Search conversations...",goSettings:"Go to",settings:"Settings Window",addModel:"to add a model",dialog:{title:"Confirm Deletion",content:"Are you sure you want to delete this conversation?",content_1:"Are you sure you want to delete the selected conversations? This action cannot be undone."},operations:{pin:"Pin Selected",del:"Delete Selected",selectAll:"Select All",cancel:"Cancel"}},sidebar:{conversations:"Conversations",settings:"Settings",help:"Help"},message:{dialog:{title:"Confirm Deletion",messageDelete:"Are you sure you want to delete this message?",batchDelete:"Are you sure you want to delete the selected messages?",copySuccess:"Copied successfully"},batchActions:{deleteSelected:"Delete Selected"},rendering:"Thinking...",stoppedGeneration:"(Stopped generating)",sending:"Sending",stopGeneration:"Stop generating",send:"Send"}},Ie={cancel:"Cancel",confirm:"Confirm"},Se={title:"Settings",base:"Basic Settings",provider:{modelConfig:"Model Configuration"},theme:{label:"Theme Settings",dark:"Dark Theme",light:"Light Theme",system:"System Theme",primaryColor:"Primary Color"},appearance:{fontSize:"Font Size",fontSizeOptions:{10:"Tiny (10px)",12:"Small (12px)",14:"Normal (14px)",16:"Medium (16px)",18:"Large (18px)",20:"Larger (20px)",24:"Extra Large (24px)"}},behavior:{minimizeToTray:"Minimize to tray when closed"},language:{label:"Language"},providers:{defaultModel:"Default Model",apiKey:"API Key",apiUrl:"API URL"}},be={conversation:{newConversation:"New Conversation",sortBy:"Sort By",sortByCreateTime:"Sort by Creation Time",sortByUpdateTime:"Sort by Update Time",sortByName:"Sort by Name",sortByModel:"Sort by Model",sortAscending:"Ascending",sortDescending:"Descending",pinConversation:"Pin Conversation",unpinConversation:"Unpin Conversation",renameConversation:"Rename Conversation",delConversation:"Delete Conversation",batchOperations:"Batch Operations"},message:{copyMessage:"Copy Message",deleteMessage:"Delete Message",selectMessage:"Select Message"}},Re={tooltip:"Diona Application",showWindow:"Show Window",exit:"Exit"},Ne={justNow:"Just now",minutes:"{count} minutes ago",hours:"{count} hours ago",days:"{count} days ago",months:"{count} months ago",years:"{count} years ago",weekday:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"}},Le={title:"Diona Application"},We={window:Oe,main:Ce,dialog:Ie,settings:Se,menu:be,tray:Re,timeAgo:Ne,app:Le},Ue={minimize:"最小化",maximize:"最大化",restore:"还原",close:"关闭"},ke={welcome:{helloMessage:"你好,我是迪奥娜"},conversation:{placeholder:"输入消息...",newConversation:"新对话",selectModel:"请选择模型",createConversation:"创建对话",searchPlaceholder:"搜索对话...",goSettings:"快去",settings:"设置窗口",addModel:"添加模型",dialog:{title:"确认删除",content:"确定要删除这个对话吗?",content_1:"确定要删除选中的对话吗?此操作不可撤销。"},operations:{pin:"置顶所选",del:"删除所选",selectAll:"全选",cancel:"取消"}},sidebar:{conversations:"对话",settings:"设置",help:"帮助"},message:{dialog:{title:"确认删除",messageDelete:"确认删除该条消息?",batchDelete:"确认删除选中的消息?",copySuccess:"复制成功"},batchActions:{deleteSelected:"删除选中项"},rendering:"思考中...",stoppedGeneration:"(已停止生成)",sending:"发送中",stopGeneration:"停止生成",send:"发送"}},Be={cancel:"取消",confirm:"确认"},Pe={title:"设置",base:"基础设置",provider:{modelConfig:"模型配置"},providers:{defaultModel:"默认模型",apiKey:"API密钥",apiUrl:"API地址"},theme:{label:"主题设置",dark:"深色主题",light:"浅色主题",system:"跟随系统",primaryColor:"主题颜色"},appearance:{fontSize:"字体大小",fontSizeOptions:{10:"极小 (10px)",12:"小 (12px)",14:"正常 (14px)",16:"中 (16px)",18:"大 (18px)",20:"较大 (20px)",24:"超大 (24px)"}},behavior:{minimizeToTray:"关闭时最小化到托盘"},language:{label:"语言设置"}},xe={conversation:{newConversation:"新建对话",sortBy:"排序方式",sortByCreateTime:"按创建时间排序",sortByUpdateTime:"按更新时间排序",sortByName:"按名称排序",sortByModel:"按模型排序",sortAscending:"递增",sortDescending:"递减",pinConversation:"置顶对话",unpinConversation:"取消置顶",renameConversation:"重命名对话",delConversation:"删除对话",batchOperations:"批量操作"},message:{copyMessage:"复制消息",deleteMessage:"删除消息",selectMessage:"选择消息"}},He={tooltip:"迪奥娜",showWindow:"显示窗口",exit:"退出"},Ge={justNow:"刚刚",minutes:"{count}分钟前",hours:"{count}小时前",days:"{count}天前",months:"{count}个月前",years:"{count}年前",weekday:{sun:"星期日",mon:"星期一",tue:"星期二",wed:"星期三",thu:"星期四",fri:"星期五",sat:"星期六"}},$e={title:"迪奥娜"},ze={window:Ue,main:ke,dialog:Be,settings:Pe,menu:xe,tray:He,timeAgo:Ge,app:$e},Fe={en:We,zh:ze};function B(){return n=>{if(n)try{const e=n?.split(".");let t=Fe[T.get(g.LANGUAGE)];for(const i of e)t=t[i];return t}catch(e){return u.error("failed to translate key:",n,e),n}}}let k;function oe(){if(k!=null)return k;const n=s.app.getAppPath();return k=C.join(n,"resources","icons","icon.ico"),k}class j{static _instance;_isDark=s.nativeTheme.shouldUseDarkColors;constructor(){const e=T.get(g.THEME_MODE);e&&(s.nativeTheme.themeSource=e,this._isDark=s.nativeTheme.shouldUseDarkColors),this._setupIpcEvent(),u.info("ThemeService initialized successfully.")}_setupIpcEvent(){s.ipcMain.handle(r.SET_THEME_MODE,(e,t)=>(s.nativeTheme.themeSource=t,T.set(g.THEME_MODE,t),s.nativeTheme.shouldUseDarkColors)),s.ipcMain.handle(r.GET_THEME_MODE,()=>s.nativeTheme.themeSource),s.ipcMain.handle(r.IS_DARK_THEME,()=>s.nativeTheme.shouldUseDarkColors),s.nativeTheme.on("updated",()=>{this._isDark=s.nativeTheme.shouldUseDarkColors,s.BrowserWindow.getAllWindows().forEach(e=>e.webContents.send(r.THEME_MODE_UPDATED,this._isDark))})}static getInstance(){return this._instance||(this._instance=new j),this._instance}get isDark(){return this._isDark}get themeMode(){return s.nativeTheme.themeSource}}const K=j.getInstance(),je={frame:!1,titleBarStyle:"hidden",trafficLightPosition:{x:-100,y:-100},show:!1,title:"NIANXX",darkTheme:K.isDark,backgroundColor:K.isDark?"#2C2C2C":"#FFFFFF",webPreferences:{nodeIntegration:!1,contextIsolation:!0,sandbox:!0,backgroundThrottling:!1,preload:MAIN_WINDOW_VITE_DEV_SERVER_URL?C.join(process.cwd(),"dist-electron/preload/preload.js"):C.join(__dirname,"preload.js")}};class Y{static _instance;_logo=oe();isDev=!!MAIN_WINDOW_VITE_DEV_SERVER_URL;_winStates={main:{instance:void 0,isHidden:!1,onCreate:[],onClosed:[]},setting:{instance:void 0,isHidden:!1,onCreate:[],onClosed:[]},dialog:{instance:void 0,isHidden:!1,onCreate:[],onClosed:[]},login:{instance:void 0,isHidden:!1,onCreate:[],onClosed:[]},loading:{instance:void 0,isHidden:!1,onCreate:[],onClosed:[]}};constructor(){this._setupIpcEvents(),u.info("WindowService initialized successfully.")}_isReallyClose(e){return e===w.MAIN?T.get(g.MINIMIZE_TO_TRAY)===!1:e!==w.SETTING}_setupIpcEvents(){const e=a=>{const c=s.BrowserWindow.fromWebContents(a.sender),d=this.getName(c);this.close(c,this._isReallyClose(d))},t=a=>{s.BrowserWindow.fromWebContents(a.sender)?.minimize()},i=a=>{this.toggleMax(s.BrowserWindow.fromWebContents(a.sender))},o=a=>s.BrowserWindow.fromWebContents(a.sender)?.isMaximized()??!1;s.ipcMain.on(r.WINDOW_CLOSE,e),s.ipcMain.on(r.WINDOW_MINIMIZE,t),s.ipcMain.on(r.WINDOW_MAXIMIZE,i),s.ipcMain.handle(r.IS_WINDOW_MAXIMIZED,o),s.ipcMain.handle(r.APP_LOAD_PAGE,(a,c)=>{const d=s.BrowserWindow.fromWebContents(a.sender);d&&this._loadPage(d,c)})}static getInstance(){return this._instance||(this._instance=new Y),this._instance}create(e,t,i){if(this.get(e))return;const o=this._isHiddenWin(e);let a=this._createWinInstance(e,{...t,...i});return this.isDev&&a.webContents.openDevTools(),!o&&this._setupWinLifecycle(a,e)._loadWindowTemplate(a,e),this._listenWinReady({win:a,isHiddenWin:o,size:t}),o||(this._winStates[e].instance=a,this._winStates[e].onCreate.forEach(c=>c(a))),o&&(this._winStates[e].isHidden=!1,u.info(`Hidden window show: ${e}`)),a}_setupWinLifecycle(e,t){const i=se(()=>!e?.isDestroyed()&&e?.webContents?.send(r.WINDOW_MAXIMIZE+"back",e?.isMaximized()),80);return e.once("closed",()=>{this._winStates[t].onClosed.forEach(o=>o(e)),e?.destroy(),e?.removeListener("resize",i),this._winStates[t].instance=void 0,this._winStates[t].isHidden=!1,u.info(`Window closed: ${t}`)}),e.on("resize",i),this}_listenWinReady(e){const t=()=>{e.win?.once("show",()=>setTimeout(()=>this._applySizeConstraints(e.win,e.size),2)),e.win?.show()};e.isHiddenWin?t():this._addLoadingView(e.win,e.size)?.(t)}_addLoadingView(e,t){let i=!1;const o=a=>{a.sender!==e?.webContents||i||(i=!0,s.ipcMain.removeListener(r.RENDERER_IS_READY,o))};return s.ipcMain.on(r.RENDERER_IS_READY,o),a=>{a()}}_applySizeConstraints(e,t){t.maxHeight&&t.maxWidth&&e.setMaximumSize(t.maxWidth,t.maxHeight),t.minHeight&&t.minWidth&&e.setMinimumSize(t.minWidth,t.minHeight)}_loadPage(e,t){if(MAIN_WINDOW_VITE_DEV_SERVER_URL)return e.loadURL(`${MAIN_WINDOW_VITE_DEV_SERVER_URL}/${t}.html`);e.loadFile(C.join(app.getAppPath(),"dist",`${t}.html`))}_loadWindowTemplate(e,t){this._loadPage(e,"index")}_handleCloseWindowState(e,t){const i=this.getName(e);i&&(t?this._winStates[i].instance=void 0:this._winStates[i].isHidden=!0),setTimeout(()=>{e[t?"close":"hide"]?.(),this._checkAndCloseAllWinodws()},210)}_checkAndCloseAllWinodws(){if(!this._winStates[w.MAIN].instance||this._winStates[w.MAIN].instance?.isDestroyed())return Object.values(this._winStates).forEach(t=>t?.instance?.close());if(!T.get(g.MINIMIZE_TO_TRAY)&&!this.get(w.MAIN)?.isVisible())return Object.values(this._winStates).forEach(t=>!t?.instance?.isVisible()&&t?.instance?.close())}_isHiddenWin(e){return this._winStates[e]&&this._winStates[e].isHidden}_createWinInstance(e,t){return this._isHiddenWin(e)?this._winStates[e].instance:new s.BrowserWindow({...je,icon:this._logo,...t})}focus(e){if(!e)return;const t=this.getName(e);e?.isMaximized()?(e?.restore(),u.debug(`Window ${t} restored and focused`)):u.debug(`Window ${t} focused`),e?.focus()}close(e,t=!0){if(!e)return;const i=this.getName(e);u.info(`Close window: ${i}, really: ${t}`),this._handleCloseWindowState(e,t)}toggleMax(e){e&&(e.isMaximized()?e.unmaximize():e.maximize())}getName(e){if(e){for(const[t,i]of Object.entries(this._winStates))if(i?.instance===e)return t}}get(e){if(!this._winStates[e].isHidden)return this._winStates[e].instance}onWindowCreate(e,t){this._winStates[e].onCreate.push(t)}onWindowClosed(e,t){this._winStates[e].onClosed.push(t)}}const W=Y.getInstance();let P=B();class q{static _instance;_menuTemplates=new Map;_currentMenu=void 0;constructor(){this._setupIpcListener(),this._setupLanguageChangeListener(),u.info("MenuService initialized successfully.")}_setupIpcListener(){s.ipcMain.handle(r.SHOW_CONTEXT_MENU,(e,t,i)=>new Promise(o=>this.showMenu(t,()=>o(!0),i)))}_setupLanguageChangeListener(){T.onConfigChange(e=>{e[g.LANGUAGE]&&(P=B())})}static getInstance(){return this._instance||(this._instance=new q),this._instance}register(e,t){return this._menuTemplates.set(e,t),e}showMenu(e,t,i){if(this._currentMenu)return;const o=G(this._menuTemplates.get(e));if(!o){u.warn(`Menu ${e} not found.`),t?.();return}let a=[];try{a=Array.isArray(i)?i:JSON.parse(i??"[]")}catch(l){u.error(`Failed to parse dynamicOptions for menu ${e}: ${l}`)}const c=l=>l.submenu?{...l,label:P(l?.label)??void 0,submenu:l.submenu?.map(p=>c(p))}:{...l,label:P(l?.label)??void 0},d=o.map(l=>{if(!Array.isArray(a)||!a.length)return c(l);const p=a.find(m=>m.id===l.id);if(p){const m={...l,...p};return c(m)}return l.submenu?c({...l,submenu:l.submenu?.map(m=>{const b=a.find(A=>A.id===m.id);return{...m,...b}})}):c(l)}),f=s.Menu.buildFromTemplate(d);this._currentMenu=f,f.popup({callback:()=>{this._currentMenu=void 0,t?.()}})}destroyMenu(e){this._menuTemplates.delete(e)}destroyed(){this._menuTemplates.clear(),this._currentMenu=void 0}}const x=q.getInstance();let L=B();class X{static _instance;_tray=null;_removeLanguageListener;_setupLanguageChangeListener(){this._removeLanguageListener=T.onConfigChange(e=>{e[g.LANGUAGE]&&(L=B(),this._tray&&this._updateTray())})}_updateTray(){this._tray||(this._tray=new s.Tray(oe()));const e=()=>{const t=W.get(w.MAIN);if(t&&!t?.isDestroyed()&&t?.isVisible()&&!t?.isFocused())return t.focus();if(t?.isMinimized())return t?.restore();t?.isVisible()&&t?.isFocused()||W.create(w.MAIN,ie)};this._tray.setToolTip(L("tray.tooltip")??"Diona Application"),this._tray.setContextMenu(s.Menu.buildFromTemplate([{label:L("tray.showWindow"),accelerator:"CmdOrCtrl+N",click:e},{type:"separator"},{label:L("settings.title"),click:()=>s.ipcMain.emit(`${r.OPEN_WINDOW}:${w.SETTING}`)},{role:"quit",label:L("tray.exit")}])),this._tray.removeAllListeners("click"),this._tray.on("click",e)}constructor(){this._setupLanguageChangeListener(),u.info("TrayService initialized successfully.")}static getInstance(){return this._instance||(this._instance=new X),this._instance}create(){this._tray||(this._updateTray(),s.app.on("quit",()=>{this.destroy()}))}destroy(){this._tray?.destroy(),this._tray=null,this._removeLanguageListener&&(this._removeLanguageListener(),this._removeLanguageListener=void 0)}}const J=X.getInstance();class Ye{win;views=new Map;activeId=null;skipNextNavigate=new Map;enabled=!1;constructor(e){this.win=e,this.win.on("resize",()=>this.updateActiveBounds()),this._setupIpcEvents()}_setupIpcEvents(){s.ipcMain.handle(r.TAB_CREATE,(e,t)=>this.create(t)),s.ipcMain.handle(r.TAB_LIST,()=>this.list()),s.ipcMain.handle(r.TAB_NAVIGATE,(e,{tabId:t,url:i})=>{this.navigate(t,i)}),s.ipcMain.handle(r.TAB_RELOAD,(e,t)=>{this.reload(t)}),s.ipcMain.handle(r.TAB_BACK,(e,t)=>{this.goBack(t)}),s.ipcMain.handle(r.TAB_FORWARD,(e,t)=>{this.goForward(t)}),s.ipcMain.handle(r.TAB_SWITCH,(e,t)=>{this.switch(t)}),s.ipcMain.handle(r.TAB_CLOSE,(e,t)=>{this.close(t)})}enable(){this.enabled=!0,this.updateActiveBounds(),this.activeId&&this.attach(this.activeId)}disable(){this.enabled=!1;const e=this.activeId?this.views.get(this.activeId):null;e&&this.win.removeBrowserView(e)}destroy(){this.disable(),this.views.forEach(e=>{e.webContents.destroy()}),this.views.clear(),s.ipcMain.removeHandler(r.TAB_CREATE),s.ipcMain.removeHandler(r.TAB_LIST),s.ipcMain.removeHandler(r.TAB_NAVIGATE),s.ipcMain.removeHandler(r.TAB_RELOAD),s.ipcMain.removeHandler(r.TAB_BACK),s.ipcMain.removeHandler(r.TAB_FORWARD),s.ipcMain.removeHandler(r.TAB_SWITCH),s.ipcMain.removeHandler(r.TAB_CLOSE)}list(){return Array.from(this.views.entries()).map(([e,t])=>this.info(e,t))}create(e,t=!0){const i=ce.randomUUID(),o=new s.BrowserView({webPreferences:{nodeIntegration:!1,contextIsolation:!0,sandbox:!0,preload:MAIN_WINDOW_VITE_DEV_SERVER_URL?C.join(process.cwd(),"dist-electron/preload/preload.js"):C.join(__dirname,"preload.js")}});this.views.set(i,o),this.enabled&&t&&this.attach(i);const a=e&&e.length>0?e:"about:blank";o.webContents.loadURL(a),this.bindEvents(i,o);const c=this.info(i,o);return this.win.webContents.send("tab-created",c),c}switch(e){this.views.has(e)&&(this.enabled&&this.attach(e),this.win.webContents.send("tab-switched",{tabId:e}))}close(e){const t=this.views.get(e);if(!t)return;this.activeId===e&&(this.win.removeBrowserView(t),this.activeId=null),t.webContents.destroy(),this.views.delete(e),this.win.webContents.send("tab-closed",{tabId:e});const i=this.views.keys().next().value;i&&this.switch(i)}navigate(e,t){const i=this.views.get(e);i&&(this.skipNextNavigate.set(e,!0),i.webContents.loadURL(t))}reload(e){const t=this.views.get(e);t&&t.webContents.reload()}goBack(e){const t=this.views.get(e);t&&t.webContents.canGoBack()&&t.webContents.goBack()}goForward(e){const t=this.views.get(e);t&&t.webContents.canGoForward()&&t.webContents.goForward()}attach(e){if(!this.enabled)return;const t=this.views.get(e);if(t){if(this.activeId&&this.views.get(this.activeId)){const i=this.views.get(this.activeId);this.win.removeBrowserView(i)}this.activeId=e,this.win.addBrowserView(t),this.updateActiveBounds()}}updateActiveBounds(){if(!this.enabled||!this.activeId)return;const e=this.views.get(this.activeId);if(!e)return;const[t,i]=this.win.getContentSize(),o=88,a=8,c=488,d=a,f=o+a,l=t-c-a,p=i-o-a*2;e.setBounds({x:d,y:f,width:Math.max(0,l),height:Math.max(0,p)})}bindEvents(e,t){const i=()=>this.win.webContents.send("tab-updated",this.info(e,t));t.webContents.on("did-start-loading",i),t.webContents.on("did-stop-loading",i),t.webContents.on("did-finish-load",i),t.webContents.on("page-title-updated",i),t.webContents.on("did-navigate",i),t.webContents.on("did-navigate-in-page",i),t.webContents.on("will-navigate",(o,a)=>{if(this.skipNextNavigate.get(e)){this.skipNextNavigate.set(e,!1);return}o.preventDefault(),this.create(a)}),t.webContents.setWindowOpenHandler(({url:o})=>(this.create(o),{action:"deny"}))}info(e,t){const i=t.webContents;return{id:e,url:i.getURL(),title:i.getTitle(),isLoading:i.isLoading(),canGoBack:i.canGoBack(),canGoForward:i.canGoForward()}}}const Q=n=>{if(n){J.create();return}J.destroy()},qe=n=>{const e=o=>{u.logUserOperation(`${r.SHOW_CONTEXT_MENU}:${E.CONVERSATION_ITEM}-${o}`),n.webContents.send(`${r.SHOW_CONTEXT_MENU}:${E.CONVERSATION_ITEM}`,o)};x.register(E.CONVERSATION_ITEM,[{id:D.PIN,label:"menu.conversation.pinConversation",click:()=>e(D.PIN)},{id:D.RENAME,label:"menu.conversation.renameConversation",click:()=>e(D.RENAME)},{id:D.DEL,label:"menu.conversation.delConversation",click:()=>e(D.DEL)}]);const t=o=>{u.logUserOperation(`${r.SHOW_CONTEXT_MENU}:${E.CONVERSATION_LIST}-${o}`),n.webContents.send(`${r.SHOW_CONTEXT_MENU}:${E.CONVERSATION_LIST}`,o)};x.register(E.CONVERSATION_LIST,[{id:_.NEW_CONVERSATION,label:"menu.conversation.newConversation",click:()=>t(_.NEW_CONVERSATION)},{type:"separator"},{id:_.SORT_BY,label:"menu.conversation.sortBy",submenu:[{id:_.SORT_BY_CREATE_TIME,label:"menu.conversation.sortByCreateTime",type:"radio",checked:!1,click:()=>t(_.SORT_BY_CREATE_TIME)},{id:_.SORT_BY_UPDATE_TIME,label:"menu.conversation.sortByUpdateTime",type:"radio",checked:!1,click:()=>t(_.SORT_BY_UPDATE_TIME)},{id:_.SORT_BY_NAME,label:"menu.conversation.sortByName",type:"radio",checked:!1,click:()=>t(_.SORT_BY_NAME)},{id:_.SORT_BY_MODEL,label:"menu.conversation.sortByModel",type:"radio",checked:!1,click:()=>t(_.SORT_BY_MODEL)},{type:"separator"},{id:_.SORT_ASCENDING,label:"menu.conversation.sortAscending",type:"radio",checked:!1,click:()=>t(_.SORT_ASCENDING)},{id:_.SORT_DESCENDING,label:"menu.conversation.sortDescending",type:"radio",checked:!1,click:()=>t(_.SORT_DESCENDING)}]},{id:_.BATCH_OPERATIONS,label:"menu.conversation.batchOperations",click:()=>t(_.BATCH_OPERATIONS)}]);const i=o=>{u.logUserOperation(`${r.SHOW_CONTEXT_MENU}:${E.MESSAGE_ITEM}-${o}`),n.webContents.send(`${r.SHOW_CONTEXT_MENU}:${E.MESSAGE_ITEM}`,o)};x.register(E.MESSAGE_ITEM,[{id:O.COPY,label:"menu.message.copyMessage",click:()=>i(O.COPY)},{id:O.SELECT,label:"menu.message.selectMessage",click:()=>i(O.SELECT)},{type:"separator"},{id:O.DELETE,label:"menu.message.deleteMessage",click:()=>i(O.DELETE)}])};function re(){W.onWindowCreate(w.MAIN,n=>{let e=T.get(g.MINIMIZE_TO_TRAY);T.onConfigChange(i=>{e!==i[g.MINIMIZE_TO_TRAY]&&(e=i[g.MINIMIZE_TO_TRAY],Q(e))}),Q(e),qe(n);const t=new Ye(n);t.enable(),n.on("closed",()=>{t.destroy()})}),W.create(w.MAIN,ie),s.ipcMain.on(r.START_A_DIALOGUE,async(n,e)=>{const{providerName:t,messages:i,messageId:o,selectedModel:a}=e,c=W.get(w.MAIN);if(!c)throw new Error("mainWindow not found");try{const f=await De(t)?.chat(i,a);if(!f)throw new Error("chunks or stream not found");for await(const l of f){const p={messageId:o,data:l};c.webContents.send(r.START_A_DIALOGUE+"back"+o,p)}}catch(d){const f={messageId:o,data:{isEnd:!0,isError:!0,result:d instanceof Error?d.message:String(d)}};c.webContents.send(r.START_A_DIALOGUE+"back"+o,f)}})}function Xe(){if(process.platform==="win32")return"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";if(process.platform==="darwin")return"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";if(process.platform==="linux")return"google-chrome"}function Ze(n){return C.join(s.app.getPath("userData"),"profiles",n)}function Ke(n){return new Promise(e=>{const t=de.createServer();t.once("error",i=>e(!0)),t.once("listening",()=>{t.close(),e(!1)}),t.listen(n)})}async function Je(){try{return new Promise(n=>{const e=ue.get("http://127.0.0.1:9222/json/version",t=>{n(t.statusCode===200)});e.on("error",()=>n(!1)),e.setTimeout(1e3,()=>{e.destroy(),n(!1)})})}catch{return!1}}async function Qe(){const n=Xe(),e=Ze("default");if(h.info(`Launching Chrome with user data dir: ${e}`),await Ke(9222)){h.info("Chrome already running on port 9222, skip launching.");return}if(await Je()){h.info("Chrome already running, skip launching.");return}return new Promise((i,o)=>{he.spawn(n,["--remote-debugging-port=9222","--window-size=1920,1080","--window-position=0,0","--no-first-run",`--user-data-dir=${e}`,"--no-default-browser-check","about:blank"],{detached:!0,stdio:"ignore"}).on("error",o),setTimeout(()=>{i(0)},1e3)})}class Ve extends pe.EventEmitter{async executeScript(e,t){const o=(a,c)=>{const d=a+c;return d.length>32768?d.slice(d.length-32768):d};return await new Promise(a=>{try{const c=t?.roomType??"",d=t?.startTime??"",f=t?.endTime??"",l=t?.operation??"",p=t?.tabIndex??"",m=t?.channels??"",b=t?.startTabIndex??"",A=s.utilityProcess.fork(e,[],{env:{...process.env,ROOM_TYPE:String(c),START_DATE:String(d),END_DATE:String(f),OPERATION:String(l),TAB_INDEX:String(p),CHANNELS:typeof m=="string"?m:JSON.stringify(m),START_TAB_INDEX:String(b)},stdio:"pipe"});let I="",R="";A.stdout&&A.stdout.on("data",M=>{const N=M.toString();I=o(I,N),h.info(`stdout: ${N}`)}),A.stderr&&A.stderr.on("data",M=>{const N=M.toString();R=o(R,N),h.info(`stderr: ${N}`)}),A.on("exit",M=>{h.info(`子进程退出,退出码 ${M}`),a({success:M===0,exitCode:M,stdoutTail:I,stderrTail:R,...M===0?{}:{error:`Script exited with code ${M}`}})})}catch(c){a({success:!1,exitCode:null,stdoutTail:"",stderrTail:"",error:c?.message||"运行 Node 脚本时出错"})}})}}const H=new Map;function V(){return s.app.isPackaged?U.join(__dirname,"scripts"):U.join(process.cwd(),"electron/scripts")}function et(){const n=new Ve;s.ipcMain.handle(r.OPEN_CHANNEL,async(e,t)=>{try{await Qe();const i=V(),o=U.join(i,"open_all_channel.js");if(H.clear(),Array.isArray(t))for(let c=0;c{try{const i=t.roomList.find(l=>l.id===t.roomType),a=[["fzName","fg_trace.js"],["mtName","mt_trace.js"],["dyHotelName","dy_hotel_trace.js"],["dyHotSpringName","dy_hot_spring_trace.js"]].filter(([l])=>i?.[l]),c=V(),d=a.map(([l,p])=>{const m=U.join(c,p);if(!ee.existsSync(m))throw new Error(`Script not found for channel ${l}: ${m}`);return{channel:l,scriptPath:m}}),f=[];for(let l=0;lthis.sendToRenderer(r.UPDATE_STATUS_CHANGED,{status:"checking"})),y.autoUpdater.on("update-available",e=>this.sendToRenderer(r.UPDATE_STATUS_CHANGED,{status:"available",info:e})),y.autoUpdater.on("update-not-available",()=>this.sendToRenderer(r.UPDATE_STATUS_CHANGED,{status:"not-available"})),y.autoUpdater.on("download-progress",e=>this.sendToRenderer(r.UPDATE_STATUS_CHANGED,{status:"downloading",progress:e})),y.autoUpdater.on("update-downloaded",e=>this.sendToRenderer(r.UPDATE_STATUS_CHANGED,{status:"downloaded",info:e})),y.autoUpdater.on("error",e=>this.sendToRenderer(r.UPDATE_STATUS_CHANGED,{status:"error",error:e.message}))}sendToRenderer(e,t){s.BrowserWindow.getAllWindows().forEach(i=>{i.isDestroyed()||i.webContents.send(e,t)})}registerHandlers(){s.ipcMain.handle(r.UPDATE_CHECK,()=>s.app.isPackaged?y.autoUpdater.checkForUpdates():(this.sendToRenderer(r.UPDATE_STATUS_CHANGED,{status:"checking"}),setTimeout(()=>{this.sendToRenderer(r.UPDATE_STATUS_CHANGED,{status:"not-available"})},1500),null)),s.ipcMain.handle(r.UPDATE_DOWNLOAD,()=>s.app.isPackaged?y.autoUpdater.downloadUpdate():null),s.ipcMain.handle(r.UPDATE_INSTALL,()=>s.app.isPackaged?y.autoUpdater.quitAndInstall():null),s.ipcMain.handle(r.UPDATE_VERSION,()=>s.app.getVersion())}}const tt=Z.getInstance();tt.init();le&&s.app.quit();s.app.whenReady().then(()=>{re(),et()});s.app.on("window-all-closed",()=>{process.platform!=="darwin"&&!T.get(g.MINIMIZE_TO_TRAY)&&(h.info("app closing due to all windows being closed"),s.app.quit())});s.app.on("activate",()=>{s.BrowserWindow.getAllWindows().length===0&&re()}); +"use strict";var we=Object.create;var re=Object.defineProperty;var Ae=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var Se=Object.getPrototypeOf,Ee=Object.prototype.hasOwnProperty;var ve=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of ye(e))!Ee.call(n,s)&&s!==t&&re(n,s,{get:()=>e[s],enumerable:!(i=Ae(e,s))||i.enumerable});return n};var Ce=(n,e,t)=>(t=n!=null?we(Se(n)):{},ve(e||!n||!n.__esModule?re(t,"default",{value:n,enumerable:!0}):t,n));const o=require("electron"),De=require("openai"),K=require("util"),d=require("electron-log"),y=require("path"),A=require("fs"),de=require("js-base64"),N=require("node:path"),Ie=require("crypto"),Me=require("electron-squirrel-startup"),Re=require("net"),Oe=require("http"),X=require("child_process"),be=require("events");require("bytenode");const C=require("electron-updater");function ue(n){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const t in n)if(t!=="default"){const i=Object.getOwnPropertyDescriptor(n,t);Object.defineProperty(e,t,i.get?i:{enumerable:!0,get:()=>n[t]})}}return e.default=n,Object.freeze(e)}const W=ue(y),I=ue(A);var c=(n=>(n.EXTERNAL_OPEN="external-open",n.WINDOW_MINIMIZE="window-minimize",n.WINDOW_MAXIMIZE="window-maximize",n.WINDOW_CLOSE="window-close",n.IS_WINDOW_MAXIMIZED="is-window-maximized",n.APP_SET_FRAMELESS="app:set-frameless",n.APP_LOAD_PAGE="app:load-page",n.TAB_CREATE="tab:create",n.TAB_LIST="tab:list",n.TAB_NAVIGATE="tab:navigate",n.TAB_RELOAD="tab:reload",n.TAB_BACK="tab:back",n.TAB_FORWARD="tab:forward",n.TAB_SWITCH="tab:switch",n.TAB_CLOSE="tab:close",n.LOG_TO_MAIN="log-to-main",n.READ_FILE="read-file",n.INVOKE="ipc:invoke",n.INVOKE_ASYNC="ipc:invokeAsync",n.APP_MINIMIZE="app:minimize",n.APP_MAXIMIZE="app:maximize",n.APP_QUIT="app:quit",n.FILE_READ="file:read",n.FILE_WRITE="file:write",n.GET_WINDOW_ID="get-window-id",n.CUSTOM_EVENT="custom:event",n.TIME_UPDATE="time:update",n.RENDERER_IS_READY="renderer-ready",n.SHOW_CONTEXT_MENU="show-context-menu",n.START_A_DIALOGUE="start-a-dialogue",n.OPEN_WINDOW="open-window",n.LOG_DEBUG="log-debug",n.LOG_INFO="log-info",n.LOG_WARN="log-warn",n.LOG_ERROR="log-error",n.CONFIG_UPDATED="config-updated",n.SET_CONFIG="set-config",n.GET_CONFIG="get-config",n.UPDATE_CONFIG="update-config",n.SET_THEME_MODE="set-theme-mode",n.GET_THEME_MODE="get-theme-mode",n.IS_DARK_THEME="is-dark-theme",n.THEME_MODE_UPDATED="theme-mode-updated",n.EXECUTE_SCRIPT="execute-script",n.OPEN_CHANNEL="open-channel",n.SCRIPT_LIST="script:list",n.SCRIPT_GET="script:get",n.SCRIPT_SAVE="script:save",n.SCRIPT_DELETE="script:delete",n.SCRIPT_TOGGLE="script:toggle",n.SCRIPT_RUN="script:run",n.SCRIPT_RECORD_START="script:record-start",n.SCRIPT_RECORD_STOP="script:record-stop",n.SCRIPT_CODEGEN="script:codegen",n.UPDATE_CHECK="update:check",n.UPDATE_DOWNLOAD="update:download",n.UPDATE_INSTALL="update:install",n.UPDATE_VERSION="update:version",n.UPDATE_STATUS_CHANGED="update:status-changed",n))(c||{});const pe={width:1440,height:900,minWidth:1440,minHeight:900};var E=(n=>(n.MAIN="main",n.SETTING="setting",n.DIALOG="dialog",n.LOADING="loading",n))(E||{}),_=(n=>(n.THEME_MODE="themeMode",n.PRIMARY_COLOR="primaryColor",n.LANGUAGE="language",n.FONT_SIZE="fontSize",n.MINIMIZE_TO_TRAY="minimizeToTray",n.PROVIDER="provider",n.DEFAULT_MODEL="defaultModel",n.AUTO_CHECK_UPDATE="autoCheckUpdate",n.AUTO_DOWNLOAD_UPDATE="autoDownloadUpdate",n))(_||{}),D=(n=>(n.CONVERSATION_ITEM="conversation-item",n.CONVERSATION_LIST="conversation-list",n.MESSAGE_ITEM="message-item",n))(D||{}),O=(n=>(n.PIN="pin",n.RENAME="rename",n.DEL="del",n))(O||{}),w=(n=>(n.NEW_CONVERSATION="newConversation",n.SORT_BY="sortBy",n.SORT_BY_CREATE_TIME="sortByCreateTime",n.SORT_BY_UPDATE_TIME="sortByUpdateTime",n.SORT_BY_NAME="sortByName",n.SORT_BY_MODEL="sortByModel",n.SORT_ASCENDING="sortAscending",n.SORT_DESCENDING="sortDescending",n.BATCH_OPERATIONS="batchOperations",n))(w||{}),b=(n=>(n.COPY="copy",n.DELETE="delete",n.SELECT="select",n))(b||{});class Ne{}const Le=K.promisify(I.readdir),Pe=K.promisify(I.stat),We=K.promisify(I.unlink);class J{static _instance;LOG_RETENTION_DAYS=7;CLEANUP_INTERVAL_MS=1440*60*1e3;constructor(){const e=W.join(o.app.getPath("userData"),"logs");try{I.existsSync(e)||I.mkdirSync(e,{recursive:!0})}catch(t){this.error("Failed to create log directory:",t)}d.transports.file.resolvePathFn=()=>{const t=new Date,i=`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,"0")}-${String(t.getDate()).padStart(2,"0")}`;return W.join(e,`${i}.log`)},d.transports.file.format="[{y}-{m}-{d} {h}:{i}:{s}.{ms}] [{level}] {text}",d.transports.file.maxSize=10*1024*1024,d.transports.console.level=process.env.NODE_ENV==="development"?"debug":"info",d.transports.file.level="debug",this._setupIpcEvents(),this._rewriteConsole(),this.info("LogService initialized successfully."),this._cleanupOldLogs(),setInterval(()=>this._cleanupOldLogs(),this.CLEANUP_INTERVAL_MS)}_setupIpcEvents(){o.ipcMain.on(c.LOG_DEBUG,(e,t,...i)=>this.debug(t,...i)),o.ipcMain.on(c.LOG_INFO,(e,t,...i)=>this.info(t,...i)),o.ipcMain.on(c.LOG_WARN,(e,t,...i)=>this.warn(t,...i)),o.ipcMain.on(c.LOG_ERROR,(e,t,...i)=>this.error(t,...i))}_rewriteConsole(){console.debug=d.debug,console.log=d.info,console.info=d.info,console.warn=d.warn,console.error=d.error}async _cleanupOldLogs(){try{const e=W.join(o.app.getPath("userData"),"logs");if(!I.existsSync(e))return;const t=new Date,i=new Date(t.getTime()-this.LOG_RETENTION_DAYS*24*60*60*1e3),s=await Le(e);let r=0;for(const a of s){if(!a.endsWith(".log"))continue;const l=W.join(e,a);try{const g=await Pe(l);g.isFile()&&g.birthtime0&&this.info(`Successfully cleaned up ${r} old log files.`)}catch(e){this.error("Failed to cleanup old logs:",e)}}static getInstance(){return this._instance||(this._instance=new J),this._instance}debug(e,...t){d.debug(e,...t)}info(e,...t){d.info(e,...t)}warn(e,...t){d.warn(e,...t)}error(e,...t){d.error(e,...t)}logApiRequest(e,t={},i="POST"){this.info(`API Request: ${e}, Method: ${i}, Request: ${JSON.stringify(t)}`)}logApiResponse(e,t={},i=200,s=0){i>=400?this.error(`API Error Response: ${e}, Status: ${i}, Response Time: ${s}ms, Response: ${JSON.stringify(t)}`):this.debug(`API Response: ${e}, Status: ${i}, Response Time: ${s}ms, Response: ${JSON.stringify(t)}`)}logUserOperation(e,t="unknown",i={}){this.info(`User Operation: ${e} by ${t}, Details: ${JSON.stringify(i)}`)}}const h=J.getInstance();function Ue(n){const e=n.choices[0];return{isEnd:e?.finish_reason==="stop",result:e?.delta?.content??""}}class ke extends Ne{client;constructor(e,t){super(),this.client=new De({apiKey:e,baseURL:t})}async chat(e,t){const i=Date.now(),s=e[e.length-1];h.logApiRequest("chat.completions.create",{model:t,lastMessage:s?.content?.substring(0,100)+(s?.content?.length>100?"...":""),messageCount:e.length},"POST");try{const r=await this.client.chat.completions.create({model:t,messages:e,stream:!0}),a=Date.now()-i;return h.logApiResponse("chat.completions.create",{success:!0},200,a),{async*[Symbol.asyncIterator](){for await(const l of r)yield Ue(l)}}}catch(r){const a=Date.now()-i;throw h.logApiResponse("chat.completions.create",{error:r instanceof Error?r.message:String(r)},500,a),r}}}function he(n,e){let t=null;return function(...i){t&&clearTimeout(t),t=setTimeout(()=>{n.apply(this,i)},e)}}function Z(n){if(n===null||typeof n!="object")return n;if(Array.isArray(n))return n.map(t=>Z(t));const e=Object.assign({},n);for(const t in e)Object.prototype.hasOwnProperty.call(e,t)&&(e[t]=Z(e[t]));return e}function xe(n){try{return JSON.parse(JSON.stringify(n))}catch(e){return console.error("simpleCloneDeep failed:",e),n}}function Be(n){try{return JSON.parse(de.decode(n))}catch(e){return console.error("parseOpenAISetting failed:",e),{}}}const Ge={[_.THEME_MODE]:"system",[_.PRIMARY_COLOR]:"#BB5BE7",[_.LANGUAGE]:"zh",[_.FONT_SIZE]:14,[_.MINIMIZE_TO_TRAY]:!1,[_.PROVIDER]:"",[_.DEFAULT_MODEL]:null};class Q{static _instance;_config;_configPath;_defaultConfig=Ge;_listeners=[];constructor(){this._configPath=W.join(o.app.getPath("userData"),"config.json"),this._config=this._loadConfig(),this._setupIpcEvents(),h.info("ConfigService initialized successfully.")}_setupIpcEvents(){const t=he(i=>this.update(i),200);o.ipcMain.handle(c.GET_CONFIG,(i,s)=>this.get(s)),o.ipcMain.on(c.SET_CONFIG,(i,s,r)=>this.set(s,r)),o.ipcMain.on(c.UPDATE_CONFIG,(i,s)=>t(s))}static getInstance(){return this._instance||(this._instance=new Q),this._instance}_loadConfig(){try{if(I.existsSync(this._configPath)){const e=I.readFileSync(this._configPath,"utf-8"),t={...this._defaultConfig,...JSON.parse(e)};return h.info("Config loaded successfully from:",this._configPath),t}}catch(e){h.error("Failed to load config:",e)}return{...this._defaultConfig}}_saveConfig(){try{I.mkdirSync(W.dirname(this._configPath),{recursive:!0}),I.writeFileSync(this._configPath,JSON.stringify(this._config,null,2),"utf-8"),this._notifyListeners(),h.info("Config saved successfully to:",this._configPath)}catch(e){h.error("Failed to save config:",e)}}_notifyListeners(){o.BrowserWindow.getAllWindows().forEach(e=>e.webContents.send(c.CONFIG_UPDATED,this._config)),this._listeners.forEach(e=>e({...this._config}))}getConfig(){return xe(this._config)}get(e){return this._config[e]}set(e,t,i=!0){!(e in this._config)||this._config[e]===t||(this._config[e]=t,h.debug(`Config set: ${e} = ${t}`),i&&this._saveConfig())}update(e,t=!0){this._config={...this._config,...e},t&&this._saveConfig()}resetToDefault(){this._config={...this._defaultConfig},h.info("Config reset to default."),this._saveConfig()}onConfigChange(e){return this._listeners.push(e),()=>this._listeners=this._listeners.filter(t=>t!==e)}}const v=Q.getInstance();process.env.BIGMODEL_API_KEY,new Date().getTime(),new Date().getTime(),process.env.DEEPSEEK_API_KEY,new Date().getTime(),new Date().getTime(),process.env.SILICONFLOW_API_KEY,new Date().getTime(),new Date().getTime(),process.env.QIANFAN_API_KEY,new Date().getTime(),new Date().getTime();const $e=()=>{let n=[],e=!1;const t=v.get(_.PROVIDER),i=s=>({...s,openAISetting:typeof s.openAISetting=="string"?Be(s.openAISetting??""):s.openAISetting});try{n=JSON.parse(de.decode(t)),e=!0}catch(s){h.error(`parse base64 provider failed: ${s}`)}if(!e)try{n=JSON.parse(t)}catch(s){h.error(`parse provider failed: ${s}`)}if(n.length)return n.map(i)},He=()=>{try{return $e()}catch(n){return h.error(`get provider config failed: ${n}`),null}};function Fe(n){const e=He();if(!e)throw new Error("provider config not found");for(const t of e)if(t.name===n){if(!t.openAISetting?.apiKey||!t.openAISetting?.baseURL)throw new Error("apiKey or baseURL not found");return new ke(t.openAISetting.apiKey,t.openAISetting.baseURL)}}const ze={minimize:"Minimize",maximize:"Maximize",restore:"Restore",close:"Close"},je={welcome:{helloMessage:"Hello, I'm Diona"},conversation:{placeholder:"Type a message...",newConversation:"New Conversation",selectModel:"Please select model",createConversation:"Create Conversation",searchPlaceholder:"Search conversations...",goSettings:"Go to",settings:"Settings Window",addModel:"to add a model",dialog:{title:"Confirm Deletion",content:"Are you sure you want to delete this conversation?",content_1:"Are you sure you want to delete the selected conversations? This action cannot be undone."},operations:{pin:"Pin Selected",del:"Delete Selected",selectAll:"Select All",cancel:"Cancel"}},sidebar:{conversations:"Conversations",settings:"Settings",help:"Help"},message:{dialog:{title:"Confirm Deletion",messageDelete:"Are you sure you want to delete this message?",batchDelete:"Are you sure you want to delete the selected messages?",copySuccess:"Copied successfully"},batchActions:{deleteSelected:"Delete Selected"},rendering:"Thinking...",stoppedGeneration:"(Stopped generating)",sending:"Sending",stopGeneration:"Stop generating",send:"Send"}},qe={cancel:"Cancel",confirm:"Confirm"},Ye={title:"Settings",base:"Basic Settings",provider:{modelConfig:"Model Configuration"},theme:{label:"Theme Settings",dark:"Dark Theme",light:"Light Theme",system:"System Theme",primaryColor:"Primary Color"},appearance:{fontSize:"Font Size",fontSizeOptions:{10:"Tiny (10px)",12:"Small (12px)",14:"Normal (14px)",16:"Medium (16px)",18:"Large (18px)",20:"Larger (20px)",24:"Extra Large (24px)"}},behavior:{minimizeToTray:"Minimize to tray when closed"},language:{label:"Language"},providers:{defaultModel:"Default Model",apiKey:"API Key",apiUrl:"API URL"}},Xe={conversation:{newConversation:"New Conversation",sortBy:"Sort By",sortByCreateTime:"Sort by Creation Time",sortByUpdateTime:"Sort by Update Time",sortByName:"Sort by Name",sortByModel:"Sort by Model",sortAscending:"Ascending",sortDescending:"Descending",pinConversation:"Pin Conversation",unpinConversation:"Unpin Conversation",renameConversation:"Rename Conversation",delConversation:"Delete Conversation",batchOperations:"Batch Operations"},message:{copyMessage:"Copy Message",deleteMessage:"Delete Message",selectMessage:"Select Message"}},Ze={tooltip:"Diona Application",showWindow:"Show Window",exit:"Exit"},Ke={justNow:"Just now",minutes:"{count} minutes ago",hours:"{count} hours ago",days:"{count} days ago",months:"{count} months ago",years:"{count} years ago",weekday:{sun:"Sunday",mon:"Monday",tue:"Tuesday",wed:"Wednesday",thu:"Thursday",fri:"Friday",sat:"Saturday"}},Je={title:"Diona Application"},Qe={window:ze,main:je,dialog:qe,settings:Ye,menu:Xe,tray:Ze,timeAgo:Ke,app:Je},Ve={minimize:"最小化",maximize:"最大化",restore:"还原",close:"关闭"},et={welcome:{helloMessage:"你好,我是迪奥娜"},conversation:{placeholder:"输入消息...",newConversation:"新对话",selectModel:"请选择模型",createConversation:"创建对话",searchPlaceholder:"搜索对话...",goSettings:"快去",settings:"设置窗口",addModel:"添加模型",dialog:{title:"确认删除",content:"确定要删除这个对话吗?",content_1:"确定要删除选中的对话吗?此操作不可撤销。"},operations:{pin:"置顶所选",del:"删除所选",selectAll:"全选",cancel:"取消"}},sidebar:{conversations:"对话",settings:"设置",help:"帮助"},message:{dialog:{title:"确认删除",messageDelete:"确认删除该条消息?",batchDelete:"确认删除选中的消息?",copySuccess:"复制成功"},batchActions:{deleteSelected:"删除选中项"},rendering:"思考中...",stoppedGeneration:"(已停止生成)",sending:"发送中",stopGeneration:"停止生成",send:"发送"}},tt={cancel:"取消",confirm:"确认"},nt={title:"设置",base:"基础设置",provider:{modelConfig:"模型配置"},providers:{defaultModel:"默认模型",apiKey:"API密钥",apiUrl:"API地址"},theme:{label:"主题设置",dark:"深色主题",light:"浅色主题",system:"跟随系统",primaryColor:"主题颜色"},appearance:{fontSize:"字体大小",fontSizeOptions:{10:"极小 (10px)",12:"小 (12px)",14:"正常 (14px)",16:"中 (16px)",18:"大 (18px)",20:"较大 (20px)",24:"超大 (24px)"}},behavior:{minimizeToTray:"关闭时最小化到托盘"},language:{label:"语言设置"}},it={conversation:{newConversation:"新建对话",sortBy:"排序方式",sortByCreateTime:"按创建时间排序",sortByUpdateTime:"按更新时间排序",sortByName:"按名称排序",sortByModel:"按模型排序",sortAscending:"递增",sortDescending:"递减",pinConversation:"置顶对话",unpinConversation:"取消置顶",renameConversation:"重命名对话",delConversation:"删除对话",batchOperations:"批量操作"},message:{copyMessage:"复制消息",deleteMessage:"删除消息",selectMessage:"选择消息"}},st={tooltip:"迪奥娜",showWindow:"显示窗口",exit:"退出"},rt={justNow:"刚刚",minutes:"{count}分钟前",hours:"{count}小时前",days:"{count}天前",months:"{count}个月前",years:"{count}年前",weekday:{sun:"星期日",mon:"星期一",tue:"星期二",wed:"星期三",thu:"星期四",fri:"星期五",sat:"星期六"}},ot={title:"迪奥娜"},at={window:Ve,main:et,dialog:tt,settings:nt,menu:it,tray:st,timeAgo:rt,app:ot},ct={en:Qe,zh:at};function H(){return n=>{if(n)try{const e=n?.split(".");let t=ct[v.get(_.LANGUAGE)];for(const i of e)t=t[i];return t}catch(e){return h.error("failed to translate key:",n,e),n}}}let G;function ge(){if(G!=null)return G;const n=o.app.getAppPath();return G=N.join(n,"resources","icons","icon.ico"),G}class V{static _instance;_isDark=o.nativeTheme.shouldUseDarkColors;constructor(){const e=v.get(_.THEME_MODE);e&&(o.nativeTheme.themeSource=e,this._isDark=o.nativeTheme.shouldUseDarkColors),this._setupIpcEvent(),h.info("ThemeService initialized successfully.")}_setupIpcEvent(){o.ipcMain.handle(c.SET_THEME_MODE,(e,t)=>(o.nativeTheme.themeSource=t,v.set(_.THEME_MODE,t),o.nativeTheme.shouldUseDarkColors)),o.ipcMain.handle(c.GET_THEME_MODE,()=>o.nativeTheme.themeSource),o.ipcMain.handle(c.IS_DARK_THEME,()=>o.nativeTheme.shouldUseDarkColors),o.nativeTheme.on("updated",()=>{this._isDark=o.nativeTheme.shouldUseDarkColors,o.BrowserWindow.getAllWindows().forEach(e=>e.webContents.send(c.THEME_MODE_UPDATED,this._isDark))})}static getInstance(){return this._instance||(this._instance=new V),this._instance}get isDark(){return this._isDark}get themeMode(){return o.nativeTheme.themeSource}}const oe=V.getInstance(),lt={frame:!1,titleBarStyle:"hidden",trafficLightPosition:{x:-100,y:-100},show:!1,title:"NIANXX",darkTheme:oe.isDark,backgroundColor:oe.isDark?"#2C2C2C":"#FFFFFF",webPreferences:{nodeIntegration:!1,contextIsolation:!0,sandbox:!0,backgroundThrottling:!1,preload:MAIN_WINDOW_VITE_DEV_SERVER_URL?N.join(process.cwd(),"dist-electron/preload/preload.js"):N.join(__dirname,"preload.js")}};class ee{static _instance;_logo=ge();isDev=!!MAIN_WINDOW_VITE_DEV_SERVER_URL;_winStates={main:{instance:void 0,isHidden:!1,onCreate:[],onClosed:[]},setting:{instance:void 0,isHidden:!1,onCreate:[],onClosed:[]},dialog:{instance:void 0,isHidden:!1,onCreate:[],onClosed:[]},login:{instance:void 0,isHidden:!1,onCreate:[],onClosed:[]},loading:{instance:void 0,isHidden:!1,onCreate:[],onClosed:[]}};constructor(){this._setupIpcEvents(),h.info("WindowService initialized successfully.")}_isReallyClose(e){return e===E.MAIN?v.get(_.MINIMIZE_TO_TRAY)===!1:e!==E.SETTING}_setupIpcEvents(){const e=r=>{const a=o.BrowserWindow.fromWebContents(r.sender),l=this.getName(a);this.close(a,this._isReallyClose(l))},t=r=>{o.BrowserWindow.fromWebContents(r.sender)?.minimize()},i=r=>{this.toggleMax(o.BrowserWindow.fromWebContents(r.sender))},s=r=>o.BrowserWindow.fromWebContents(r.sender)?.isMaximized()??!1;o.ipcMain.on(c.WINDOW_CLOSE,e),o.ipcMain.on(c.WINDOW_MINIMIZE,t),o.ipcMain.on(c.WINDOW_MAXIMIZE,i),o.ipcMain.handle(c.IS_WINDOW_MAXIMIZED,s),o.ipcMain.handle(c.APP_LOAD_PAGE,(r,a)=>{const l=o.BrowserWindow.fromWebContents(r.sender);l&&this._loadPage(l,a)})}static getInstance(){return this._instance||(this._instance=new ee),this._instance}create(e,t,i){if(this.get(e))return;const s=this._isHiddenWin(e);let r=this._createWinInstance(e,{...t,...i});return this.isDev&&r.webContents.openDevTools(),!s&&this._setupWinLifecycle(r,e)._loadWindowTemplate(r,e),this._listenWinReady({win:r,isHiddenWin:s,size:t}),s||(this._winStates[e].instance=r,this._winStates[e].onCreate.forEach(a=>a(r))),s&&(this._winStates[e].isHidden=!1,h.info(`Hidden window show: ${e}`)),r}_setupWinLifecycle(e,t){const i=he(()=>!e?.isDestroyed()&&e?.webContents?.send(c.WINDOW_MAXIMIZE+"back",e?.isMaximized()),80);return e.once("closed",()=>{this._winStates[t].onClosed.forEach(s=>s(e)),e?.destroy(),e?.removeListener("resize",i),this._winStates[t].instance=void 0,this._winStates[t].isHidden=!1,h.info(`Window closed: ${t}`)}),e.on("resize",i),this}_listenWinReady(e){const t=()=>{e.win?.once("show",()=>setTimeout(()=>this._applySizeConstraints(e.win,e.size),2)),e.win?.show()};e.isHiddenWin?t():this._addLoadingView(e.win,e.size)?.(t)}_addLoadingView(e,t){let i=!1;const s=r=>{r.sender!==e?.webContents||i||(i=!0,o.ipcMain.removeListener(c.RENDERER_IS_READY,s))};return o.ipcMain.on(c.RENDERER_IS_READY,s),r=>{r()}}_applySizeConstraints(e,t){t.maxHeight&&t.maxWidth&&e.setMaximumSize(t.maxWidth,t.maxHeight),t.minHeight&&t.minWidth&&e.setMinimumSize(t.minWidth,t.minHeight)}_loadPage(e,t){if(MAIN_WINDOW_VITE_DEV_SERVER_URL)return e.loadURL(`${MAIN_WINDOW_VITE_DEV_SERVER_URL}/${t}.html`);e.loadFile(N.join(app.getAppPath(),"dist",`${t}.html`))}_loadWindowTemplate(e,t){this._loadPage(e,"index")}_handleCloseWindowState(e,t){const i=this.getName(e);i&&(t?this._winStates[i].instance=void 0:this._winStates[i].isHidden=!0),setTimeout(()=>{e[t?"close":"hide"]?.(),this._checkAndCloseAllWinodws()},210)}_checkAndCloseAllWinodws(){if(!this._winStates[E.MAIN].instance||this._winStates[E.MAIN].instance?.isDestroyed())return Object.values(this._winStates).forEach(t=>t?.instance?.close());if(!v.get(_.MINIMIZE_TO_TRAY)&&!this.get(E.MAIN)?.isVisible())return Object.values(this._winStates).forEach(t=>!t?.instance?.isVisible()&&t?.instance?.close())}_isHiddenWin(e){return this._winStates[e]&&this._winStates[e].isHidden}_createWinInstance(e,t){return this._isHiddenWin(e)?this._winStates[e].instance:new o.BrowserWindow({...lt,icon:this._logo,...t})}focus(e){if(!e)return;const t=this.getName(e);e?.isMaximized()?(e?.restore(),h.debug(`Window ${t} restored and focused`)):h.debug(`Window ${t} focused`),e?.focus()}close(e,t=!0){if(!e)return;const i=this.getName(e);h.info(`Close window: ${i}, really: ${t}`),this._handleCloseWindowState(e,t)}toggleMax(e){e&&(e.isMaximized()?e.unmaximize():e.maximize())}getName(e){if(e){for(const[t,i]of Object.entries(this._winStates))if(i?.instance===e)return t}}get(e){if(!this._winStates[e].isHidden)return this._winStates[e].instance}onWindowCreate(e,t){this._winStates[e].onCreate.push(t)}onWindowClosed(e,t){this._winStates[e].onClosed.push(t)}}const B=ee.getInstance();let F=H();class te{static _instance;_menuTemplates=new Map;_currentMenu=void 0;constructor(){this._setupIpcListener(),this._setupLanguageChangeListener(),h.info("MenuService initialized successfully.")}_setupIpcListener(){o.ipcMain.handle(c.SHOW_CONTEXT_MENU,(e,t,i)=>new Promise(s=>this.showMenu(t,()=>s(!0),i)))}_setupLanguageChangeListener(){v.onConfigChange(e=>{e[_.LANGUAGE]&&(F=H())})}static getInstance(){return this._instance||(this._instance=new te),this._instance}register(e,t){return this._menuTemplates.set(e,t),e}showMenu(e,t,i){if(this._currentMenu)return;const s=Z(this._menuTemplates.get(e));if(!s){h.warn(`Menu ${e} not found.`),t?.();return}let r=[];try{r=Array.isArray(i)?i:JSON.parse(i??"[]")}catch(u){h.error(`Failed to parse dynamicOptions for menu ${e}: ${u}`)}const a=u=>u.submenu?{...u,label:F(u?.label)??void 0,submenu:u.submenu?.map(f=>a(f))}:{...u,label:F(u?.label)??void 0},l=s.map(u=>{if(!Array.isArray(r)||!r.length)return a(u);const f=r.find(m=>m.id===u.id);if(f){const m={...u,...f};return a(m)}return u.submenu?a({...u,submenu:u.submenu?.map(m=>{const T=r.find(p=>p.id===m.id);return{...m,...T}})}):a(u)}),g=o.Menu.buildFromTemplate(l);this._currentMenu=g,g.popup({callback:()=>{this._currentMenu=void 0,t?.()}})}destroyMenu(e){this._menuTemplates.delete(e)}destroyed(){this._menuTemplates.clear(),this._currentMenu=void 0}}const z=te.getInstance();let x=H();class ne{static _instance;_tray=null;_removeLanguageListener;_setupLanguageChangeListener(){this._removeLanguageListener=v.onConfigChange(e=>{e[_.LANGUAGE]&&(x=H(),this._tray&&this._updateTray())})}_updateTray(){this._tray||(this._tray=new o.Tray(ge()));const e=()=>{const t=B.get(E.MAIN);if(t&&!t?.isDestroyed()&&t?.isVisible()&&!t?.isFocused())return t.focus();if(t?.isMinimized())return t?.restore();t?.isVisible()&&t?.isFocused()||B.create(E.MAIN,pe)};this._tray.setToolTip(x("tray.tooltip")??"Diona Application"),this._tray.setContextMenu(o.Menu.buildFromTemplate([{label:x("tray.showWindow"),accelerator:"CmdOrCtrl+N",click:e},{type:"separator"},{label:x("settings.title"),click:()=>o.ipcMain.emit(`${c.OPEN_WINDOW}:${E.SETTING}`)},{role:"quit",label:x("tray.exit")}])),this._tray.removeAllListeners("click"),this._tray.on("click",e)}constructor(){this._setupLanguageChangeListener(),h.info("TrayService initialized successfully.")}static getInstance(){return this._instance||(this._instance=new ne),this._instance}create(){this._tray||(this._updateTray(),o.app.on("quit",()=>{this.destroy()}))}destroy(){this._tray?.destroy(),this._tray=null,this._removeLanguageListener&&(this._removeLanguageListener(),this._removeLanguageListener=void 0)}}const ae=ne.getInstance();class dt{win;views=new Map;activeId=null;skipNextNavigate=new Map;enabled=!1;constructor(e){this.win=e,this.win.on("resize",()=>this.updateActiveBounds()),this._setupIpcEvents()}_setupIpcEvents(){o.ipcMain.handle(c.TAB_CREATE,(e,t)=>this.create(t)),o.ipcMain.handle(c.TAB_LIST,()=>this.list()),o.ipcMain.handle(c.TAB_NAVIGATE,(e,{tabId:t,url:i})=>{this.navigate(t,i)}),o.ipcMain.handle(c.TAB_RELOAD,(e,t)=>{this.reload(t)}),o.ipcMain.handle(c.TAB_BACK,(e,t)=>{this.goBack(t)}),o.ipcMain.handle(c.TAB_FORWARD,(e,t)=>{this.goForward(t)}),o.ipcMain.handle(c.TAB_SWITCH,(e,t)=>{this.switch(t)}),o.ipcMain.handle(c.TAB_CLOSE,(e,t)=>{this.close(t)})}enable(){this.enabled=!0,this.updateActiveBounds(),this.activeId&&this.attach(this.activeId)}disable(){this.enabled=!1;const e=this.activeId?this.views.get(this.activeId):null;e&&this.win.removeBrowserView(e)}destroy(){this.disable(),this.views.forEach(e=>{e.webContents.destroy()}),this.views.clear(),o.ipcMain.removeHandler(c.TAB_CREATE),o.ipcMain.removeHandler(c.TAB_LIST),o.ipcMain.removeHandler(c.TAB_NAVIGATE),o.ipcMain.removeHandler(c.TAB_RELOAD),o.ipcMain.removeHandler(c.TAB_BACK),o.ipcMain.removeHandler(c.TAB_FORWARD),o.ipcMain.removeHandler(c.TAB_SWITCH),o.ipcMain.removeHandler(c.TAB_CLOSE)}list(){return Array.from(this.views.entries()).map(([e,t])=>this.info(e,t))}create(e,t=!0){const i=Ie.randomUUID(),s=new o.BrowserView({webPreferences:{nodeIntegration:!1,contextIsolation:!0,sandbox:!0,preload:MAIN_WINDOW_VITE_DEV_SERVER_URL?N.join(process.cwd(),"dist-electron/preload/preload.js"):N.join(__dirname,"preload.js")}});this.views.set(i,s),this.enabled&&t&&this.attach(i);const r=e&&e.length>0?e:"about:blank";s.webContents.loadURL(r),this.bindEvents(i,s);const a=this.info(i,s);return this.win.webContents.send("tab-created",a),a}switch(e){this.views.has(e)&&(this.enabled&&this.attach(e),this.win.webContents.send("tab-switched",{tabId:e}))}close(e){const t=this.views.get(e);if(!t)return;this.activeId===e&&(this.win.removeBrowserView(t),this.activeId=null),t.webContents.destroy(),this.views.delete(e),this.win.webContents.send("tab-closed",{tabId:e});const i=this.views.keys().next().value;i&&this.switch(i)}navigate(e,t){const i=this.views.get(e);i&&(this.skipNextNavigate.set(e,!0),i.webContents.loadURL(t))}reload(e){const t=this.views.get(e);t&&t.webContents.reload()}goBack(e){const t=this.views.get(e);t&&t.webContents.canGoBack()&&t.webContents.goBack()}goForward(e){const t=this.views.get(e);t&&t.webContents.canGoForward()&&t.webContents.goForward()}attach(e){if(!this.enabled)return;const t=this.views.get(e);if(t){if(this.activeId&&this.views.get(this.activeId)){const i=this.views.get(this.activeId);this.win.removeBrowserView(i)}this.activeId=e,this.win.addBrowserView(t),this.updateActiveBounds()}}updateActiveBounds(){if(!this.enabled||!this.activeId)return;const e=this.views.get(this.activeId);if(!e)return;const[t,i]=this.win.getContentSize(),s=88,r=8,a=488,l=r,g=s+r,u=t-a-r,f=i-s-r*2;e.setBounds({x:l,y:g,width:Math.max(0,u),height:Math.max(0,f)})}bindEvents(e,t){const i=()=>this.win.webContents.send("tab-updated",this.info(e,t));t.webContents.on("did-start-loading",i),t.webContents.on("did-stop-loading",i),t.webContents.on("did-finish-load",i),t.webContents.on("page-title-updated",i),t.webContents.on("did-navigate",i),t.webContents.on("did-navigate-in-page",i),t.webContents.on("will-navigate",(s,r)=>{if(this.skipNextNavigate.get(e)){this.skipNextNavigate.set(e,!1);return}s.preventDefault(),this.create(r)}),t.webContents.setWindowOpenHandler(({url:s})=>(this.create(s),{action:"deny"}))}info(e,t){const i=t.webContents;return{id:e,url:i.getURL(),title:i.getTitle(),isLoading:i.isLoading(),canGoBack:i.canGoBack(),canGoForward:i.canGoForward()}}}const ce=n=>{if(n){ae.create();return}ae.destroy()},ut=n=>{const e=s=>{h.logUserOperation(`${c.SHOW_CONTEXT_MENU}:${D.CONVERSATION_ITEM}-${s}`),n.webContents.send(`${c.SHOW_CONTEXT_MENU}:${D.CONVERSATION_ITEM}`,s)};z.register(D.CONVERSATION_ITEM,[{id:O.PIN,label:"menu.conversation.pinConversation",click:()=>e(O.PIN)},{id:O.RENAME,label:"menu.conversation.renameConversation",click:()=>e(O.RENAME)},{id:O.DEL,label:"menu.conversation.delConversation",click:()=>e(O.DEL)}]);const t=s=>{h.logUserOperation(`${c.SHOW_CONTEXT_MENU}:${D.CONVERSATION_LIST}-${s}`),n.webContents.send(`${c.SHOW_CONTEXT_MENU}:${D.CONVERSATION_LIST}`,s)};z.register(D.CONVERSATION_LIST,[{id:w.NEW_CONVERSATION,label:"menu.conversation.newConversation",click:()=>t(w.NEW_CONVERSATION)},{type:"separator"},{id:w.SORT_BY,label:"menu.conversation.sortBy",submenu:[{id:w.SORT_BY_CREATE_TIME,label:"menu.conversation.sortByCreateTime",type:"radio",checked:!1,click:()=>t(w.SORT_BY_CREATE_TIME)},{id:w.SORT_BY_UPDATE_TIME,label:"menu.conversation.sortByUpdateTime",type:"radio",checked:!1,click:()=>t(w.SORT_BY_UPDATE_TIME)},{id:w.SORT_BY_NAME,label:"menu.conversation.sortByName",type:"radio",checked:!1,click:()=>t(w.SORT_BY_NAME)},{id:w.SORT_BY_MODEL,label:"menu.conversation.sortByModel",type:"radio",checked:!1,click:()=>t(w.SORT_BY_MODEL)},{type:"separator"},{id:w.SORT_ASCENDING,label:"menu.conversation.sortAscending",type:"radio",checked:!1,click:()=>t(w.SORT_ASCENDING)},{id:w.SORT_DESCENDING,label:"menu.conversation.sortDescending",type:"radio",checked:!1,click:()=>t(w.SORT_DESCENDING)}]},{id:w.BATCH_OPERATIONS,label:"menu.conversation.batchOperations",click:()=>t(w.BATCH_OPERATIONS)}]);const i=s=>{h.logUserOperation(`${c.SHOW_CONTEXT_MENU}:${D.MESSAGE_ITEM}-${s}`),n.webContents.send(`${c.SHOW_CONTEXT_MENU}:${D.MESSAGE_ITEM}`,s)};z.register(D.MESSAGE_ITEM,[{id:b.COPY,label:"menu.message.copyMessage",click:()=>i(b.COPY)},{id:b.SELECT,label:"menu.message.selectMessage",click:()=>i(b.SELECT)},{type:"separator"},{id:b.DELETE,label:"menu.message.deleteMessage",click:()=>i(b.DELETE)}])};function fe(){B.onWindowCreate(E.MAIN,n=>{let e=v.get(_.MINIMIZE_TO_TRAY);v.onConfigChange(i=>{e!==i[_.MINIMIZE_TO_TRAY]&&(e=i[_.MINIMIZE_TO_TRAY],ce(e))}),ce(e),ut(n);const t=new dt(n);t.enable(),n.on("closed",()=>{t.destroy()})}),B.create(E.MAIN,pe),o.ipcMain.on(c.START_A_DIALOGUE,async(n,e)=>{const{providerName:t,messages:i,messageId:s,selectedModel:r}=e,a=B.get(E.MAIN);if(!a)throw new Error("mainWindow not found");try{const g=await Fe(t)?.chat(i,r);if(!g)throw new Error("chunks or stream not found");for await(const u of g){const f={messageId:s,data:u};a.webContents.send(c.START_A_DIALOGUE+"back"+s,f)}}catch(l){const g={messageId:s,data:{isEnd:!0,isError:!0,result:l instanceof Error?l.message:String(l)}};a.webContents.send(c.START_A_DIALOGUE+"back"+s,g)}})}function pt(){if(process.platform==="win32")return"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe";if(process.platform==="darwin")return"/Applications/Google Chrome.app/Contents/MacOS/Google Chrome";if(process.platform==="linux")return"google-chrome"}function ht(n){return N.join(o.app.getPath("userData"),"profiles",n)}function gt(n){return new Promise(e=>{const t=Re.createServer();t.once("error",i=>e(!0)),t.once("listening",()=>{t.close(),e(!1)}),t.listen(n)})}async function ft(){try{return new Promise(n=>{const e=Oe.get("http://127.0.0.1:9222/json/version",t=>{n(t.statusCode===200)});e.on("error",()=>n(!1)),e.setTimeout(1e3,()=>{e.destroy(),n(!1)})})}catch{return!1}}async function _t(){const n=pt(),e=ht("default");if(d.info(`Launching Chrome with user data dir: ${e}`),await gt(9222)){d.info("Chrome already running on port 9222, skip launching.");return}if(await ft()){d.info("Chrome already running, skip launching.");return}return new Promise((i,s)=>{X.spawn(n,["--remote-debugging-port=9222","--window-size=1920,1080","--window-position=0,0","--no-first-run",`--user-data-dir=${e}`,"--no-default-browser-check","about:blank"],{detached:!0,stdio:"ignore"}).on("error",s),setTimeout(()=>{i(0)},1e3)})}class _e extends be.EventEmitter{async executeScript(e,t){const s=(r,a)=>{const l=r+a;return l.length>32768?l.slice(l.length-32768):l};return await new Promise(r=>{try{const a=t?.roomType??"",l=t?.startTime??"",g=t?.endTime??"",u=t?.operation??"",f=t?.tabIndex??"",m=t?.channels??"",T=t?.startTabIndex??"",p=o.utilityProcess.fork(e,[],{env:{...process.env,ROOM_TYPE:String(a),START_DATE:String(l),END_DATE:String(g),OPERATION:String(u),TAB_INDEX:String(f),CHANNELS:typeof m=="string"?m:JSON.stringify(m),START_TAB_INDEX:String(T)},stdio:"pipe"});let M="",k="";p.stdout&&p.stdout.on("data",S=>{const R=S.toString();M=s(M,R),d.info(`stdout: ${R}`)}),p.stderr&&p.stderr.on("data",S=>{const R=S.toString();k=s(k,R),d.info(`stderr: ${R}`)}),p.on("exit",S=>{d.info(`子进程退出,退出码 ${S}`),r({success:S===0,exitCode:S,stdoutTail:M,stderrTail:k,...S===0?{}:{error:`Script exited with code ${S}`}})})}catch(a){r({success:!1,exitCode:null,stdoutTail:"",stderrTail:"",error:a?.message||"运行 Node 脚本时出错"})}})}}const mt="scripts.meta.json";function L(){return o.app.isPackaged?y.join(__dirname,"scripts"):y.join(process.cwd(),"electron/scripts")}function me(){const n=L();A.existsSync(n)||A.mkdirSync(n,{recursive:!0})}function ie(){return y.join(L(),mt)}function P(){const n=ie();if(!A.existsSync(n))return{scripts:[]};try{const e=A.readFileSync(n,"utf-8"),t=JSON.parse(e);if(t&&Array.isArray(t.scripts))return t}catch(e){d.warn("[script-store-service] Failed to read meta:",e)}return{scripts:[]}}function U(n){me();const e=ie();A.writeFileSync(e,JSON.stringify(n,null,2),"utf-8")}function Tt(n){return n.toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/g,"-").replace(/^-+|-+$/g,"")||"script"}function wt(n,e){const t=Tt(n);let i=`${t}.mjs`,s=1;for(;e.has(i);)i=`${t}-${s}.mjs`,s++;return i}function At(){const n=L(),e=ie();if(A.existsSync(e))return;if(!A.existsSync(n)){d.info("[script-store-service] Scripts directory does not exist, skipping seed.");return}const t={scripts:[]},i=A.readdirSync(n).filter(s=>s.endsWith(".mjs"));for(const s of i)try{const r=s.replace(/\.mjs$/,""),a=new Date().toISOString();t.scripts.push({id:`seed-${r}`,name:r,description:"",filename:s,enabled:!0,channel:"",createdAt:a,updatedAt:a})}catch(r){d.warn("[script-store-service] Failed to seed script",s,r)}U(t),d.info("[script-store-service] Seeded scripts:",t.scripts.length)}function yt(){me(),At()}function St(){return P().scripts.map(e=>$(e)).sort((e,t)=>new Date(t.updatedAt).getTime()-new Date(e.updatedAt).getTime())}function j(n){const t=P().scripts.find(i=>i.id===n);return t?$(t):null}function Et(n){const t=P().scripts.find(i=>i.id===n);return t?y.join(L(),t.filename):null}function le(n){const e=P(),t=L(),i=new Set(e.scripts.map(u=>u.filename)),s=new Date().toISOString();if(n.id){const u=e.scripts.findIndex(f=>f.id===n.id);if(u>=0){const f=e.scripts[u],m=y.join(t,f.filename);return A.writeFileSync(m,n.code,"utf-8"),e.scripts[u]={...f,name:n.name,description:n.description,channel:n.channel,enabled:n.enabled,updatedAt:s},U(e),$(e.scripts[u])}}const r=wt(n.name,i),a=y.join(t,r);A.writeFileSync(a,n.code,"utf-8");const g={id:`script-${Date.now()}-${Math.random().toString(36).slice(2,7)}`,name:n.name,description:n.description,filename:r,enabled:n.enabled,channel:n.channel,createdAt:s,updatedAt:s};return e.scripts.push(g),U(e),$(g)}function vt(n){const e=P(),t=e.scripts.findIndex(r=>r.id===n);if(t===-1)return!1;const i=e.scripts[t],s=y.join(L(),i.filename);if(A.existsSync(s))try{A.unlinkSync(s)}catch(r){d.warn("[script-store-service] Failed to delete script file:",r)}return e.scripts.splice(t,1),U(e),!0}function Ct(n,e){const t=P(),i=t.scripts.findIndex(s=>s.id===n);return i===-1?!1:(t.scripts[i].enabled=e,t.scripts[i].updatedAt=new Date().toISOString(),U(t),!0)}function Dt(n,e){const t=P(),i=t.scripts.findIndex(s=>s.id===n);return i===-1?!1:(t.scripts[i].lastRun=e,t.scripts[i].updatedAt=new Date().toISOString(),U(t),!0)}function $(n){const e=L(),t=y.join(e,n.filename);let i="";try{A.existsSync(t)&&(i=A.readFileSync(t,"utf-8"))}catch(s){d.warn("[script-store-service] Failed to read script file:",s)}return{...n,code:i}}const It=new _e;async function Mt(n,e){const t=Et(n);if(!t)return{success:!1,exitCode:null,stdoutTail:"",stderrTail:"",error:"Script not found"};const i=await It.executeScript(t,{SCRIPT_ID:n,CHANNEL:e||""});return Dt(n,{time:new Date().toISOString(),success:i.success,error:i.error}),i}const q=new Map;function Y(){return o.app.isPackaged?y.join(__dirname,"scripts"):y.join(process.cwd(),"electron/scripts")}function Rt(){const n=new _e,e=y.dirname(require.resolve("playwright-core")),t=y.join(e,"cli.js");let i=null;o.ipcMain.handle(c.SCRIPT_LIST,async()=>{try{return St()}catch(s){throw d.error("[SCRIPT_LIST] error:",s),s}}),o.ipcMain.handle(c.SCRIPT_GET,async(s,r)=>{try{return j(r)}catch(a){throw d.error("[SCRIPT_GET] error:",a),a}}),o.ipcMain.handle(c.SCRIPT_SAVE,async(s,r)=>{try{return le(r)}catch(a){throw d.error("[SCRIPT_SAVE] error:",a),a}}),o.ipcMain.handle(c.SCRIPT_DELETE,async(s,r)=>{try{return vt(r)}catch(a){throw d.error("[SCRIPT_DELETE] error:",a),a}}),o.ipcMain.handle(c.SCRIPT_TOGGLE,async(s,r,a)=>{try{return Ct(r,a)}catch(l){throw d.error("[SCRIPT_TOGGLE] error:",l),l}}),o.ipcMain.handle(c.SCRIPT_RUN,async(s,r)=>{try{const a=j(r);return await Mt(r,a?.channel)}catch(a){return d.error("[SCRIPT_RUN] error:",a),{success:!1,exitCode:null,stdoutTail:"",stderrTail:"",error:a?.message||"Run failed"}}}),o.ipcMain.handle(c.SCRIPT_RECORD_START,async(s,r)=>{try{i&&(i.kill("SIGINT"),i=null);const a=r||"about:blank";return i=X.spawn(process.execPath,[t,"codegen","--target","javascript","--viewport-size","1920,1080","--color-scheme","light",a],{env:{...process.env,ELECTRON_RUN_AS_NODE:"1"},stdio:"pipe"}),i.on("error",l=>{d.error("[SCRIPT_RECORD_START] Failed to start codegen process:",l)}),i.stdout?.on("data",l=>{d.info(`[SCRIPT_RECORD_START] stdout: ${l.toString()}`)}),i.stderr?.on("data",l=>{d.error(`[SCRIPT_RECORD_START] stderr: ${l.toString()}`)}),{success:!0}}catch(a){return d.error("[SCRIPT_RECORD_START] error:",a),{success:!1,error:a?.message||"Recording start failed"}}}),o.ipcMain.handle(c.SCRIPT_RECORD_STOP,async()=>{try{return i&&(i.kill("SIGINT"),i=null),{success:!0,code:""}}catch(s){return d.error("[SCRIPT_RECORD_STOP] error:",s),{success:!1,error:s?.message||"Recording stop failed"}}}),o.ipcMain.handle(c.SCRIPT_CODEGEN,async(s,r,a)=>{try{const l=j(r);if(!l)return{success:!1,error:"Script not found"};const g=Y(),u=y.join(g,l.filename),f=a||"about:blank";return d.info(`[SCRIPT_CODEGEN] Starting codegen for script ${r} at ${u} with url ${f}`),await new Promise(m=>{const T=X.spawn(process.execPath,[t,"codegen","--target","javascript","-o",u,f],{env:{...process.env,ELECTRON_RUN_AS_NODE:"1"},stdio:"pipe"});T.on("exit",()=>{try{let p=A.readFileSync(u,"utf-8");p.includes("require('playwright')")&&!p.includes("createRequire")&&(p=`import { createRequire } from 'node:module'; +const require = createRequire(import.meta.url); + +${p}`),A.writeFileSync(u,p,"utf-8"),le({id:r,name:l.name,description:l.description,code:p,channel:l.channel,enabled:l.enabled}),m({success:!0,code:p})}catch(p){d.error("[SCRIPT_CODEGEN] Failed to process generated code:",p),m({success:!1,error:p?.message||"Failed to process generated code"})}}),T.on("error",p=>{d.error("[SCRIPT_CODEGEN] Failed to start codegen:",p),m({success:!1,error:p.message})})})}catch(l){return d.error("[SCRIPT_CODEGEN] error:",l),{success:!1,error:l?.message||"Codegen failed"}}}),o.ipcMain.handle(c.OPEN_CHANNEL,async(s,r)=>{try{await _t();const a=Y(),l=y.join(a,"open_all_channel.js");if(q.clear(),Array.isArray(r))for(let u=0;u{try{const a=r.roomList.find(T=>T.id===r.roomType),g=[["fzName","fg_trace.js"],["mtName","mt_trace.js"],["dyHotelName","dy_hotel_trace.js"],["dyHotSpringName","dy_hot_spring_trace.js"]].filter(([T])=>a?.[T]),u=Y(),f=g.map(([T,p])=>{const M=y.join(u,p);if(!A.existsSync(M))throw new Error(`Script not found for channel ${T}: ${M}`);return{channel:T,scriptPath:M}}),m=[];for(let T=0;Tthis.sendToRenderer(c.UPDATE_STATUS_CHANGED,{status:"checking"})),C.autoUpdater.on("update-available",e=>this.sendToRenderer(c.UPDATE_STATUS_CHANGED,{status:"available",info:e})),C.autoUpdater.on("update-not-available",()=>this.sendToRenderer(c.UPDATE_STATUS_CHANGED,{status:"not-available"})),C.autoUpdater.on("download-progress",e=>this.sendToRenderer(c.UPDATE_STATUS_CHANGED,{status:"downloading",progress:e})),C.autoUpdater.on("update-downloaded",e=>this.sendToRenderer(c.UPDATE_STATUS_CHANGED,{status:"downloaded",info:e})),C.autoUpdater.on("error",e=>this.sendToRenderer(c.UPDATE_STATUS_CHANGED,{status:"error",error:e.message}))}sendToRenderer(e,t){o.BrowserWindow.getAllWindows().forEach(i=>{i.isDestroyed()||i.webContents.send(e,t)})}registerHandlers(){o.ipcMain.handle(c.UPDATE_CHECK,()=>o.app.isPackaged?C.autoUpdater.checkForUpdates():(this.sendToRenderer(c.UPDATE_STATUS_CHANGED,{status:"checking"}),setTimeout(()=>{this.sendToRenderer(c.UPDATE_STATUS_CHANGED,{status:"not-available"})},1500),null)),o.ipcMain.handle(c.UPDATE_DOWNLOAD,()=>o.app.isPackaged?C.autoUpdater.downloadUpdate():null),o.ipcMain.handle(c.UPDATE_INSTALL,()=>o.app.isPackaged?C.autoUpdater.quitAndInstall():null),o.ipcMain.handle(c.UPDATE_VERSION,()=>o.app.getVersion())}}const Ot=se.getInstance();Ot.init();Me&&o.app.quit();o.app.whenReady().then(()=>{fe(),yt(),Rt()});o.app.on("window-all-closed",()=>{process.platform!=="darwin"&&!v.get(_.MINIMIZE_TO_TRAY)&&(d.info("app closing due to all windows being closed"),o.app.quit())});o.app.on("activate",()=>{o.BrowserWindow.getAllWindows().length===0&&fe()}); diff --git a/dist-electron/main/main.jsc b/dist-electron/main/main.jsc index b0b98f4dc8d68e4a7b619054da9bd698339835f6..bd795ec1efbfb5dc5709616b9bbb3bbf079baf9d 100644 GIT binary patch literal 134184 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 z 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 z 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 diff --git a/dist-electron/preload/preload.js b/dist-electron/preload/preload.js index a41b009..ab7c747 100644 --- a/dist-electron/preload/preload.js +++ b/dist-electron/preload/preload.js @@ -54,6 +54,7 @@ var IPC_EVENTS = /* @__PURE__ */ ((IPC_EVENTS2) => { 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["UPDATE_CHECK"] = "update:check"; IPC_EVENTS2["UPDATE_DOWNLOAD"] = "update:download"; IPC_EVENTS2["UPDATE_INSTALL"] = "update:install"; @@ -112,7 +113,8 @@ const api = { 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) + 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/dist/index.html b/dist/index.html index 94a9cd0..5cb195e 100644 --- a/dist/index.html +++ b/dist/index.html @@ -8,8 +8,8 @@ http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' http://8.138.234.141 https://one-feel-bucket.oss-cn-guangzhou.aliyuncs.com; connect-src 'self' http://8.138.234.141 https://api.iconify.design wss://onefeel.brother7.cn" /> - - + +

diff --git a/electron/preload/index.ts b/electron/preload/index.ts index 46f5f61..d03aa57 100644 --- a/electron/preload/index.ts +++ b/electron/preload/index.ts @@ -66,6 +66,7 @@ const api: WindowApi = { run: (id: string) => ipcRenderer.invoke(IPC_EVENTS.SCRIPT_RUN, id), startRecording: (url?: string) => ipcRenderer.invoke(IPC_EVENTS.SCRIPT_RECORD_START, url), stopRecording: () => ipcRenderer.invoke(IPC_EVENTS.SCRIPT_RECORD_STOP), + codegen: (id: string, url?: string) => ipcRenderer.invoke(IPC_EVENTS.SCRIPT_CODEGEN, id, url), }, } diff --git a/electron/process/runTaskOperationService.ts b/electron/process/runTaskOperationService.ts index de493ef..8cd8a36 100644 --- a/electron/process/runTaskOperationService.ts +++ b/electron/process/runTaskOperationService.ts @@ -11,12 +11,9 @@ import { toggleScript, } from '@electron/service/script-store-service'; import { runScriptById } from '@electron/service/script-execution-service'; -import { - startRecording, - stopRecording, -} from '@electron/service/script-recorder-service'; import fs from 'fs' import path from 'path' +import { spawn } from 'child_process' import log from 'electron-log'; const openedTabIndexByChannelName = new Map() @@ -29,6 +26,9 @@ function getScriptsDir() { export function runTaskOperationService() { const executeScriptServiceInstance = new executeScriptService(); + const playwrightCoreDir = path.dirname(require.resolve('playwright-core')); + const cliPath = path.join(playwrightCoreDir, 'cli.js'); + let recorderProc: ReturnType | null = null; // 脚本管理 IPC ipcMain.handle(IPC_EVENTS.SCRIPT_LIST, async () => { @@ -88,7 +88,35 @@ export function runTaskOperationService() { ipcMain.handle(IPC_EVENTS.SCRIPT_RECORD_START, async (_event, url?: string) => { try { - return await startRecording(url); + if (recorderProc) { + recorderProc.kill('SIGINT'); + recorderProc = null; + } + + const targetUrl = url || 'about:blank'; + recorderProc = spawn(process.execPath, [cliPath, 'codegen', '--target', 'javascript', '--channel', 'chrome', '--viewport-size', '1920,1080', '--color-scheme', 'light', targetUrl], { + env: { ...process.env, ELECTRON_RUN_AS_NODE: '1' }, + stdio: 'pipe', + }); + + recorderProc.on('error', (err) => { + log.error('[SCRIPT_RECORD_START] Failed to start codegen process:', err); + }); + + recorderProc.on('exit', (code, signal) => { + log.info(`[SCRIPT_RECORD_START] Process exited code=${code} signal=${signal}`); + recorderProc = null; + }); + + recorderProc.stdout?.on('data', (data: Buffer) => { + log.info(`[SCRIPT_RECORD_START] stdout: ${data.toString()}`); + }); + + recorderProc.stderr?.on('data', (data: Buffer) => { + log.error(`[SCRIPT_RECORD_START] stderr: ${data.toString()}`); + }); + + return { success: true }; } catch (error: any) { log.error('[SCRIPT_RECORD_START] error:', error); return { success: false, error: error?.message || 'Recording start failed' }; @@ -97,13 +125,76 @@ export function runTaskOperationService() { ipcMain.handle(IPC_EVENTS.SCRIPT_RECORD_STOP, async () => { try { - return await stopRecording(); + if (recorderProc) { + recorderProc.kill('SIGINT'); + recorderProc = null; + } + return { success: true, code: '' }; } catch (error: any) { log.error('[SCRIPT_RECORD_STOP] error:', error); return { success: false, error: error?.message || 'Recording stop failed' }; } }); + ipcMain.handle(IPC_EVENTS.SCRIPT_CODEGEN, async (_event, id: string, url?: string) => { + try { + const script = getScript(id); + if (!script) { + return { success: false, error: 'Script not found' }; + } + + const scriptsDir = getScriptsDir(); + const scriptPath = path.join(scriptsDir, script.filename); + const targetUrl = url || 'about:blank'; + + log.info(`[SCRIPT_CODEGEN] Starting codegen for script ${id} at ${scriptPath} with url ${targetUrl}`); + + return await new Promise<{ success: boolean; code?: string; error?: string }>((resolve) => { + const proc = spawn(process.execPath, [cliPath, 'codegen', '--target', 'javascript', '--channel', 'chrome', '-o', scriptPath, targetUrl], { + env: { ...process.env, ELECTRON_RUN_AS_NODE: '1' }, + stdio: 'pipe', + }); + + proc.on('exit', () => { + try { + let generatedCode = fs.readFileSync(scriptPath, 'utf-8'); + + // Playwright codegen --target javascript generates CommonJS code. + // Since script files use .mjs extension, we inject createRequire for compatibility. + if (generatedCode.includes("require('playwright')") && !generatedCode.includes('createRequire')) { + generatedCode = `import { createRequire } from 'node:module';\nconst require = createRequire(import.meta.url);\n\n${generatedCode}`; + } + + fs.writeFileSync(scriptPath, generatedCode, 'utf-8'); + + // Update script store so the new code is reflected in metadata reads + saveScript({ + id, + name: script.name, + description: script.description, + code: generatedCode, + channel: script.channel, + enabled: script.enabled, + }); + + resolve({ success: true, code: generatedCode }); + } catch (err: any) { + log.error('[SCRIPT_CODEGEN] Failed to process generated code:', err); + resolve({ success: false, error: err?.message || 'Failed to process generated code' }); + } + }); + + proc.on('error', (err) => { + log.error('[SCRIPT_CODEGEN] Failed to start codegen:', err); + resolve({ success: false, error: err.message }); + }); + }); + } catch (error: any) { + log.error('[SCRIPT_CODEGEN] error:', error); + return { success: false, error: error?.message || 'Codegen failed' }; + } + }); + // 打开渠道 ipcMain.handle(IPC_EVENTS.OPEN_CHANNEL, async (_event, channels: any) => { try { diff --git a/electron/scripts/scripts.meta.json b/electron/scripts/scripts.meta.json index d0d5ea2..aac604c 100644 --- a/electron/scripts/scripts.meta.json +++ b/electron/scripts/scripts.meta.json @@ -28,7 +28,12 @@ "enabled": true, "channel": "fliggy", "createdAt": "2026-04-09T19:35:34.000Z", - "updatedAt": "2026-04-09T19:35:34.000Z" + "updatedAt": "2026-04-12T12:59:12.117Z", + "lastRun": { + "time": "2026-04-12T12:59:12.117Z", + "success": false, + "error": "Script exited with code 1" + } }, { "id": "script-mt-trace", diff --git a/electron/service/script-recorder-service/index.ts b/electron/service/script-recorder-service/index.ts deleted file mode 100644 index ecb32d2..0000000 --- a/electron/service/script-recorder-service/index.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { chromium } from 'playwright'; -import log from 'electron-log'; -import { launchLocalChrome } from '@electron/utils/chrome/launchLocalChrome'; - -let recorderBrowser: any = null; -let recorderContext: any = null; - -export async function startRecording(url?: string): Promise<{ success: boolean; code?: string; error?: string }> { - try { - await launchLocalChrome(); - - if (recorderBrowser) { - await stopRecording(); - } - - recorderBrowser = await chromium.connectOverCDP('http://127.0.0.1:9222'); - recorderContext = recorderBrowser.contexts()[0] || (await recorderBrowser.newContext()); - const page = await recorderContext.newPage(); - const targetUrl = url || 'about:blank'; - await page.goto(targetUrl, { waitUntil: 'domcontentloaded' }); - - // 唤起 Playwright Inspector,让用户手动录制并生成代码 - await page.pause(); - - return { - success: true, - code: '', - }; - } catch (error: any) { - log.error('[script-recorder-service] Failed to start recording:', error); - return { - success: false, - error: error?.message || 'Failed to start recording', - }; - } -} - -export async function stopRecording(): Promise<{ success: boolean; code?: string; error?: string }> { - try { - if (recorderContext) { - await recorderContext.close().catch(() => {}); - recorderContext = null; - } - if (recorderBrowser) { - await recorderBrowser.close().catch(() => {}); - recorderBrowser = null; - } - return { success: true, code: '' }; - } catch (error: any) { - log.error('[script-recorder-service] Failed to stop recording:', error); - return { - success: false, - error: error?.message || 'Failed to stop recording', - }; - } -} diff --git a/global.d.ts b/global.d.ts index 6ee31dd..c7e23d5 100644 --- a/global.d.ts +++ b/global.d.ts @@ -88,6 +88,10 @@ declare global { params: [] return: Promise<{ success: boolean; code?: string; error?: string }> } + [IPC_EVENTS.SCRIPT_CODEGEN]: { + params: [id: string, url?: string] + return: Promise<{ success: boolean; code?: string; error?: string }> + } } type TabId = string @@ -142,6 +146,7 @@ declare global { run: (id: string) => Promise, startRecording: (url?: string) => Promise<{ success: boolean; code?: string; error?: string }>, stopRecording: () => Promise<{ success: boolean; code?: string; error?: string }>, + codegen: (id: string, url?: string) => Promise<{ success: boolean; code?: string; error?: string }>, }, } diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 7ce1c25..55b1355 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -68,6 +68,7 @@ export enum IPC_EVENTS { SCRIPT_RUN = 'script:run', SCRIPT_RECORD_START = 'script:record-start', SCRIPT_RECORD_STOP = 'script:record-stop', + SCRIPT_CODEGEN = 'script:codegen', // 更新 UPDATE_CHECK = 'update:check', diff --git a/src/lib/script-api.ts b/src/lib/script-api.ts index 06a9fdd..f0bb88a 100644 --- a/src/lib/script-api.ts +++ b/src/lib/script-api.ts @@ -15,4 +15,6 @@ export const scriptApi = { window.api.scriptApi.startRecording(url), stopRecording: (): Promise<{ success: boolean; code?: string; error?: string }> => window.api.scriptApi.stopRecording(), + codegen: (id: string, url?: string): Promise<{ success: boolean; code?: string; error?: string }> => + window.api.scriptApi.codegen(id, url), }; diff --git a/src/pages/scripts/components/ScriptCreateDialog.vue b/src/pages/scripts/components/ScriptCreateDialog.vue index 6fd572e..262fd2c 100644 --- a/src/pages/scripts/components/ScriptCreateDialog.vue +++ b/src/pages/scripts/components/ScriptCreateDialog.vue @@ -71,7 +71,7 @@ :loading="saving" class="!rounded-full !px-6 !h-[42px] !text-[13px] !font-semibold" > - {{ saving ? t('common.saving', 'Saving...') : t('script.dialog.createTitle') }} + {{ saving ? t('common.saving', 'Saving...') : t('script.dialog.createAndRecord', '创建并录制') }} @@ -124,7 +124,6 @@ const form = ref({ name: '', description: '', channel: '', - enabled: true, }); function resetForm() { @@ -132,7 +131,6 @@ function resetForm() { name: '', description: '', channel: '', - enabled: true, }; } @@ -149,7 +147,7 @@ function handleSubmit() { description: form.value.description.trim(), code: defaultScriptTemplate, channel: form.value.channel, - enabled: form.value.enabled, + enabled: true, }; emit('save', payload); visible.value = false; diff --git a/src/pages/scripts/index.vue b/src/pages/scripts/index.vue index ab16080..1f99dc3 100644 --- a/src/pages/scripts/index.vue +++ b/src/pages/scripts/index.vue @@ -193,7 +193,7 @@ function openEditDialog(script: AutomationScript) { } function handleCreateDialogClose() { - editingScript.value = undefined; + // editingScript lifecycle is handled by handleSave / handleEditDialogClose } function handleEditDialogClose() { @@ -207,8 +207,17 @@ async function handleSave(input: ScriptSaveInput) { await store.saveScript(input); ElMessage.success(t('script.toast.updated')); } else { - await store.saveScript(input); + const result = await store.saveScript(input); ElMessage.success(t('script.toast.created')); + ElMessage.info(t('script.toast.codegenStarting', '正在启动 Playwright codegen 录制,请在新窗口中操作,完成后关闭窗口即可自动保存代码')); + const codegenResult = await store.codegen(result.id, input.channel || 'about:blank'); + if (codegenResult.success) { + ElMessage.success(t('script.toast.codegenFinished', '录制完成,代码已保存')); + editingScript.value = { ...result, code: codegenResult.code || '' }; + editDialogVisible.value = true; + } else { + ElMessage.error(codegenResult.error || t('script.toast.codegenFailed', '录制失败')); + } } } catch (err) { const msg = err instanceof Error ? err.message : String(err); diff --git a/src/store/script.ts b/src/store/script.ts index c65698b..3e78701 100644 --- a/src/store/script.ts +++ b/src/store/script.ts @@ -140,6 +140,20 @@ export const useScriptStore = defineStore('script', () => { recordingStatus.value = 'idle'; }; + const codegen = async (id: string, url?: string) => { + try { + const result = await scriptApi.codegen(id, url); + if (!result.success) { + error.value = result.error || 'Codegen failed'; + } + return result; + } catch (err) { + const msg = err instanceof Error ? err.message : String(err); + error.value = msg; + throw err; + } + }; + return { scripts, loading, @@ -157,5 +171,6 @@ export const useScriptStore = defineStore('script', () => { startRecording, stopRecording, resetRecording, + codegen, }; }); diff --git a/vite.config.ts b/vite.config.ts index 68b1631..8fb3e2f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -72,6 +72,9 @@ export default defineConfig(({ mode, command }) => { rollupOptions: { external: isMainProcessExternal, }, + watch: { + exclude: ['**/electron/scripts/**', '**/scripts.meta.json'], + }, }, resolve: { alias: { @@ -100,6 +103,9 @@ export default defineConfig(({ mode, command }) => { entryFileNames: 'preload.js', }, }, + watch: { + exclude: ['**/electron/scripts/**', '**/scripts.meta.json'], + }, }, resolve: { alias: { @@ -139,6 +145,9 @@ export default defineConfig(({ mode, command }) => { server: { port: 5173, + watch: { + ignored: ['**/electron/scripts/**', '**/scripts.meta.json'], + }, proxy: { '/ingress': { target: 'http://8.138.234.141',