9 Commits

Author SHA1 Message Date
Minoricew
b8f27d9f7c [ Feat / 🛠️ Fix] Auto hide desktopAssistant & Fix #26
1. [/] 修改了 Header Icon 的隐藏方式, 尝试修复 #26
2. [+] 现在可以隐藏管家助手 (桌面右下角小窗) 了
3. [⇡] Bump version to v0.1.1-beta
2025-06-20 00:45:11 +08:00
Minoricew
807ac913da [🤯 Refactor] Use standalone window for WebSocket connections
1. [-] 删除了对于 desktopAssistant 的 Hook 逻辑
2. [/] 现在不再使用 desktopAssistant 保活 WS 连接, 而是用一个单独的不可见窗口处理 WS (#25)
2025-06-17 18:14:58 +08:00
Minoricew
f6a30351fd [🛠️ Fix] Change the logic of determining isEncConfig
1. [/] 修正了识别配置文件加密状态时的逻辑错误
2025-06-17 00:50:54 +08:00
Minoricew
0494394fd8 [🛠️ Fix] Emergency fix for invalid config read logic
1. [/] 紧急修复了上个 commit 中引入的错误路径获取逻辑
2025-06-17 00:16:43 +08:00
Minoricew
6be31652f9 [🛠️ Fix] 不好意思脑子抽了 2025-06-16 21:41:07 +08:00
Minoricew
a638a29cc6 [🛠️ Fix] Invalid log dir path (#24) & Remove PLS trust token
1. [-] 删除了 PLS 的 Trust token 认证机制
2. [+] 现在可以在 `偏好设置` - `调试选项` 中直接打开日志文件夹了
3. [/] 日志目录不再使用 `%USERPROFILE%\Documents\HugoAura\logs` 为基准, 而是从注册表获取值
4. [/] 配置文件目录同理, 旧版配置文件将会自动迁移到新位置
2025-06-16 21:32:15 +08:00
Minoricew
dae0f033a5 [🔁 Chore] Add forum links into README & issue template 2025-06-16 01:02:40 +08:00
Minoricew
bd2f2e4154 [ Feat] Add AppBar buttons pos customize options
1. [+] 允许用户自定义应用栏上操作类按钮的位置
2025-06-14 18:44:34 +08:00
Minoricew
290cbfed53 [🔁 Chore] Auto upload release for workflow 2025-06-14 17:01:51 +08:00
35 changed files with 640 additions and 116 deletions

View File

@@ -16,5 +16,5 @@ body:
attributes: attributes:
label: 提交前请确认 / Confirm before submit label: 提交前请确认 / Confirm before submit
options: options:
- label: 请勿利用此 Issue 类型进行灌水 / 闲聊, 如果您有相关需求, 可留意后续 HugoAura 的论坛 / 用户讨论群开放情况 - label: 请勿利用此 Issue 类型进行闲聊 / 灌水, 如需闲聊, 可移步至 HugoAura 社区 (forum.aurax.cc)
required: true required: true

View File

@@ -7,6 +7,8 @@ on:
branches: [dev, stable, main, master] branches: [dev, stable, main, master]
workflow_dispatch: workflow_dispatch:
permissions: write-all
jobs: jobs:
pack: pack:
name: Patch & Pack name: Patch & Pack
@@ -123,6 +125,33 @@ jobs:
echo "[DEBUG] Files in <Working DIR>/Artifacts directory:" echo "[DEBUG] Files in <Working DIR>/Artifacts directory:"
ls -la Artifacts/ ls -la Artifacts/
- name: Get commit hash & build time
run: |
cd ./HugoAura-Code
SHORT_HASH=$(git rev-parse --short=7 HEAD)
FULL_HASH=$(git rev-parse HEAD)
echo "SHORT_HASH=$SHORT_HASH" >> $GITHUB_ENV
echo "FULL_HASH=$FULL_HASH" >> $GITHUB_ENV
echo "BUILDTIME=$(TZ=Asia/Shanghai date)" >> $GITHUB_ENV
- name: Create release content
run: |
cat > rel_msg.txt << 'EOF'
## 这是 HugoAura 的 CI 自动构建版本
### 版本类型: 🔁 自动构建版
### 版本号: `vAutoBuild-${{ env.SHORT_HASH }}`
### 对应 Commit: [`${{ env.SHORT_HASH }}`](https://github.com/HugoAura/Seewo-HugoAura/commit/${{ env.FULL_HASH }})
---
### ⚠ 注意: CI 自动构建版本可能不稳定 / 存在较多 Bug, 更新时请留意
#### 🕘 构建时间: ${{ env.BUILDTIME }}
EOF
- name: Upload patched ASAR - name: Upload patched ASAR
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
@@ -134,3 +163,16 @@ jobs:
with: with:
name: aura-code name: aura-code
path: Artifacts/aura.zip path: Artifacts/aura.zip
- name: Upload release
uses: softprops/action-gh-release@v2
with:
tag_name: vAutoBuild
name: "[CI] HugoAura Auto Build Release"
body_path: rel_msg.txt
prerelease: true
generate_release_notes: false
token: ${{ secrets.GITHUB_TOKEN }}
files: |
Artifacts/app-patched.asar
Artifacts/aura.zip

View File

@@ -3,7 +3,7 @@
<h1 align="center">HugoAura</h1> <h1 align="center">HugoAura</h1>
<h4 align="center">下一代希沃管家注入式修改方案</h4> <h4 align="center">下一代希沃管家注入式修改方案</h4>
<div align="center"> <div align="center">
<a href="https://github.com/HugoAura/HugoAura">首页</a> · <a href="https://hugoaura.org/about">关于</a> · <a href="https://github.com/HugoAura/HugoAura/wiki">文档</a> · <a href="https://github.com/HugoAura/HugoAura/issues">反馈</a> <a href="https://github.com/HugoAura/HugoAura">首页</a> · <a href="https://hugo.aurax.cc/about">关于</a> · <a href="https://github.com/HugoAura/HugoAura/wiki">文档</a> · <a href="https://github.com/HugoAura/HugoAura/issues">反馈</a> · <a href="https://forum.aurax.cc/">社区</a>
</div> </div>
<br /> <br />

View File

@@ -1,6 +1,6 @@
{ {
"name": "HugoAura", "name": "HugoAura",
"version": "0.1.1-pre-IV", "version": "0.1.1-beta",
"description": "Aura for SeewoHugo", "description": "Aura for SeewoHugo",
"main": "app.asar/main.js", "main": "app.asar/main.js",
"dependencies": {}, "dependencies": {},

View File

@@ -77,6 +77,7 @@ const buildIpcMain = (electron) => {
}; };
const { applyBaseIpcHandler } = require("./ipcModules/baseIpcHandler"); const { applyBaseIpcHandler } = require("./ipcModules/baseIpcHandler");
const { applyDebugIpcHandler } = require("./ipcModules/debugIpcHandler");
const { applyConfigIpcHandler } = require("./ipcModules/configIpcHandler"); const { applyConfigIpcHandler } = require("./ipcModules/configIpcHandler");
const { applyFsIpcHandler } = require("./ipcModules/fsIpcHandler"); const { applyFsIpcHandler } = require("./ipcModules/fsIpcHandler");
const { applyPlsIpcHandler } = require("./ipcModules/plsIpcHandler"); const { applyPlsIpcHandler } = require("./ipcModules/plsIpcHandler");
@@ -87,6 +88,7 @@ const buildIpcMain = (electron) => {
}); });
applyBaseIpcHandler(ipcMain); applyBaseIpcHandler(ipcMain);
applyDebugIpcHandler(ipcMain);
applyConfigIpcHandler(ipcMain); applyConfigIpcHandler(ipcMain);
applyFsIpcHandler(ipcMain); applyFsIpcHandler(ipcMain);
applyPlsIpcHandler(ipcMain); applyPlsIpcHandler(ipcMain);

