@bolloon/bolloon-agent 0.3.36 → 0.3.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/electron/config.js +9 -14
  2. package/dist/electron/dialogs.js +16 -53
  3. package/dist/electron/first-run.js +24 -65
  4. package/dist/electron/ipc.js +10 -14
  5. package/dist/electron/logger.js +7 -44
  6. package/dist/electron/main.js +42 -45
  7. package/dist/electron/menu.js +13 -18
  8. package/dist/electron/paths.js +12 -54
  9. package/dist/electron/server.js +18 -57
  10. package/dist/electron/tray.js +15 -53
  11. package/dist/electron/window.js +22 -61
  12. package/dist/electron-build/electron/config.js +21 -0
  13. package/dist/electron-build/electron/config.js.map +1 -0
  14. package/dist/electron-build/electron/dialogs.js +108 -0
  15. package/dist/electron-build/electron/dialogs.js.map +1 -0
  16. package/dist/electron-build/electron/first-run.js +170 -0
  17. package/dist/electron-build/electron/first-run.js.map +1 -0
  18. package/dist/electron-build/electron/ipc.js +20 -0
  19. package/dist/electron-build/electron/ipc.js.map +1 -0
  20. package/dist/electron-build/electron/logger.js +114 -0
  21. package/dist/electron-build/electron/logger.js.map +1 -0
  22. package/dist/electron-build/electron/main.js +79 -0
  23. package/dist/electron-build/electron/main.js.map +1 -0
  24. package/dist/electron-build/electron/menu.js +145 -0
  25. package/dist/electron-build/electron/menu.js.map +1 -0
  26. package/dist/electron-build/electron/paths.js +75 -0
  27. package/dist/electron-build/electron/paths.js.map +1 -0
  28. package/dist/electron-build/electron/server.js +119 -0
  29. package/dist/electron-build/electron/server.js.map +1 -0
  30. package/dist/electron-build/electron/tray.js +111 -0
  31. package/dist/electron-build/electron/tray.js.map +1 -0
  32. package/dist/electron-build/electron/window.js +111 -0
  33. package/dist/electron-build/electron/window.js.map +1 -0
  34. package/dist/electron-build/electron-preload.js +32 -0
  35. package/dist/electron-build/electron-preload.js.map +1 -0
  36. package/dist/electron-build/electron.js +8 -0
  37. package/dist/electron-build/electron.js.map +1 -0
  38. package/dist/electron-build/utils/auto-update.js +598 -0
  39. package/dist/electron-build/utils/auto-update.js.map +1 -0
  40. package/dist/electron-preload.js +16 -19
  41. package/dist/electron.js +1 -4
  42. package/dist/utils/auto-update.js +12 -51
  43. package/package.json +5 -4
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getWebServerProcess = getWebServerProcess;
37
+ exports.killWebServer = killWebServer;
38
+ exports.startWebServer = startWebServer;
39
+ /**
40
+ * Spawns dist/web/server.js as a child Node process (via Electron's
41
+ * ELECTRON_RUN_AS_NODE=1) and parses BOLLOON_PORT=NNNN to learn the
42
+ * actually-bound port (which may have drifted from the preferred port
43
+ * due to EADDRINUSE auto-bump).
44
+ */
45
+ const child_process_1 = require("child_process");
46
+ const path = __importStar(require("path"));
47
+ const logger_1 = require("./logger");
48
+ const config_1 = require("./config");
49
+ // Resolve to the directory holding this file. See src/electron/window.ts for the rationale;
50
+ // this avoids the same `import.meta` / `__dirname` redeclaration conflicts that broke
51
+ // the electron tsconfig when esnext module mode was set.
52
+ const g = globalThis;
53
+ const __basedir = g.__dirname
54
+ ?? (g.__filename ? path.dirname(g.__filename) : process.cwd());
55
+ let webServerProcess = null;
56
+ function getWebServerProcess() {
57
+ return webServerProcess;
58
+ }
59
+ function killWebServer() {
60
+ if (webServerProcess && !webServerProcess.killed) {
61
+ (0, logger_1.log)('终止 Web 服务器进程');
62
+ webServerProcess.kill();
63
+ }
64
+ webServerProcess = null;
65
+ }
66
+ function startWebServer(preferredPort) {
67
+ return new Promise((resolve, reject) => {
68
+ const serverScript = path.join(__basedir, '..', 'web', 'server.js');
69
+ (0, logger_1.log)(`启动 Web 服务器进程: ${serverScript}`);
70
+ // ELECTRON_RUN_AS_NODE=1 — packaged 时 process.execPath 是 Electron 二进制,
71
+ // 没这行 require() 会失败. Dev 模式 (electron dist/electron.js) 同样情况.
72
+ webServerProcess = (0, child_process_1.spawn)(process.execPath, [serverScript], {
73
+ env: {
74
+ ...process.env,
75
+ ELECTRON_RUN_AS_NODE: '1',
76
+ NODE_ENV: 'production',
77
+ PORT: String(preferredPort),
78
+ ELECTRON_PORT: String(preferredPort),
79
+ BOLLOON_HOST: config_1.DEFAULT_HOST,
80
+ },
81
+ stdio: ['ignore', 'pipe', 'pipe'],
82
+ });
83
+ let stdoutBuf = '';
84
+ let stderrData = '';
85
+ webServerProcess.stdout?.on('data', (data) => {
86
+ stdoutBuf += data.toString();
87
+ process.stdout.write(`[WebServer] ${data}`);
88
+ const m = stdoutBuf.match(/^BOLLOON_PORT=(\d+)/m);
89
+ if (m) {
90
+ const actualPort = parseInt(m[1], 10);
91
+ (0, logger_1.log)(`Web 服务器就绪: 实际端口=${actualPort} (preferred=${preferredPort})`);
92
+ resolve({ port: actualPort });
93
+ }
94
+ });
95
+ webServerProcess.stderr?.on('data', (data) => {
96
+ stderrData += data.toString();
97
+ process.stderr.write(`[WebServer ERR] ${data}`);
98
+ (0, logger_1.log)(`[WebServer stderr] ${data.toString().trim()}`, 'warn');
99
+ });
100
+ webServerProcess.on('error', (err) => {
101
+ (0, logger_1.log)(`Web 服务器启动失败: ${err.message}`, 'error');
102
+ reject(err);
103
+ });
104
+ webServerProcess.on('exit', (code, signal) => {
105
+ (0, logger_1.log)(`Web 服务器退出: code=${code} signal=${signal}`);
106
+ if (code !== 0 && code !== null) {
107
+ (0, logger_1.log)(`Web 服务器 stderr: ${stderrData.slice(0, 500)}`, 'error');
108
+ }
109
+ webServerProcess = null;
110
+ });
111
+ setTimeout(() => {
112
+ if (webServerProcess && !webServerProcess.killed) {
113
+ (0, logger_1.log)(`Web 服务器启动超时 (${config_1.WEB_SERVER_STARTUP_TIMEOUT_MS}ms)`, 'error');
114
+ reject(new Error('Web server startup timeout'));
115
+ }
116
+ }, config_1.WEB_SERVER_STARTUP_TIMEOUT_MS);
117
+ });
118
+ }
119
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/electron/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.createTray = createTray;
37
+ exports.destroyTray = destroyTray;
38
+ /**
39
+ * 系统托盘 — Show / Hide / Quit
40
+ *
41
+ * 图标资源要求 (需用户自备):
42
+ * build/trayTemplate.png (mac, 16x16 + 32x32 @2x, 单色 alpha, 自动暗/亮)
43
+ * build/tray.png (win/linux, 16x16 + 32x32)
44
+ *
45
+ * 若 build 目录没有 tray 图标, 降级为不创建托盘 (主菜单和窗口关闭行为不变)
46
+ */
47
+ const electron_1 = require("electron");
48
+ const path = __importStar(require("path"));
49
+ const fs = __importStar(require("fs"));
50
+ const paths_1 = require("./paths");
51
+ const logger_1 = require("./logger");
52
+ let trayInstance = null;
53
+ function loadTrayIcon() {
54
+ const isMac = process.platform === 'darwin';
55
+ const file = isMac ? 'trayTemplate.png' : 'tray.png';
56
+ const iconPath = path.join((0, paths_1.buildResourcesDir)(), file);
57
+ if (!fs.existsSync(iconPath)) {
58
+ (0, logger_1.log)(`托盘图标缺失: ${iconPath} (跳过托盘创建)`, 'warn');
59
+ return null;
60
+ }
61
+ const img = electron_1.nativeImage.createFromPath(iconPath);
62
+ if (isMac)
63
+ img.setTemplateImage(true);
64
+ return img;
65
+ }
66
+ function createTray(getMainWindow) {
67
+ if (trayInstance)
68
+ return;
69
+ const icon = loadTrayIcon();
70
+ if (!icon)
71
+ return;
72
+ trayInstance = new electron_1.Tray(icon);
73
+ trayInstance.setToolTip(`Bolloon Agent v${electron_1.app.getVersion()}`);
74
+ const toggle = () => {
75
+ const w = getMainWindow();
76
+ if (!w)
77
+ return;
78
+ if (w.isVisible() && w.isFocused()) {
79
+ w.hide();
80
+ }
81
+ else {
82
+ if (w.isMinimized())
83
+ w.restore();
84
+ w.show();
85
+ w.focus();
86
+ }
87
+ };
88
+ const menu = electron_1.Menu.buildFromTemplate([
89
+ { label: 'Show / Hide', click: () => toggle() },
90
+ { type: 'separator' },
91
+ {
92
+ label: 'Quit',
93
+ click: () => {
94
+ (0, logger_1.log)('托盘菜单 Quit');
95
+ electron_1.app.quit();
96
+ },
97
+ },
98
+ ]);
99
+ trayInstance.setContextMenu(menu);
100
+ // mac 默认 click 弹菜单, win/linux 默认 click 触发自定义
101
+ if (process.platform !== 'darwin') {
102
+ trayInstance.on('click', () => toggle());
103
+ }
104
+ }
105
+ function destroyTray() {
106
+ if (trayInstance) {
107
+ trayInstance.destroy();
108
+ trayInstance = null;
109
+ }
110
+ }
111
+ //# sourceMappingURL=tray.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tray.js","sourceRoot":"","sources":["../../../src/electron/tray.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,gCAuCC;AAED,kCAKC;AA/ED;;;;;;;;GAQG;AACH,uCAAuE;AACvE,2CAA6B;AAC7B,uCAAyB;AACzB,mCAA4C;AAC5C,qCAA+B;AAI/B,IAAI,YAAY,GAAgB,IAAI,CAAC;AAErC,SAAS,YAAY;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC;IAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,UAAU,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAA,yBAAiB,GAAE,EAAE,IAAI,CAAC,CAAC;IAEtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,IAAA,YAAG,EAAC,WAAW,QAAQ,WAAW,EAAE,MAAM,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,GAAG,GAAG,sBAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjD,IAAI,KAAK;QAAE,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,UAAU,CAAC,aAAwB;IACjD,IAAI,YAAY;QAAE,OAAO;IAEzB,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;IAC5B,IAAI,CAAC,IAAI;QAAE,OAAO;IAElB,YAAY,GAAG,IAAI,eAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,YAAY,CAAC,UAAU,CAAC,kBAAkB,cAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAE9D,MAAM,MAAM,GAAG,GAAG,EAAE;QAClB,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC;YAAE,OAAO;QACf,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC;YACnC,CAAC,CAAC,IAAI,EAAE,CAAC;QACX,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,CAAC,WAAW,EAAE;gBAAE,CAAC,CAAC,OAAO,EAAE,CAAC;YACjC,CAAC,CAAC,IAAI,EAAE,CAAC;YACT,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,eAAI,CAAC,iBAAiB,CAAC;QAClC,EAAE,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE;QAC/C,EAAE,IAAI,EAAE,WAAW,EAAE;QACrB;YACE,KAAK,EAAE,MAAM;YACb,KAAK,EAAE,GAAG,EAAE;gBACV,IAAA,YAAG,EAAC,WAAW,CAAC,CAAC;gBACjB,cAAG,CAAC,IAAI,EAAE,CAAC;YACb,CAAC;SACF;KACF,CAAC,CAAC;IAEH,YAAY,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAElC,6CAA6C;IAC7C,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3C,CAAC;AACH,CAAC;AAED,SAAgB,WAAW;IACzB,IAAI,YAAY,EAAE,CAAC;QACjB,YAAY,CAAC,OAAO,EAAE,CAAC;QACvB,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.getMainWindow = getMainWindow;
37
+ exports.createMainWindow = createMainWindow;
38
+ exports.focusMainWindow = focusMainWindow;
39
+ /**
40
+ * 主窗口工厂 — preload 路径解析 + dev/prod loadURL + 外部链接走系统浏览器
41
+ */
42
+ const electron_1 = require("electron");
43
+ const path = __importStar(require("path"));
44
+ const logger_1 = require("./logger");
45
+ const config_1 = require("./config");
46
+ const server_1 = require("./server");
47
+ const g = globalThis;
48
+ const __basedir = g.__dirname
49
+ ?? (g.__filename ? path.dirname(g.__filename) : process.cwd());
50
+ let mainWindow = null;
51
+ function getMainWindow() {
52
+ return mainWindow;
53
+ }
54
+ async function createMainWindow() {
55
+ (0, logger_1.log)('创建主窗口...');
56
+ mainWindow = new electron_1.BrowserWindow({
57
+ width: config_1.MAIN_WINDOW_DEFAULT.width,
58
+ height: config_1.MAIN_WINDOW_DEFAULT.height,
59
+ minWidth: config_1.MAIN_WINDOW_MIN.width,
60
+ minHeight: config_1.MAIN_WINDOW_MIN.height,
61
+ title: 'Bolloon Agent',
62
+ webPreferences: {
63
+ nodeIntegration: false,
64
+ contextIsolation: true,
65
+ sandbox: false, // MCP/spawn 等需要 fs; 真正的隔离靠 preload 边界
66
+ preload: path.join(__basedir, '..', 'electron-preload.js'),
67
+ },
68
+ show: false,
69
+ });
70
+ if (config_1.isDev) {
71
+ // dev:web 用 tsx 起 server, 端口固定 preferredPort, 不会 EADDRINUSE 自增
72
+ const port = (0, config_1.preferredPort)();
73
+ mainWindow.loadURL(`http://localhost:${port}`);
74
+ mainWindow.webContents.openDevTools();
75
+ }
76
+ else {
77
+ try {
78
+ (0, logger_1.log)('启动内置 Web 服务器...');
79
+ const { port: actualPort } = await (0, server_1.startWebServer)((0, config_1.preferredPort)());
80
+ mainWindow.loadURL(`http://localhost:${actualPort}`);
81
+ }
82
+ catch (err) {
83
+ (0, logger_1.log)(`启动服务器失败: ${err.message}`, 'error');
84
+ console.error('启动服务器失败:', err);
85
+ }
86
+ }
87
+ mainWindow.once('ready-to-show', () => {
88
+ mainWindow?.show();
89
+ (0, logger_1.log)('窗口已显示');
90
+ });
91
+ // 外部链接走系统浏览器, 不在 app 内开新窗口
92
+ mainWindow.webContents.setWindowOpenHandler(({ url }) => {
93
+ if (url.startsWith('http://') || url.startsWith('https://')) {
94
+ electron_1.shell.openExternal(url);
95
+ }
96
+ return { action: 'deny' };
97
+ });
98
+ mainWindow.on('closed', () => {
99
+ mainWindow = null;
100
+ });
101
+ (0, logger_1.log)('窗口创建完成');
102
+ }
103
+ function focusMainWindow() {
104
+ if (!mainWindow)
105
+ return;
106
+ if (mainWindow.isMinimized())
107
+ mainWindow.restore();
108
+ mainWindow.show();
109
+ mainWindow.focus();
110
+ }
111
+ //# sourceMappingURL=window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"window.js","sourceRoot":"","sources":["../../../src/electron/window.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqBA,sCAEC;AAED,4CAmDC;AAED,0CAKC;AAnFD;;GAEG;AACH,uCAAgD;AAChD,2CAA6B;AAC7B,qCAA+B;AAC/B,qCAAsF;AACtF,qCAA0C;AAQ1C,MAAM,CAAC,GAAG,UAAyD,CAAC;AACpE,MAAM,SAAS,GAAW,CAAC,CAAC,SAAS;OAChC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;AAEjE,IAAI,UAAU,GAAyB,IAAI,CAAC;AAE5C,SAAgB,aAAa;IAC3B,OAAO,UAAU,CAAC;AACpB,CAAC;AAEM,KAAK,UAAU,gBAAgB;IACpC,IAAA,YAAG,EAAC,UAAU,CAAC,CAAC;IAChB,UAAU,GAAG,IAAI,wBAAa,CAAC;QAC7B,KAAK,EAAE,4BAAmB,CAAC,KAAK;QAChC,MAAM,EAAE,4BAAmB,CAAC,MAAM;QAClC,QAAQ,EAAE,wBAAe,CAAC,KAAK;QAC/B,SAAS,EAAE,wBAAe,CAAC,MAAM;QACjC,KAAK,EAAE,eAAe;QACtB,cAAc,EAAE;YACd,eAAe,EAAE,KAAK;YACtB,gBAAgB,EAAE,IAAI;YACtB,OAAO,EAAE,KAAK,EAAE,sCAAsC;YACtD,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,qBAAqB,CAAC;SAC3D;QACD,IAAI,EAAE,KAAK;KACZ,CAAC,CAAC;IAEH,IAAI,cAAK,EAAE,CAAC;QACV,+DAA+D;QAC/D,MAAM,IAAI,GAAG,IAAA,sBAAa,GAAE,CAAC;QAC7B,UAAU,CAAC,OAAO,CAAC,oBAAoB,IAAI,EAAE,CAAC,CAAC;QAC/C,UAAU,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC;YACH,IAAA,YAAG,EAAC,iBAAiB,CAAC,CAAC;YACvB,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,IAAA,uBAAc,EAAC,IAAA,sBAAa,GAAE,CAAC,CAAC;YACnE,UAAU,CAAC,OAAO,CAAC,oBAAoB,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAA,YAAG,EAAC,YAAa,GAAa,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;QACpC,UAAU,EAAE,IAAI,EAAE,CAAC;QACnB,IAAA,YAAG,EAAC,OAAO,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,2BAA2B;IAC3B,UAAU,CAAC,WAAW,CAAC,oBAAoB,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE;QACtD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5D,gBAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC3B,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,IAAA,YAAG,EAAC,QAAQ,CAAC,CAAC;AAChB,CAAC;AAED,SAAgB,eAAe;IAC7B,IAAI,CAAC,UAAU;QAAE,OAAO;IACxB,IAAI,UAAU,CAAC,WAAW,EAAE;QAAE,UAAU,CAAC,OAAO,EAAE,CAAC;IACnD,UAAU,CAAC,IAAI,EAAE,CAAC;IAClB,UAAU,CAAC,KAAK,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Electron Preload 脚本
5
+ * 在渲染进程和主进程之间建立安全的通信桥梁
6
+ * contextIsolation: true, nodeIntegration: false — 只能通过这里暴露的 API 触达主进程
7
+ */
8
+ const electron_1 = require("electron");
9
+ electron_1.contextBridge.exposeInMainWorld('electronAPI', {
10
+ // === 原有 (保留) ===
11
+ getVersion: () => electron_1.ipcRenderer.invoke('get-version'),
12
+ getUserDataPath: () => electron_1.ipcRenderer.invoke('get-user-data-path'),
13
+ openExternal: (url) => electron_1.ipcRenderer.invoke('open-external', url),
14
+ // === 新增: 数据目录 ===
15
+ getDataPath: () => electron_1.ipcRenderer.invoke('get-data-path'),
16
+ // === 新增: 文件 dialog ===
17
+ openFile: (opts) => electron_1.ipcRenderer.invoke('dialog:open-file', opts),
18
+ saveFile: (opts) => electron_1.ipcRenderer.invoke('dialog:save-file', opts),
19
+ openDirectory: (opts) => electron_1.ipcRenderer.invoke('dialog:open-directory', opts),
20
+ // === 新增: 文件系统 (限大小, 主进程守卫) ===
21
+ readTextFile: (opts) => electron_1.ipcRenderer.invoke('fs:read-text-file', opts),
22
+ writeTextFile: (opts) => electron_1.ipcRenderer.invoke('fs:write-text-file', opts),
23
+ pathExists: (opts) => electron_1.ipcRenderer.invoke('fs:path-exists', opts),
24
+ // === 新增: 首启引导 ===
25
+ getFirstRunSeen: () => electron_1.ipcRenderer.invoke('first-run:seen'),
26
+ markFirstRunSeen: () => electron_1.ipcRenderer.invoke('first-run:mark-seen'),
27
+ getDataPathSync: () => electron_1.ipcRenderer.invoke('first-run:data-dir'),
28
+ getLogsPathSync: () => electron_1.ipcRenderer.invoke('first-run:logs-dir'),
29
+ // === 元数据 ===
30
+ platform: process.platform,
31
+ });
32
+ //# sourceMappingURL=electron-preload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electron-preload.js","sourceRoot":"","sources":["../../src/electron-preload.ts"],"names":[],"mappings":";;AAAA;;;;GAIG;AACH,uCAAwE;AAIxE,wBAAa,CAAC,iBAAiB,CAAC,aAAa,EAAE;IAC7C,kBAAkB;IAClB,UAAU,EAAE,GAAG,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,aAAa,CAAC;IACnD,eAAe,EAAE,GAAG,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,oBAAoB,CAAC;IAC/D,YAAY,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC;IAEvE,mBAAmB;IACnB,WAAW,EAAE,GAAG,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,eAAe,CAAC;IAEtD,wBAAwB;IACxB,QAAQ,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC;IACtE,QAAQ,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,kBAAkB,EAAE,IAAI,CAAC;IACtE,aAAa,EAAE,CAAC,IAAU,EAAE,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,uBAAuB,EAAE,IAAI,CAAC;IAEhF,gCAAgC;IAChC,YAAY,EAAE,CAAC,IAAyC,EAAE,EAAE,CAC1D,sBAAW,CAAC,MAAM,CAAC,mBAAmB,EAAE,IAAI,CAAC;IAC/C,aAAa,EAAE,CAAC,IAA0D,EAAE,EAAE,CAC5E,sBAAW,CAAC,MAAM,CAAC,oBAAoB,EAAE,IAAI,CAAC;IAChD,UAAU,EAAE,CAAC,IAAsB,EAAE,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC;IAElF,mBAAmB;IACnB,eAAe,EAAE,GAAG,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,gBAAgB,CAAC;IAC3D,gBAAgB,EAAE,GAAG,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,qBAAqB,CAAC;IACjE,eAAe,EAAE,GAAG,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,oBAAoB,CAAC;IAC/D,eAAe,EAAE,GAAG,EAAE,CAAC,sBAAW,CAAC,MAAM,CAAC,oBAAoB,CAAC;IAE/D,cAAc;IACd,QAAQ,EAAE,OAAO,CAAC,QAAQ;CAC3B,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Electron 入口 shim — 真正逻辑在 src/electron/main.ts
5
+ * (保留 src/electron.ts 平铺入口, 不动 package.json 的 dist/electron.js 解析)
6
+ */
7
+ require("./electron/main");
8
+ //# sourceMappingURL=electron.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"electron.js","sourceRoot":"","sources":["../../src/electron.ts"],"names":[],"mappings":";;AAAA;;;GAGG;AACH,2BAAyB"}