From 8902e59c2a617a9c4b3527a6c704b972906b4e5b Mon Sep 17 00:00:00 2001 From: DEV_DSW <562304744@qq.com> Date: Thu, 19 Mar 2026 11:14:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=80=E9=94=AE?= =?UTF-8?q?=E6=89=93=E5=BC=80=E6=B8=A0=E9=81=93=E5=87=BA=E7=8E=B0=E6=97=A0?= =?UTF-8?q?=E5=85=B3=E6=A0=87=E7=AD=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PROJECT_OVERVIEW.md | 92 +++++++++++++++++++ package-lock.json | 85 ++++++++++------- src/main/scripts/open_all_channel.mjs | 2 +- .../service/execute-script-service/index.ts | 2 +- src/main/utils/chrome/launchLocalChrome.ts | 3 +- 5 files changed, 150 insertions(+), 34 deletions(-) create mode 100644 PROJECT_OVERVIEW.md diff --git a/PROJECT_OVERVIEW.md b/PROJECT_OVERVIEW.md new file mode 100644 index 0000000..28c56b7 --- /dev/null +++ b/PROJECT_OVERVIEW.md @@ -0,0 +1,92 @@ +# 项目概览:zn-ai (智念AI) + +**zn-ai** 是一款基于 Electron 和 Vue 3 构建的桌面应用程序,旨在自动化处理各类酒店管理平台(OTA)的任务,如飞猪、美团、抖音和携程/去哪儿。它结合了传统的浏览器自动化技术(通过 Playwright)与 AI 能力(集成 OpenAI),以提供智能辅助功能。 + +## 技术栈 + +* **核心框架**: Electron (v38), TypeScript +* **前端**: Vue 3, Vite, TailwindCSS, Element Plus +* **自动化**: Playwright (通过 CDP 连接), Node.js 子进程 +* **AI 集成**: OpenAI SDK (流式对话补全) +* **构建工具**: Electron Forge, Vite +* **状态管理**: Pinia +* **持久化存储**: electron-store, dexie (IndexedDB 封装) + +## 项目结构 + +### `src/main` (主进程) +处理应用生命周期、窗口管理、IPC 通信以及任务编排。 + +* **`process/`**: 包含核心业务逻辑。 + * `runTaskOperationService.ts`: 管理任务操作,启动本地 Chrome,并执行自动化脚本。 + * `runAgentService.ts`: AI Agent 执行的占位符/入口。 +* **`service/`**: 各种功能的模块化服务。 + * `execute-script-service/`: 启动 Node.js 子进程以安全地运行自动化脚本。 + * `config-service/`: 管理应用程序配置。 + * `logger/`: 使用 `electron-log` 进行集中式日志记录。 + * `window-service/`: 管理 Electron 窗口。 +* **`providers/`**: AI 模型提供商。 + * `OpenAIProvider.ts`: 支持流式传输的 OpenAI 对话补全实现。 +* **`scripts/`**: 由主进程执行的自动化脚本。 + * `fg_trace.mjs`: 飞猪自动化脚本。 + * `mt_trace.mjs`: 美团自动化脚本。 + * `dy_hotel_trace.mjs` / `dy_hot_spring_trace.mjs`: 抖音自动化脚本。 + * `xc_trace.mjs`: 携程/去哪儿自动化脚本。 + * `open_all_channel.mjs`: 在浏览器中打开所有已配置渠道的脚本。 + * `common/tabs.js`: 用于连接 Chrome 并智能管理/复用标签页的工具。 +* **`utils/chrome/`**: Chrome 管理助手。 + * `launchLocalChrome.ts`: 启动带有 `--remote-debugging-port=9222` 参数的本地 Chrome 实例。 + +### `src/renderer` (渲染进程) +使用 Vue 3 构建的用户界面。 + +* **`views/`**: Vue 页面组件。 + * `dashboard/`: 主仪表盘。 + * `home/`: 聊天界面(AI 交互)和任务中心。 + * `task/`: 任务管理视图。 + * `setting/`: 应用程序设置(账号、渠道、系统配置)。 +* **`components/`**: 可复用的 UI 组件(Header, SideMenus, TaskList)。 +* **`api/`**: 后端或 IPC 通信的 API 定义。 +* **`store/`**: 用于状态管理的 Pinia store(用户信息等)。 + +### `src/common` +主进程和渲染进程共用的常量、类型和工具。 + +## 核心功能与架构 + +### 1. 本地 Chrome 自动化 +本应用不使用 Electron 自带的浏览器进行自动化。相反,它会启动一个开启了远程调试(`--remote-debugging-port=9222`)的 **本地 Google Chrome 实例**。这使得自动化脚本能够挂载到一个“真实”的浏览器会话中,从而保留 Cookie、登录状态和扩展程序。 + +### 2. 任务执行流程 +1. **触发**: 用户从 UI 发起任务或打开渠道。 +2. **IPC**: 渲染进程向主进程发送 IPC 消息(`IPC_EVENTS.OPEN_CHANNEL` 或 `IPC_EVENTS.EXECUTE_SCRIPT`)。 +3. **服务**: `runTaskOperationService` 处理该请求。 + * 确保本地 Chrome 正在运行 (`launchLocalChrome`)。 + * 根据渠道或任务类型决定运行哪个脚本。 +4. **执行**: `executeScriptService` 启动一个独立的 Node.js 子进程(使用带有 `ELECTRON_RUN_AS_NODE` 的 `process.execPath`)来运行特定的 `.mjs` 脚本。 +5. **自动化**: 脚本(例如 `fg_trace.mjs`)使用 `playwright` 连接到 `http://127.0.0.1:9222`。 + * 它使用 `common/tabs.js` 查找目标 URL 的现有标签页或创建一个新标签页。 + * 它在页面上执行操作(导航、点击、抓取)。 + +### 3. 标签页管理策略 +`src/main/scripts/common/tabs.js` 模块提供了智能的标签页复用功能: +* **目标匹配**: 检查现有标签页是否匹配目标 URL 或源(Origin),以避免打开重复的标签页。 +* **空白页复用**: 如果可用,复用 `about:blank` 标签页。 +* **标签页索引**: 可以针对特定的标签页索引(用于有序打开渠道)。 +* **隐身模式 (Stealth)**: 注入脚本以隐藏自动化信号(`navigator.webdriver`)。 + +### 4. AI 集成 +应用程序集成了兼容 OpenAI 的 API(在 `OpenAIProvider` 中配置)以提供聊天功能。`home` 视图可能作为用户与 AI Agent 交互的界面,潜在用于指导任务或检索信息。 + +### 5. 渠道支持 +应用程序支持多个 OTA 渠道,配置在 `src/renderer/constant/channel.ts` 并在 `runTaskOperationService.ts` 中映射: +* **飞猪 (fz)** +* **美团 (mt)** +* **抖音 (dy)** - 酒店和温泉类别 +* **携程/去哪儿 (xc)** + +## 开发命令 + +* `npm start`: 以开发模式启动应用 (Electron + Vite HMR)。 +* `npm run package`: 打包应用程序以进行分发。 +* `npm run lint`: 对代码库进行 Lint 检查。 diff --git a/package-lock.json b/package-lock.json index 94cd2d1..762a5e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -686,7 +686,6 @@ "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "chalk": "^4.1.1", "fs-extra": "^9.0.1", @@ -1536,6 +1535,7 @@ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -1555,6 +1555,7 @@ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1565,6 +1566,7 @@ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1589,6 +1591,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1605,7 +1608,8 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@eslint/js": { "version": "8.57.1", @@ -1613,6 +1617,7 @@ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -1663,6 +1668,7 @@ "deprecated": "Use @eslint/config-array instead", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", @@ -1678,6 +1684,7 @@ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=12.22" }, @@ -1692,7 +1699,8 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "deprecated": "Use @eslint/object-schema instead", "dev": true, - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/@iconify-json/material-symbols": { "version": "1.2.50", @@ -1885,7 +1893,6 @@ "integrity": "sha512-yl43JD/86CIj3Mz5mvvLJqAOfIup7ncxfJ0Btnl0/v5TouVUyeEdcpknfgc+yMevS/48oH9WAkkw93m7otLb/A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@inquirer/checkbox": "^3.0.1", "@inquirer/confirm": "^4.0.1", @@ -3150,7 +3157,6 @@ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/lodash": "*" } @@ -3170,7 +3176,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.2.tgz", "integrity": "sha512-WOhQTZ4G8xZ1tjJTvKOpyEVSGgOTvJAfDK3FNFgELyaTpzhdgHVHeqW8V+UJvzF5BT+/B54T/1S2K6gd9c7bbA==", "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -3320,7 +3325,8 @@ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, - "license": "ISC" + "license": "ISC", + "peer": true }, "node_modules/@vitejs/plugin-vue": { "version": "6.0.3", @@ -3380,7 +3386,6 @@ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.25.tgz", "integrity": "sha512-PUgKp2rn8fFsI++lF2sO7gwO2d9Yj57Utr5yEsDf3GNaQcowCLKL7sf+LvVFvtJDXUp/03+dC6f2+LCv5aK1ag==", "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.28.5", "@vue/compiler-core": "3.5.25", @@ -3470,7 +3475,6 @@ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-14.1.0.tgz", "integrity": "sha512-rgBinKs07hAYyPF834mDTigH7BtPqvZ3Pryuzt1SD/lg5wEcWqvwzXXYGEDb2/cP0Sj5zSvHl3WkmMELr5kfWw==", "license": "MIT", - "peer": true, "dependencies": { "@types/web-bluetooth": "^0.0.21", "@vueuse/metadata": "14.1.0", @@ -3708,7 +3712,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3735,6 +3738,7 @@ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -3797,7 +3801,6 @@ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -4089,7 +4092,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -4814,7 +4816,8 @@ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/defaults": { "version": "1.0.4", @@ -4949,6 +4952,7 @@ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "esutils": "^2.0.2" }, @@ -6077,6 +6081,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6094,6 +6099,7 @@ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -6111,6 +6117,7 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=4.0" } @@ -6121,6 +6128,7 @@ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", + "peer": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -6133,7 +6141,8 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/esniff": { "version": "2.0.1", @@ -6157,6 +6166,7 @@ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -6175,6 +6185,7 @@ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", + "peer": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -6188,6 +6199,7 @@ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=4.0" } @@ -6241,6 +6253,7 @@ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -6480,7 +6493,8 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/fast-safe-stringify": { "version": "2.1.1", @@ -6550,6 +6564,7 @@ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -6621,6 +6636,7 @@ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -6980,6 +6996,7 @@ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -6996,6 +7013,7 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=10" }, @@ -7091,7 +7109,8 @@ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/has-flag": { "version": "4.0.0", @@ -7468,6 +7487,7 @@ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" } @@ -7659,7 +7679,8 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/json-stringify-safe": { "version": "5.0.1", @@ -7708,6 +7729,7 @@ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -8139,15 +8161,13 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash-es": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/lodash-unified": { "version": "1.0.3", @@ -8173,7 +8193,8 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/log-symbols": { "version": "4.1.0", @@ -8806,7 +8827,8 @@ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/negotiator": { "version": "0.6.4", @@ -9329,6 +9351,7 @@ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -9865,6 +9888,7 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">= 0.8.0" } @@ -9875,7 +9899,6 @@ "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -9950,6 +9973,7 @@ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=6" } @@ -11014,6 +11038,7 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=8" }, @@ -11139,8 +11164,7 @@ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/tapable": { "version": "2.3.0", @@ -11294,7 +11318,8 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/timers-ext": { "version": "0.1.8", @@ -11510,6 +11535,7 @@ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -11535,7 +11561,6 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11741,6 +11766,7 @@ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "punycode": "^2.1.0" } @@ -11802,7 +11828,6 @@ "integrity": "sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.5.0", @@ -12361,7 +12386,6 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.25.tgz", "integrity": "sha512-YLVdgv2K13WJ6n+kD5owehKtEXwdwXuj2TTyJMsO7pSeKw2bfRNZGjhB7YzrpbMYj5b5QsUebHpOqR3R3ziy/g==", "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.25", "@vue/compiler-sfc": "3.5.25", @@ -12488,7 +12512,6 @@ "integrity": "sha512-HU1JOuV1OavsZ+mfigY0j8d1TgQgbZ6M+J75zDkpEAwYeXjWSqrGJtgnPblJjd/mAyTNQ7ygw0MiKOn6etz8yw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", diff --git a/src/main/scripts/open_all_channel.mjs b/src/main/scripts/open_all_channel.mjs index 74b651e..ab418a9 100644 --- a/src/main/scripts/open_all_channel.mjs +++ b/src/main/scripts/open_all_channel.mjs @@ -109,7 +109,7 @@ const isBlankLikePage = (url) => { const pagesAfter = await context.pages(); for (const p of pagesAfter) { - if (!usedPages.has(p) && isBlankLikePage(p.url())) { + if (!usedPages.has(p)) { try { await p.close(); } catch {} diff --git a/src/main/service/execute-script-service/index.ts b/src/main/service/execute-script-service/index.ts index e1593b9..76c4b32 100644 --- a/src/main/service/execute-script-service/index.ts +++ b/src/main/service/execute-script-service/index.ts @@ -29,7 +29,6 @@ export class executeScriptService extends EventEmitter { const child = spawn(process.execPath, [scriptPath], { env: { ...process.env, - ELECTRON_RUN_AS_NODE: '1', ROOM_TYPE: String(roomType), START_DATE: String(startTime), END_DATE: String(endTime), @@ -38,6 +37,7 @@ export class executeScriptService extends EventEmitter { CHANNELS: typeof channels === 'string' ? channels : JSON.stringify(channels), START_TAB_INDEX: String(startTabIndex), }, + stdio: 'inherit' }); let stdoutTail = ''; diff --git a/src/main/utils/chrome/launchLocalChrome.ts b/src/main/utils/chrome/launchLocalChrome.ts index 2ae8bbb..d4193b1 100644 --- a/src/main/utils/chrome/launchLocalChrome.ts +++ b/src/main/utils/chrome/launchLocalChrome.ts @@ -33,7 +33,8 @@ export async function launchLocalChrome() { '--window-position=0,0', '--no-first-run', `--user-data-dir=${profileDir}`, - '--no-default-browser-check' + '--no-default-browser-check', + 'about:blank' // '--window-maximized', ], { detached: true,