View File

@@ -1,59 +1,73 @@
// @ts-check // @ts-check
const { BrowserWindow } = require("electron"); const { BrowserWindow } = require("electron");
const composables = { const composables = {
getBrowserWindowInstance: (windowKey) => { getBrowserWindowInstance: (windowKey) => {
if (!global.__HUGO_AURA__.hookedWindows) return null; if (!global.__HUGO_AURA__.hookedWindows) return null;
const hookedWindowIns = global.__HUGO_AURA__.hookedWindows.get(windowKey); const hookedWindowIns = global.__HUGO_AURA__.hookedWindows.get(windowKey);
if (!hookedWindowIns) return undefined; if (!hookedWindowIns) return undefined;
const browserWindowIns = BrowserWindow.fromWebContents( const browserWindowIns = BrowserWindow.fromWebContents(
hookedWindowIns.webContents hookedWindowIns.webContents
); );
return browserWindowIns; return browserWindowIns;
}, },
}; };
/** /**
* *
* @param {import("electron").IpcMain} ipcMain * @param {import("electron").IpcMain} ipcMain
*/ */
const applyBaseIpcHandler = (ipcMain) => { const applyBaseIpcHandler = (ipcMain) => {
const methodBase = "$aura.base"; const methodBase = "$aura.base";
ipcMain.on( ipcMain.on(
`${methodBase}.minimizeWindow`, `${methodBase}.minimizeWindow`,
/** /**
* *
* @param {import("electron").IpcMainEvent} _event * @param {import("electron").IpcMainEvent} _event
* @param {{ targetWindowKey: string }} arg * @param {{ targetWindowKey: string }} arg
*/ */
(_event, arg) => { (_event, arg) => {
const browserWindowIns = composables.getBrowserWindowInstance( const browserWindowIns = composables.getBrowserWindowInstance(
arg.targetWindowKey arg.targetWindowKey
); );
if (!browserWindowIns) return; if (!browserWindowIns) return;
browserWindowIns.minimize(); browserWindowIns.minimize();
} }
); );
ipcMain.on( ipcMain.on(
`${methodBase}.closeWindow`, `${methodBase}.closeWindow`,
/** /**
* *
* @param {import("electron").IpcMainEvent} _event * @param {import("electron").IpcMainEvent} _event
* @param {{ targetWindowKey: string }} arg * @param {{ targetWindowKey: string }} arg
*/ */
(_event, arg) => { (_event, arg) => {
const browserWindowIns = composables.getBrowserWindowInstance( const browserWindowIns = composables.getBrowserWindowInstance(
arg.targetWindowKey arg.targetWindowKey
); );
if (!browserWindowIns) return; if (!browserWindowIns) return;
browserWindowIns.close(); browserWindowIns.close();
} }
); );
};
ipcMain.handle(`${methodBase}.getAuraDirAsync`, (_evt, _arg) => {
module.exports = { applyBaseIpcHandler }; return {
success: true,
data: global.__HUGO_AURA__.auraDir,
};
});
ipcMain.on(`${methodBase}.getAuraDirSync`, (event, _arg) => {
event.returnValue = {
success: true,
data: global.__HUGO_AURA__.auraDir,
};
});
};
module.exports = { applyBaseIpcHandler };

View File

@@ -0,0 +1,13 @@
// @ts-check
const __SCOPE = "main";
/**
*
* @param {import("electron").IpcMain} ipcMain
*/
const applyDebugIpcHandler = (ipcMain) => {
const methodBase = "$aura.debug";
};
module.exports = { applyDebugIpcHandler };

View File

@@ -418,7 +418,7 @@ const applyPlsIpcHandler = (ipcMain) => {
*/ */
(_event, arg) => { (_event, arg) => {
ipcMain.send( ipcMain.send(
"desktopAssistant", "auraWsKeepAlive",
`${methodBase}.ws.post.onReqSendMsg`, `${methodBase}.ws.post.onReqSendMsg`,
arg arg
); );
@@ -568,7 +568,7 @@ const applyPlsIpcHandler = (ipcMain) => {
status: "Already", status: "Already",
}; };
} else { } else {
ipcMain.send("desktopAssistant", `${methodBase}.retryPlsConnect`, arg); ipcMain.send("auraWsKeepAlive", `${methodBase}.retryPlsConnect`, arg);
return { return {
success: true, success: true,

View File

@@ -8,7 +8,10 @@ const util = require("util");
* @param {import("../aura/types/main/core").WindowName} windowName * @param {import("../aura/types/main/core").WindowName} windowName
*/ */
const initLogger = (windowName) => { const initLogger = (windowName) => {
const logDir = path.join(os.homedir(), "Documents", "HugoAura", "logs"); const logDir = path.join(global.__HUGO_AURA__.auraDir, "logs");
global.__HUGO_AURA__.logDir = logDir;
if (!fs.existsSync(logDir)) { if (!fs.existsSync(logDir)) {
fs.mkdirSync(logDir, { recursive: true }); fs.mkdirSync(logDir, { recursive: true });
} }
@@ -64,25 +67,22 @@ const initLogger = (windowName) => {
console.error("[CRITICAL] UNCAUGHT EXCEPTION:", err); console.error("[CRITICAL] UNCAUGHT EXCEPTION:", err);
}); });
console.log( console.log("[HugoAura / Logger] Logger initialized. Log file:", logFile);
"[HugoAura / Logger] Logger initialized. Log file:",
logFile
);
}; };
const cleanupOldLogs = (logDir) => { const cleanupOldLogs = (logDir) => {
try { try {
const files = fs.readdirSync(logDir); const files = fs.readdirSync(logDir);
const now = new Date(); const now = new Date();
const sevenDaysAgo = new Date(now.getTime() - 30 * 24 * 60 * 60 * 1000); const daysAgo = new Date(now.getTime() - 15 * 24 * 60 * 60 * 1000);
files.forEach((file) => { files.forEach((file) => {
if (file.endsWith(".log")) { if (file.endsWith(".log")) {
const filePath = path.join(logDir, file); const filePath = path.join(logDir, file);
const stats = fs.statSync(filePath); const stats = fs.statSync(filePath);
// 如果文件创建时间超过 30 天, 则删除 // 如果文件创建时间超过两周, 则删除
if (stats.birthtime < sevenDaysAgo) { if (stats.birthtime < daysAgo) {
fs.unlinkSync(filePath); fs.unlinkSync(filePath);
console.log( console.log(
`[HugoAura / Logger / Cleanup] Cleaned log file: ${file}` `[HugoAura / Logger / Cleanup] Cleaned log file: ${file}`
@@ -91,7 +91,10 @@ const cleanupOldLogs = (logDir) => {
} }
}); });
} catch (error) { } catch (error) {
console.error("[HugoAura / Logger / Cleanup] Unexpected error occurred cleaning log file:", error); console.error(
"[HugoAura / Logger / Cleanup] Unexpected error occurred cleaning log file:",
error
);
} }
}; };

View File

@@ -14,7 +14,7 @@ class WindowHooksManager {
const hooksPath = path.join(__dirname, "../../../aura/mainProcess/hooks"); const hooksPath = path.join(__dirname, "../../../aura/mainProcess/hooks");
/** @type {import("../../types/main/core").HooksMap} */ /** @type {import("../../types/main/core").UIHooksMap} */
const hooks = new Map(); const hooks = new Map();
try { try {
@@ -55,6 +55,9 @@ class WindowHooksManager {
browserWindowInstance browserWindowInstance
) { ) {
const stripWindowName = windowName.split("_")[0]; const stripWindowName = windowName.split("_")[0];
if (!global.__HUGO_AURA__.windowHooks) return;
if (!global.__HUGO_AURA__.windowHooks.has(stripWindowName)) { if (!global.__HUGO_AURA__.windowHooks.has(stripWindowName)) {
console.log( console.log(
`[HugoAura / Init / WDH] Window ${windowName} has no corresponding main process hooks, ignoring...` `[HugoAura / Init / WDH] Window ${windowName} has no corresponding main process hooks, ignoring...`

View File

@@ -69,7 +69,7 @@ const deepMerge = (target, source) => {
class ConfigManager { class ConfigManager {
constructor() { constructor() {
this.configDir = path.join(os.homedir(), "Documents", "HugoAura"); this.configDir = global.__HUGO_AURA__.auraDir;
this.configPath = path.join(this.configDir, "config.json"); this.configPath = path.join(this.configDir, "config.json");
this.encConfigPath = path.join(this.configDir, ".cache_2eafc8d0.dat"); // (雾 this.encConfigPath = path.join(this.configDir, ".cache_2eafc8d0.dat"); // (雾
/* ↑ 不使用 .tmp 扩展名, 不然容易真被清理了 */ /* ↑ 不使用 .tmp 扩展名, 不然容易真被清理了 */
@@ -78,10 +78,10 @@ class ConfigManager {
this.isConfigReadFailed = false; this.isConfigReadFailed = false;
this.side = "unknown"; this.side = "unknown";
if (fs.existsSync(this.configPath)) { if (fs.existsSync(this.encConfigPath)) {
this.useEncConfig = false;
} else {
this.useEncConfig = true; this.useEncConfig = true;
} else {
this.useEncConfig = false;
} }
if (global.__HUGO_AURA_EVENT_BUS__) { if (global.__HUGO_AURA_EVENT_BUS__) {
@@ -95,6 +95,38 @@ class ConfigManager {
} }
} }
migrateOldConfigFile() {
if (this.configDir === path.join(os.homedir(), "Documents", "HugoAura")) {
return;
}
const oldConfigPath = path.join(
os.homedir(),
"Documents",
"HugoAura",
"config.json"
);
const oldEncConfigPath = path.join(
os.homedir(),
"Documents",
"HugoAura",
".cache_2eafc8d0.dat"
);
if (fs.existsSync(oldConfigPath)) {
fs.copyFileSync(oldConfigPath, this.configPath);
fs.unlinkSync(oldConfigPath);
} else if (fs.existsSync(oldEncConfigPath)) {
fs.copyFileSync(oldEncConfigPath, this.encConfigPath);
fs.unlinkSync(oldEncConfigPath);
this.useEncConfig = true;
}
console.log(
`[HugoAura / Config] Moved old config file to ${this.configDir}`
);
}
getHugoAuraConfigPath() { getHugoAuraConfigPath() {
return path.dirname( return path.dirname(
this.useEncConfig ? this.encConfigPath : this.configPath this.useEncConfig ? this.encConfigPath : this.configPath

View File

@@ -26,11 +26,23 @@
"enabled": true "enabled": true
} }
}, },
"ssa": {
"ux": {
"easiAssistant": {
"autoHide": false,
"notDisplay": false
}
}
},
"auraSettings": { "auraSettings": {
"settingsPasswordEnabled": false, "settingsPasswordEnabled": false,
"settingsPasswordWithSalt": "32703D292460CC9A3B867494D6AD9A8E4A3ADF0FAA4D6867BC4D412CC3927D02E47C6D0B1763BB53E57B2241C6193433561CDA09D7C48CA03983072B876F0965", "settingsPasswordWithSalt": "32703D292460CC9A3B867494D6AD9A8E4A3ADF0FAA4D6867BC4D412CC3927D02E47C6D0B1763BB53E57B2241C6193433561CDA09D7C48CA03983072B876F0965",
"encryptConfig": false, "encryptConfig": false,
"appearance": {}, "appearance": {
"appBar": {
"actionBtnsOnRight": false
}
},
"uiAccessMethod": { "uiAccessMethod": {
"showEntryIcon": true, "showEntryIcon": true,
"fallbackAccessMethods": { "fallbackAccessMethods": {

View File

@@ -6,7 +6,12 @@ const { exec, execSync } = require("child_process");
const LOG_PREFIX = "[HugoAura / Init / Reg"; const LOG_PREFIX = "[HugoAura / Init / Reg";
const LOG_PREFIX_FUNC = "[HugoAura / Reg"; const LOG_PREFIX_FUNC = "[HugoAura / Reg";
const AURA_REGISTRY_PATH = ["HKEY_USERS", ".DEFAULT", "SOFTWARE", "HugoAura"].join("\\"); const AURA_REGISTRY_PATH = [
"HKEY_USERS",
".DEFAULT",
"SOFTWARE",
"HugoAura",
].join("\\");
class RegistryManager { class RegistryManager {
/** /**
@@ -341,19 +346,27 @@ class RegistryManager {
} }
/** /**
* @param {string} relativePath * @param {string} keyPath
* @param {string} keyName * @param {string} keyName
* @param {boolean | undefined} silent * @param {boolean | undefined} silent
* @param {boolean} absolute
* @param {any} regex
* @returns {Promise<{ success: boolean, data: string | null, error: Error | null }>} * @returns {Promise<{ success: boolean, data: string | null, error: Error | null }>}
*/ */
async readRegKey(relativePath, keyName, silent = false) { async readRegKey(
keyPath,
keyName,
silent = false,
absolute = false,
regex = null
) {
try { try {
const { stdout } = await new Promise((resolve, reject) => { const { stdout } = await new Promise((resolve, reject) => {
exec( exec(
[ [
"reg", "reg",
"query", "query",
[AURA_REGISTRY_PATH, relativePath].join("\\"), absolute ? keyPath : [AURA_REGISTRY_PATH, keyPath].join("\\"),
"/v", "/v",
`\"${keyName}\"`, `\"${keyName}\"`,
].join(" "), ].join(" "),
@@ -367,12 +380,12 @@ class RegistryManager {
if (!silent) { if (!silent) {
console.debug( console.debug(
`${LOG_PREFIX_FUNC} / SUCCESS] Successfully read reg key ${relativePath}/${keyName}, stdout:`, `${LOG_PREFIX_FUNC} / SUCCESS] Successfully read reg key ${keyPath}/${keyName}, stdout:`,
stdout stdout
); );
} }
const match = stdout.match(/REG_SZ\s+(.+)/); const match = regex ? stdout.match(regex) : stdout.match(/REG_SZ\s+(.+)/);
if (!match) { if (!match) {
console.warn(`${LOG_PREFIX} / WARN] Data not found in stdout`); console.warn(`${LOG_PREFIX} / WARN] Data not found in stdout`);
@@ -390,10 +403,7 @@ class RegistryManager {
error: null, error: null,
}; };
} catch (e) { } catch (e) {
console.error( console.error(`${LOG_PREFIX} / ERROR] Failed to read reg key, error:`, e);
`${LOG_PREFIX} / ERROR] Failed to read reg key, error:`,
e
);
return { return {
success: false, success: false,
data: null, data: null,
@@ -403,18 +413,26 @@ class RegistryManager {
} }
/** /**
* @param {string} relativePath * @param {string} keyPath
* @param {string} keyName * @param {string} keyName
* @param {boolean | undefined} silent * @param {boolean | undefined} silent
* @param {boolean} absolute
* @param {any} regex
* @returns {{ success: boolean, data: string | null, error: Error | null }} * @returns {{ success: boolean, data: string | null, error: Error | null }}
*/ */
readRegKeySync(relativePath, keyName, silent = false) { readRegKeySync(
keyPath,
keyName,
silent = false,
absolute = false,
regex = null
) {
try { try {
const readResult = execSync( const readResult = execSync(
[ [
"reg", "reg",
"query", "query",
[AURA_REGISTRY_PATH, relativePath].join("\\"), absolute ? keyPath : [AURA_REGISTRY_PATH, keyPath].join("\\"),
"/v", "/v",
`\"${keyName}\"`, `\"${keyName}\"`,
].join(" "), ].join(" "),
@@ -424,11 +442,13 @@ class RegistryManager {
if (readResult) { if (readResult) {
if (!silent) { if (!silent) {
console.debug( console.debug(
`${LOG_PREFIX_FUNC} / SUCCESS] Successfully read reg key ${relativePath}/${keyName}, stdout:`, `${LOG_PREFIX_FUNC} / SUCCESS] Successfully read reg key ${keyPath}/${keyName}, stdout:`,
readResult readResult
); );
} }
const match = readResult.match(/REG_SZ\s+(.+)/); const match = regex
? readResult.match(regex)
: readResult.match(/REG_SZ\s+(.+)/);
if (!match) { if (!match) {
console.warn(`${LOG_PREFIX} / WARN] Data not found in stdout`); console.warn(`${LOG_PREFIX} / WARN] Data not found in stdout`);

View File

@@ -8,7 +8,7 @@ interface AssistantHugoAuraGlobal extends HugoAuraGlobal {
plsSettings: Record<any, any>; plsSettings: Record<any, any>;
} }
interface DesktopAssistantHugoAuraGlobal extends HugoAuraGlobal { interface AuraWSKeepAliveWindowHugoAuraGlobal extends HugoAuraGlobal {
plsWs: WebSocket | null; plsWs: WebSocket | null;
plsStats: PLSStatus; plsStats: PLSStatus;
} }

View File

@@ -14,6 +14,7 @@ interface GlobalHugoAuraInfo {
fsTasks?: MainProcessOnlyVal<FSTasks>; fsTasks?: MainProcessOnlyVal<FSTasks>;
hookedWindows?: MainProcessOnlyVal<HookedWindowsMap>; hookedWindows?: MainProcessOnlyVal<HookedWindowsMap>;
ipcInit?: MainProcessOnlyVal<boolean>; ipcInit?: MainProcessOnlyVal<boolean>;
auraDir: MainProcessOnlyVal<string>;
plsRules?: Record<any, any> | null; plsRules?: Record<any, any> | null;
plsSettings?: Record<any, any> | null; plsSettings?: Record<any, any> | null;
plsStats?: PLSStatus | null; plsStats?: PLSStatus | null;

View File

@@ -170,6 +170,23 @@ const renderInputArea = (entry, operationArea, descriptionArea) => {
operationArea.classList.add("ase-operation-area-expanded"); operationArea.classList.add("ase-operation-area-expanded");
return inputEl; return inputEl;
} }
case "button": {
const btnEl = document.createElement("button");
btnEl.type = "button";
btnEl.classList.add("btn");
switch (entry.style) {
case "outline":
default:
btnEl.classList.add("btn-outline-primary");
break;
}
btnEl.innerHTML = entry.buttonContent;
btnEl.onclick = entry.callbackFn;
(async () => {
descriptionArea.innerHTML = await entry.valueGetter();
})();
return btnEl;
}
default: default:
break; break;
} }

2
src/aura/ui/hookDefinitions/desktopAssistant.js Executable file → Normal file
View File

@@ -6,7 +6,7 @@
const def = { const def = {
targets: {}, targets: {},
globalStyles: ["ui/css/global.css"], globalStyles: ["ui/css/global.css"],
globalJS: ["ui/js/global.js", "ui/js/plsConnectionManager.js"], globalJS: ["ui/js/global.js", "ui/js/pageGlobal/desktopAssistant.js"],
onLoaded: ` onLoaded: `
console.log('[HugoAura / UI / Hooks / Desktop Assistant] Page loaded.'); console.log('[HugoAura / UI / Hooks / Desktop Assistant] Page loaded.');
`, `,

View File

@@ -0,0 +1,23 @@
// @ts-check
(() => {
const applyHideSettings = () => {
if (global.__HUGO_AURA_CONFIG__.ssa.ux.easiAssistant.autoHide) {
const minimizeBtnEl = document.getElementsByClassName(
"index__button2__2mhwC3oY"
)[0].children[0];
// @ts-expect-error
minimizeBtnEl.click();
} else if (global.__HUGO_AURA_CONFIG__.ssa.ux.easiAssistant.notDisplay) {
const rootEl = document.getElementById("root");
// @ts-expect-error
rootEl.style["display"] = "none";
}
};
const onMounted = () => {
applyHideSettings();
};
onMounted();
})();

View File

@@ -1,5 +1,12 @@
// @ts-check // @ts-check
(() => { (() => {
if (!global.__HUGO_AURA__)
global.__HUGO_AURA__ = {
configInit: true,
auraDir: "",
version: "",
};
if (!global.__HUGO_AURA__.plsStats) if (!global.__HUGO_AURA__.plsStats)
global.__HUGO_AURA__.plsStats = { global.__HUGO_AURA__.plsStats = {
installed: false, installed: false,
@@ -12,8 +19,8 @@
}; };
const IPC_METHOD_BASE = "$aura.pls"; const IPC_METHOD_BASE = "$aura.pls";
const REQUIRE_BASE = "../../aura/ui"; const REQUIRE_BASE = "../../..";
const __SCOPE = "desktopAssistant"; const __SCOPE = "auraWsKeepAlive";
const PLS_REG_PATH = "ProxyLayerServices"; const PLS_REG_PATH = "ProxyLayerServices";
@@ -45,8 +52,7 @@
}; };
const calcFullAuthToken = (/** @type {string} */ authToken) => { const calcFullAuthToken = (/** @type {string} */ authToken) => {
const trustToken = window._ACCEPT_DATA.getData("deviceId"); const conjToken = authToken + "AuraXAuth 0xFFFFFF NeverEnds";
const conjToken = authToken + "AuraXAuth" + trustToken + "NeverEnds";
const crypto = require("crypto"); const crypto = require("crypto");
return crypto.createHash("sha512").update(conjToken).digest("hex"); return crypto.createHash("sha512").update(conjToken).digest("hex");
}; };
@@ -313,7 +319,7 @@
const onSetup = () => { const onSetup = () => {
if (!global.ipcRenderer) { if (!global.ipcRenderer) {
// @ts-ignore // @ts-ignore
global.ipcRenderer = require("electron").global.ipcRenderer; global.ipcRenderer = require("electron").ipcRenderer;
} }
initPlsConnection(); initPlsConnection();

View File

@@ -13,18 +13,24 @@
<!-- Chevron Left Icon --> <!-- Chevron Left Icon -->
</div> </div>
<p>雨光之环</p> <p>雨光之环</p>
<div class="aura-config-page-app-bar-hr-vertical"></div> <div class="aura-config-page-app-bar-hr-vertical" id="auraConfigPageAppBarVerticalHr"></div>
<div class="aura-config-page-app-bar-spacer space-none"></div>
<div <div
onclick="global.__HUGO_AURA_UI_FUNCTIONS__.config.handleNavHome()" onclick="global.__HUGO_AURA_UI_FUNCTIONS__.config.handleNavHome()"
style="-webkit-app-region: no-drag; z-index: 2000; margin-left: 6px" style="
-webkit-app-region: no-drag;
z-index: 2000;
margin-left: 6px;
margin-right: 0.5rem;
"
> >
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
width="21" width="22"
height="21" height="22"
viewBox="0 0 24 24" viewBox="0 0 24 24"
class="iconfont" class="iconfont"
style="margin-top: -1.5px" style="margin-top: -1.35px"
> >
<path <path
fill="currentColor" fill="currentColor"
@@ -136,8 +142,8 @@
<div class="aura-config-page-operation-body"> <div class="aura-config-page-operation-body">
<img src="../../aura/ui/static/config/no_limitations.svg" /> <img src="../../aura/ui/static/config/no_limitations.svg" />
<div> <div>
<p class="config-operation-title">限制解除</p> <p class="config-operation-title">行为改写</p>
<p class="config-operation-description">禁用密码、关闭功能</p> <p class="config-operation-description">覆写密码、禁用能力</p>
</div> </div>
</div> </div>
</div> </div>
@@ -149,7 +155,7 @@
<div class="aura-config-page-operation-body"> <div class="aura-config-page-operation-body">
<img src="../../aura/ui/static/config/behaviour_mon.svg" /> <img src="../../aura/ui/static/config/behaviour_mon.svg" />
<div> <div>
<p class="config-operation-title">行为管控</p> <p class="config-operation-title">操作管控</p>
<p class="config-operation-description">窥屏提醒、数据欺骗</p> <p class="config-operation-description">窥屏提醒、数据欺骗</p>
</div> </div>
</div> </div>

View File

@@ -294,6 +294,27 @@ global.__HUGO_AURA_UI_FUNCTIONS__.config = {
// TODO: Error handling // TODO: Error handling
} }
}, },
initCustomUIProps: async (refresh = false) => {
const verticalHrEl = document.getElementById(
"auraConfigPageAppBarVerticalHr"
);
const spacerElArr = document.getElementsByClassName(
"aura-config-page-app-bar-spacer"
);
if (
global.__HUGO_AURA_CONFIG__.auraSettings.appearance.appBar
.actionBtnsOnRight
) {
verticalHrEl.classList.add("hidden");
spacerElArr[0].classList.remove("space-none");
spacerElArr[1].classList.add("space-none");
} else if (refresh) {
verticalHrEl.classList.remove("hidden");
spacerElArr[0].classList.add("space-none");
spacerElArr[1].classList.remove("space-none");
}
},
}; };
(() => { (() => {
@@ -391,6 +412,7 @@ global.__HUGO_AURA_UI_FUNCTIONS__.config = {
}; };
const onMounted = () => { const onMounted = () => {
global.__HUGO_AURA_UI_FUNCTIONS__.config.initCustomUIProps();
applyVersionInfo(); applyVersionInfo();
showAnimation(); showAnimation();

View File

@@ -58,6 +58,10 @@
flex-grow: 1; flex-grow: 1;
} }
.aura-config-page-app-bar-spacer.space-none {
flex-grow: 0;
}
.aura-config-page-app-bar-hr-vertical { .aura-config-page-app-bar-hr-vertical {
position: relative; position: relative;
margin-left: 8px; margin-left: 8px;
@@ -66,3 +70,7 @@
height: 12px; height: 12px;
transition: background 0.5s; transition: background 0.5s;
} }
.aura-config-page-app-bar-hr-vertical.hidden {
display: none;
}

View File

@@ -31,6 +31,20 @@
上报屏蔽 上报屏蔽
</button> </button>
</li> </li>
<li class="nav-item" role="presentation">
<button
class="nav-link"
id="appearance-ctl-tab"
data-bs-toggle="pill"
data-bs-target="#appearance-ctl-subpage"
type="button"
role="tab"
aria-controls="appearance-ctl-subpage"
aria-selected="false"
>
外观与体验
</button>
</li>
</ul> </ul>
<div class="tab-content"> <div class="tab-content">
<div <div
@@ -45,5 +59,11 @@
role="tabpanel" role="tabpanel"
aria-labelledby="disable-audit-tab" aria-labelledby="disable-audit-tab"
></div> ></div>
<div
class="tab-pane fade"
id="appearance-ctl-subpage"
role="tabpanel"
aria-labelledby="appearance-ctl-tab"
></div>
</div> </div>
</div> </div>

View File

@@ -7,6 +7,7 @@
} = require("../../aura/ui/composables/settingsRenderer"); } = require("../../aura/ui/composables/settingsRenderer");
const { authSettings } = require(`${pathBase}/auth`); const { authSettings } = require(`${pathBase}/auth`);
const { banAuditSettings } = require(`${pathBase}/audit`); const { banAuditSettings } = require(`${pathBase}/audit`);
const { uxAndAppearanceSettings } = require(`${pathBase}/uxAppearance`);
const initAuthSubPage = () => { const initAuthSubPage = () => {
const authSubPageEl = document.getElementById("auth-subpage"); const authSubPageEl = document.getElementById("auth-subpage");
@@ -18,9 +19,17 @@
settingsRenderer(banAuditSubPageEl, banAuditSettings); settingsRenderer(banAuditSubPageEl, banAuditSettings);
}; };
const initUxAndAppearanceSubPage = () => {
const uxAndAppearancePageEl = document.getElementById(
"appearance-ctl-subpage"
);
settingsRenderer(uxAndAppearancePageEl, uxAndAppearanceSettings);
};
const onMounted = () => { const onMounted = () => {
initAuthSubPage(); initAuthSubPage();
initBanAuditSubPage(); initBanAuditSubPage();
initUxAndAppearanceSubPage();
const rootEl = document.getElementById("acs-disable-limit-root-el"); const rootEl = document.getElementById("acs-disable-limit-root-el");
setTimeout(() => { setTimeout(() => {

View File

@@ -0,0 +1,62 @@
const uxAndAppearanceSettings = [
{
id: 0,
categoryName: "管家助手",
child: [
{
index: 0,
id: "autoHideEasiAssistant",
type: "switch",
name: "自动最小化管家助手",
description: "管家启动后, 自动将桌面右下角管家助手最小化至 Fab 形态",
restart: true,
reload: false,
associateVal: ["ssa.ux.easiAssistant.notDisplay"],
auraIf: () => true,
defaultValue: false,
auraDisable: () => {
if (global.__HUGO_AURA_CONFIG__.ssa.ux.easiAssistant.notDisplay) {
return { value: true, tooltip: '禁用 "隐藏管家助手" 以继续' };
} else {
return { value: false };
}
},
valueGetter: () => {
return global.__HUGO_AURA_CONFIG__.ssa.ux.easiAssistant.autoHide;
},
callbackFn: (newVal) => {
if (typeof newVal !== "boolean") return;
global.__HUGO_AURA_CONFIG__.ssa.ux.easiAssistant.autoHide = newVal;
},
},
{
index: 1,
id: "notDisplayEasiAssistant",
type: "switch",
name: "隐藏管家助手",
description: "管家启动后, 管家助手窗口将不再显示",
restart: true,
reload: false,
associateVal: ["ssa.ux.easiAssistant.autoHide"],
auraIf: () => true,
defaultValue: false,
auraDisable: () => {
if (global.__HUGO_AURA_CONFIG__.ssa.ux.easiAssistant.autoHide) {
return { value: true, tooltip: '禁用 "自动最小化管家助手" 以继续' };
} else {
return { value: false };
}
},
valueGetter: () => {
return global.__HUGO_AURA_CONFIG__.ssa.ux.easiAssistant.notDisplay;
},
callbackFn: (newVal) => {
if (typeof newVal !== "boolean") return;
global.__HUGO_AURA_CONFIG__.ssa.ux.easiAssistant.notDisplay = newVal;
},
},
],
},
];
module.exports = { uxAndAppearanceSettings };

View File

@@ -17,6 +17,20 @@
Aura 设置 Aura 设置
</button> </button>
</li> </li>
<li class="nav-item" role="presentation">
<button
class="nav-link"
id="debug-subpage-tab"
data-bs-toggle="pill"
data-bs-target="#debug-subpage"
type="button"
role="tab"
aria-controls="debug-subpage"
aria-selected="false"
>
调试选项
</button>
</li>
<li class="nav-item" role="presentation"> <li class="nav-item" role="presentation">
<button <button
class="nav-link" class="nav-link"
@@ -26,7 +40,7 @@
type="button" type="button"
role="tab" role="tab"
aria-controls="about-subpage" aria-controls="about-subpage"
aria-selected="true" aria-selected="false"
> >
关于项目 关于项目
</button> </button>
@@ -39,6 +53,12 @@
role="tabpanel" role="tabpanel"
aria-labelledby="aura-subpage-tab" aria-labelledby="aura-subpage-tab"
></div> ></div>
<div
class="tab-pane fade"
id="debug-subpage"
role="tabpanel"
aria-labelledby="debug-subpage-tab"
></div>
<div <div
class="tab-pane fade" class="tab-pane fade"
id="about-subpage" id="about-subpage"

View File

@@ -5,13 +5,21 @@
settingsRenderer, settingsRenderer,
} = require("../../aura/ui/composables/settingsRenderer"); } = require("../../aura/ui/composables/settingsRenderer");
const { auraSettings } = require(`${pathBase}/aura`); const { auraSettings } = require(`${pathBase}/aura`);
const { debugSettings } = require(`${pathBase}/debug`);
const initAuraSubPage = () => { const initAuraSubPage = () => {
const auraSettingsSubPageEl = document.getElementById("aura-subpage"); const auraSettingsSubPageEl = document.getElementById("aura-subpage");
settingsRenderer(auraSettingsSubPageEl, auraSettings); settingsRenderer(auraSettingsSubPageEl, auraSettings);
}; };
const initDebugSubPage = () => {
const debugSubPageEl = document.getElementById("debug-subpage");
settingsRenderer(debugSubPageEl, debugSettings);
};
const onMounted = () => { const onMounted = () => {
initAuraSubPage(); initAuraSubPage();
initDebugSubPage();
const rootEl = document.getElementById("acs-preferences-root-el"); const rootEl = document.getElementById("acs-preferences-root-el");
setTimeout(() => { setTimeout(() => {

View File

@@ -441,6 +441,35 @@ const auraSettings = [
}, },
], ],
}, },
{
id: 2,
categoryName: "外观",
child: [
{
index: 0,
id: "actionBtnsOnRight",
type: "switch",
name: "顶栏操作类按钮右置",
description: "启用后, 顶栏的<b>返回首页按钮</b>将靠右放置",
restart: false,
reload: false,
auraIf: () => {
return true;
},
defaultValue: false,
valueGetter: () => {
return global.__HUGO_AURA_CONFIG__.auraSettings.appearance.appBar
.actionBtnsOnRight;
},
callbackFn: async (newVal) => {
if (typeof newVal !== "boolean") return;
global.__HUGO_AURA_CONFIG__.auraSettings.appearance.appBar.actionBtnsOnRight =
newVal;
global.__HUGO_AURA_UI_FUNCTIONS__.config.initCustomUIProps(true);
},
},
],
},
]; ];
module.exports = { auraSettings }; module.exports = { auraSettings };

View File

@@ -0,0 +1,45 @@
const IPC_METHOD_BASE = "$aura.debug";
const path = require("path");
const debugSettings = [
{
id: 0,
categoryName: "日志与输出",
child: [
{
index: 0,
id: "openHugoAuraLogDir",
type: "button",
style: "outline",
name: "HugoAura 日志目录",
description: "",
restart: false,
reload: false,
associateVal: null,
auraIf: () => true,
buttonContent: "打开",
valueGetter: async () => {
if (
global.__HUGO_AURA__.auraDir &&
global.__HUGO_AURA__.auraDir !== ""
) {
return (
"目录位置: " + path.join(global.__HUGO_AURA__.auraDir, "logs")
);
} else {
return "未能获取日志目录位置";
}
},
callbackFn: async (event) => {
const childProc = require("child_process");
childProc.spawn(`explorer.exe`, [
`${path.join(global.__HUGO_AURA__.auraDir, "logs")}`,
]);
},
},
],
},
];
module.exports = { debugSettings };

View File

@@ -7,7 +7,7 @@
transition: opacity 0.25s; transition: opacity 0.25s;
} }
.aura-header-icon.aura-header-icon-hidden { #root.aura-header-icon-hidden .aura-header-icon {
display: none; display: none;
} }

View File

@@ -10,9 +10,11 @@ global.__HUGO_AURA_UI_FUNCTIONS__.headerIcon = {
let clickTimeout = null; let clickTimeout = null;
const onMounted = () => { const onMounted = () => {
if (!global.__HUGO_AURA_CONFIG__.auraSettings.uiAccessMethod.showEntryIcon) { if (
const iconEl = document.getElementsByClassName("aura-header-icon")[0]; !global.__HUGO_AURA_CONFIG__.auraSettings.uiAccessMethod.showEntryIcon
iconEl.classList.add("aura-header-icon-hidden"); ) {
const rootEl = document.getElementById("root");
rootEl.classList.add("aura-header-icon-hidden");
} }
if ( if (

View File

@@ -0,0 +1,16 @@
<!DOCTYPE html>
<html>
<head>
<title>Aura WebSocket KeepAlive Window</title>
<style>
:root {
opacity: 0;
}
</style>
<script>
let global = window;
</script>
<script src="../../../js/plsConnectionManager.js"></script>
</head>
<body></body>
</html>

39
src/aura/utils/pls.js Normal file
View File

@@ -0,0 +1,39 @@
// @ts-check
/**
* @param {Electron} electron
*/
const createWsWindow = (electron) => {
const path = require("path");
const { BrowserWindow } = electron;
const window = new BrowserWindow({
width: 0,
height: 0,
frame: false,
skipTaskbar: true,
transparent: true,
alwaysOnTop: true,
webPreferences: {
nodeIntegration: true,
contextIsolation: false,
devTools: true,
},
});
window.setIgnoreMouseEvents(true);
window.loadFile(
path.join(
__dirname,
"..",
"ui",
"pages",
"windows",
"auraWsKeepAlive",
"index.html"
)
);
return window;
};
module.exports = { createWsWindow };

View File

@@ -6,6 +6,7 @@ if (!global.__HUGO_AURA__) {
configInit: false, configInit: false,
central: () => {}, central: () => {},
ipcInit: false, ipcInit: false,
auraDir: "",
plsStats: null, plsStats: null,
plsSettings: null, plsSettings: null,
plsRules: null, plsRules: null,
@@ -24,7 +25,7 @@ if (!global.__HUGO_AURA_API__) {
"https://api-aura.asaka.site", "https://api-aura.asaka.site",
"https://api.hugoaura.dpdns.org", "https://api.hugoaura.dpdns.org",
"https://api-aura-projekts.minorice.moe", "https://api-aura-projekts.minorice.moe",
"https://api.aura.vim.moe" "https://api.aura.vim.moe",
], ],
plsUpdate: "/api/getPLSLatestVersion", plsUpdate: "/api/getPLSLatestVersion",
auraUpdate: "/api/getAuraLatestVersion", auraUpdate: "/api/getAuraLatestVersion",
@@ -36,15 +37,46 @@ if (!global.__HUGO_AURA_CONFIG__) {
global.__HUGO_AURA_CONFIG__ = {}; global.__HUGO_AURA_CONFIG__ = {};
} }
const path = require("path");
const os = require("os");
const MainProcessHooksManager = require("../aura/init/main/windowHooksManager"); const MainProcessHooksManager = require("../aura/init/main/windowHooksManager");
const RendererHooksManager = require("../aura/init/rendererHook/uiHooksManager"); const RendererHooksManager = require("../aura/init/rendererHook/uiHooksManager");
const EventBus = require("../aura/utils/eventBus"); const EventBus = require("../aura/utils/eventBus");
const NetworkHook = require("../aura/init/rendererHook/networkHook"); const NetworkHook = require("../aura/init/rendererHook/networkHook");
const ConfigManager = require("../aura/init/shared/configManager"); const ConfigManager = require("../aura/init/shared/configManager");
const RegistryManager = require("../aura/init/shared/registryManager");
const { buildIpcMain } = require("../aura/init/main/ipcHandler"); const { buildIpcMain } = require("../aura/init/main/ipcHandler");
const plsUtils = require("../aura/utils/pls");
const { initLogger } = require("../aura/init/main/logger"); const { initLogger } = require("../aura/init/main/logger");
const getUserDocumentsDirPath = () => {
const registryManager = new RegistryManager();
const pathInfo = registryManager.readRegKeySync(
'"HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders"',
"Personal",
false,
true,
/REG_EXPAND_SZ\s+(.+)/
);
if (pathInfo.success && pathInfo.data) {
const resolvedPath = pathInfo.data.replace(
/%([^%]+)%/g,
(match, varName) => {
return process.env[varName] || match;
}
);
return resolvedPath;
} else {
console.error(
"[HugoAura / Init / Logger] Failed to get the path of documents dir, using default val."
);
return path.join(os.homedir(), "Documents");
}
};
/** /**
* *
* @param {import("../aura/types/main/core").LauncherArgs} param0 * @param {import("../aura/types/main/core").LauncherArgs} param0
@@ -66,6 +98,11 @@ const launcher = ({ central, windowName, config }) => {
app.exit(0); app.exit(0);
}; };
global.__HUGO_AURA__.auraDir = path.join(
getUserDocumentsDirPath(),
"HugoAura"
);
// >>> Init Logger <<< // // >>> Init Logger <<< //
initLogger(windowName); initLogger(windowName);
@@ -79,6 +116,7 @@ const launcher = ({ central, windowName, config }) => {
// >>> Init Config <<< // // >>> Init Config <<< //
const configManager = new ConfigManager(); const configManager = new ConfigManager();
configManager.side = "main"; configManager.side = "main";
configManager.migrateOldConfigFile();
configManager.ensureConfigExists(); configManager.ensureConfigExists();
const loadedConfig = configManager.loadConfig(); const loadedConfig = configManager.loadConfig();
if (!global.__HUGO_AURA__.configInit) global.__HUGO_AURA__.configInit = true; if (!global.__HUGO_AURA__.configInit) global.__HUGO_AURA__.configInit = true;
@@ -112,6 +150,13 @@ const launcher = ({ central, windowName, config }) => {
config.canOpenDevTool = true; config.canOpenDevTool = true;
} }
// >>> Create WebSocket KeepAlive Window <<< //
if (!global.__HUGO_AURA__.hookedWindows?.has("auraWsKeepAlive")) {
const wsKaWin = plsUtils.createWsWindow(electron);
// @ts-expect-error
global.__HUGO_AURA__.hookedWindows.set("auraWsKeepAlive", wsKaWin);
}
// >>> Listeners <<< // // >>> Listeners <<< //
/** /**

View File

@@ -1,13 +1,18 @@
// @ts-check // @ts-check
const __AURA_VERSION__ = "0.1.1-pre-IV"; const __AURA_VERSION__ = "0.1.1-beta";
(() => { (() => {
if (require.main) return; // 如果只是导入 Aura Version, 不运行闭包逻辑 if (require.main) return; // 如果只是导入 Aura Version, 不运行闭包逻辑
const auraDir = require("electron").ipcRenderer.sendSync(
"$aura.base.getAuraDirSync"
);
// >>> Init Global Vars <<< // // >>> Init Global Vars <<< //
if (!global.__HUGO_AURA__) { if (!global.__HUGO_AURA__) {
global.__HUGO_AURA__ = { global.__HUGO_AURA__ = {
auraDir: auraDir.data,
configInit: true, // preload 始终比 hook 晚, 默认 config 已初始化 configInit: true, // preload 始终比 hook 晚, 默认 config 已初始化
// ↑ 保留此参数的目的 -> 用于 configManager 中, configManager 的行为在 Renderer 和 Main 中是一致的 // ↑ 保留此参数的目的 -> 用于 configManager 中, configManager 的行为在 Renderer 和 Main 中是一致的
version: __AURA_VERSION__, version: __AURA_VERSION__,