@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,170 @@
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.hasSeenFirstRun = hasSeenFirstRun;
37
+ exports.markFirstRunSeen = markFirstRunSeen;
38
+ exports.showFirstRunOverlay = showFirstRunOverlay;
39
+ exports.registerFirstRunIpc = registerFirstRunIpc;
40
+ exports.maybeShowFirstRun = maybeShowFirstRun;
41
+ /**
42
+ * 首启检测 + 引导浮层
43
+ *
44
+ * 标记文件写在 userData (不是 ~/.bolloon/), 卸载 app 自然清掉
45
+ * 引导窗是父主窗的 modal, frame=false, 透明背景; 关闭时标记写入
46
+ */
47
+ const electron_1 = require("electron");
48
+ const fs = __importStar(require("fs"));
49
+ const path = __importStar(require("path"));
50
+ const paths_1 = require("./paths");
51
+ const logger_1 = require("./logger");
52
+ const OVERLAY_HTML = `
53
+ <!DOCTYPE html>
54
+ <html>
55
+ <head>
56
+ <meta charset="utf-8" />
57
+ <style>
58
+ :root { color-scheme: light dark; }
59
+ body {
60
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
61
+ margin: 0; padding: 32px 28px;
62
+ background: rgba(245,245,247,0.97);
63
+ color: #1d1d1f;
64
+ height: 100vh; box-sizing: border-box;
65
+ }
66
+ @media (prefers-color-scheme: dark) {
67
+ body { background: rgba(28,28,30,0.97); color: #f5f5f7; }
68
+ }
69
+ h1 { font-size: 18px; margin: 0 0 14px; font-weight: 600; }
70
+ p { font-size: 13px; line-height: 1.55; margin: 8px 0; }
71
+ code {
72
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
73
+ font-size: 12px; padding: 1px 5px;
74
+ background: rgba(0,0,0,0.06); border-radius: 3px;
75
+ }
76
+ @media (prefers-color-scheme: dark) {
77
+ code { background: rgba(255,255,255,0.08); }
78
+ }
79
+ .btn {
80
+ display: inline-block; margin-top: 18px; padding: 8px 18px;
81
+ background: #007aff; color: #fff; border: none; border-radius: 6px;
82
+ font-size: 13px; font-weight: 500; cursor: pointer;
83
+ }
84
+ .btn:hover { background: #0066d6; }
85
+ ul { padding-left: 20px; }
86
+ li { font-size: 13px; line-height: 1.7; }
87
+ </style>
88
+ </head>
89
+ <body>
90
+ <h1>欢迎使用 Bolloon Agent</h1>
91
+ <p>你的数据存放在本地, 不上传:</p>
92
+ <ul>
93
+ <li>配置 / 频道 / P2P 密钥: <code id="data"></code></li>
94
+ <li>运行日志: <code id="logs"></code></li>
95
+ </ul>
96
+ <p>所有数据在卸载后仍保留 — 想清理就手动删除 ~/.bolloon/。</p>
97
+ <button class="btn" id="ok">知道了</button>
98
+ <script>
99
+ const ok = document.getElementById('ok');
100
+ ok.addEventListener('click', () => window.electronAPI.markFirstRunSeen());
101
+ document.getElementById('data').textContent = window.electronAPI.getDataPathSync?.() || '';
102
+ document.getElementById('logs').textContent = window.electronAPI.getLogsPathSync?.() || '';
103
+ </script>
104
+ </body>
105
+ </html>
106
+ `;
107
+ function hasSeenFirstRun() {
108
+ try {
109
+ return fs.existsSync((0, paths_1.firstRunFlagPath)());
110
+ }
111
+ catch {
112
+ return false;
113
+ }
114
+ }
115
+ function markFirstRunSeen() {
116
+ try {
117
+ fs.mkdirSync(path.dirname((0, paths_1.firstRunFlagPath)()), { recursive: true });
118
+ fs.writeFileSync((0, paths_1.firstRunFlagPath)(), new Date().toISOString());
119
+ }
120
+ catch (err) {
121
+ (0, logger_1.log)(`写入首启标记失败: ${err.message}`, 'warn');
122
+ }
123
+ }
124
+ function showFirstRunOverlay(parent) {
125
+ return new Promise((resolve) => {
126
+ const overlay = new electron_1.BrowserWindow({
127
+ parent,
128
+ modal: true,
129
+ frame: false,
130
+ transparent: true,
131
+ width: 520,
132
+ height: 360,
133
+ resizable: false,
134
+ movable: false,
135
+ minimizable: false,
136
+ maximizable: false,
137
+ title: 'Welcome',
138
+ });
139
+ const dataUrl = 'data:text/html;charset=utf-8,' + encodeURIComponent(OVERLAY_HTML);
140
+ overlay.loadURL(dataUrl);
141
+ // 一次性的 IPC handler, 关闭后清掉避免累积
142
+ const handler = () => {
143
+ markFirstRunSeen();
144
+ overlay.close();
145
+ };
146
+ electron_1.ipcMain.once('first-run:ack', handler);
147
+ overlay.on('closed', () => {
148
+ electron_1.ipcMain.removeListener('first-run:ack', handler);
149
+ resolve();
150
+ });
151
+ });
152
+ }
153
+ /** 注册 IPC handlers (给 preload 桥用) */
154
+ function registerFirstRunIpc() {
155
+ electron_1.ipcMain.handle('first-run:seen', () => hasSeenFirstRun());
156
+ electron_1.ipcMain.handle('first-run:mark-seen', () => { markFirstRunSeen(); });
157
+ // 同步值 (不用 ipcRenderer.invoke 的 await) — 用 exposeInMainWorld 的 sync getter 更顺
158
+ electron_1.ipcMain.handle('first-run:data-dir', () => (0, paths_1.dataDir)());
159
+ electron_1.ipcMain.handle('first-run:logs-dir', () => (0, paths_1.logsDir)());
160
+ (0, logger_1.log)('first-run IPC handlers registered');
161
+ }
162
+ /** 包装 — 决定要不要弹 overlay */
163
+ async function maybeShowFirstRun(parent) {
164
+ if (hasSeenFirstRun())
165
+ return;
166
+ (0, logger_1.log)('首启 — 弹出引导');
167
+ await showFirstRunOverlay(parent);
168
+ electron_1.app.addRecentDocument((0, paths_1.firstRunFlagPath)()); // 跟踪最近文档, 让 user 知道有这文件
169
+ }
170
+ //# sourceMappingURL=first-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"first-run.js","sourceRoot":"","sources":["../../../src/electron/first-run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerCoreIpc = registerCoreIpc;
4
+ /**
5
+ * IPC handler 集中注册 — version / userData path / open-external (legacy 3 个)
6
+ * dialog/fs 的注册在 dialogs.ts; updater 的注册在 updater.ts
7
+ */
8
+ const electron_1 = require("electron");
9
+ const paths_1 = require("./paths");
10
+ const logger_1 = require("./logger");
11
+ function registerCoreIpc() {
12
+ electron_1.ipcMain.handle('get-version', () => electron_1.app.getVersion());
13
+ electron_1.ipcMain.handle('get-user-data-path', () => (0, paths_1.userDataDir)());
14
+ electron_1.ipcMain.handle('get-data-path', () => (0, paths_1.dataDir)()); // 跟 userData 分开, 渲染层要用
15
+ electron_1.ipcMain.handle('open-external', async (_event, url) => {
16
+ await electron_1.shell.openExternal(url);
17
+ });
18
+ (0, logger_1.log)('core IPC handlers registered');
19
+ }
20
+ //# sourceMappingURL=ipc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ipc.js","sourceRoot":"","sources":["../../../src/electron/ipc.ts"],"names":[],"mappings":";;AAQA,0CAWC;AAnBD;;;GAGG;AACH,uCAA+C;AAC/C,mCAA+C;AAC/C,qCAA+B;AAE/B,SAAgB,eAAe;IAC7B,kBAAO,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,cAAG,CAAC,UAAU,EAAE,CAAC,CAAC;IAEtD,kBAAO,CAAC,MAAM,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,IAAA,mBAAW,GAAE,CAAC,CAAC;IAC1D,kBAAO,CAAC,MAAM,CAAC,eAAe,EAAE,GAAG,EAAE,CAAC,IAAA,eAAO,GAAE,CAAC,CAAC,CAAC,uBAAuB;IAEzE,kBAAO,CAAC,MAAM,CAAC,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,GAAW,EAAE,EAAE;QAC5D,MAAM,gBAAK,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,IAAA,YAAG,EAAC,8BAA8B,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,114 @@
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.log = log;
37
+ /**
38
+ * 简单 logger: 写日志到 <userData>/logs/bolloon.log, size-based 轮转
39
+ * (5MB 上限, 保留 .1 .2 .3 共 3 个备份 → ~20MB 上限)
40
+ *
41
+ * 同步写是因为 Electron 主进程日志量小, 同步 append 简单可靠, 不丢日志.
42
+ * 量大的会话级 jsonl 走自己路径 (lifecycle-hooks 等), 跟本 logger 无关.
43
+ */
44
+ const fs = __importStar(require("fs"));
45
+ const paths_1 = require("./paths");
46
+ const MAX_BYTES = 5 * 1024 * 1024;
47
+ const MAX_BACKUPS = 3; // 保留 bolloon.log.1 .2 .3
48
+ let currentSize = 0;
49
+ let initialized = false;
50
+ function ensureLogFile() {
51
+ if (initialized)
52
+ return;
53
+ initialized = true;
54
+ try {
55
+ fs.mkdirSync((0, paths_1.logsDir)(), { recursive: true });
56
+ try {
57
+ currentSize = fs.statSync((0, paths_1.mainLogPath)()).size;
58
+ }
59
+ catch {
60
+ currentSize = 0;
61
+ }
62
+ }
63
+ catch (err) {
64
+ // 失败也无所谓, log() 内部会 swallow
65
+ currentSize = 0;
66
+ console.error('[logger] ensureLogFile failed:', err);
67
+ }
68
+ }
69
+ function rotate() {
70
+ const logPath = (0, paths_1.mainLogPath)();
71
+ for (let i = MAX_BACKUPS; i >= 1; i--) {
72
+ const src = `${logPath}.${i}`;
73
+ const dst = `${logPath}.${i + 1}`;
74
+ if (i === MAX_BACKUPS) {
75
+ try {
76
+ fs.unlinkSync(src);
77
+ }
78
+ catch { /* missing ok */ }
79
+ }
80
+ else {
81
+ try {
82
+ fs.renameSync(src, dst);
83
+ }
84
+ catch { /* missing ok */ }
85
+ }
86
+ }
87
+ try {
88
+ fs.renameSync(logPath, `${logPath}.1`);
89
+ }
90
+ catch { /* missing ok */ }
91
+ currentSize = 0;
92
+ }
93
+ function log(message, level = 'info') {
94
+ ensureLogFile();
95
+ const ts = new Date().toISOString();
96
+ const line = `[${ts}] [${level}] ${message}\n`;
97
+ if (currentSize + line.length > MAX_BYTES)
98
+ rotate();
99
+ try {
100
+ fs.appendFileSync((0, paths_1.mainLogPath)(), line);
101
+ currentSize += line.length;
102
+ }
103
+ catch (err) {
104
+ // 写不进就 console, 不要再递归 log
105
+ console.error('[logger] appendFileSync failed:', err);
106
+ }
107
+ if (level === 'error')
108
+ console.error(line.trimEnd());
109
+ else if (level === 'warn')
110
+ console.warn(line.trimEnd());
111
+ else
112
+ console.log(line.trimEnd());
113
+ }
114
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../src/electron/logger.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,kBAkBC;AArED;;;;;;GAMG;AACH,uCAAyB;AAEzB,mCAA+C;AAE/C,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAClC,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,yBAAyB;AAEhD,IAAI,WAAW,GAAG,CAAC,CAAC;AACpB,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB,SAAS,aAAa;IACpB,IAAI,WAAW;QAAE,OAAO;IACxB,WAAW,GAAG,IAAI,CAAC;IACnB,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,IAAA,eAAO,GAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAA,mBAAW,GAAE,CAAC,CAAC,IAAI,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC;YACP,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,4BAA4B;QAC5B,WAAW,GAAG,CAAC,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED,SAAS,MAAM;IACb,MAAM,OAAO,GAAG,IAAA,mBAAW,GAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,IAAI,CAAC,KAAK,WAAW,EAAE,CAAC;YACtB,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAC1E,WAAW,GAAG,CAAC,CAAC;AAClB,CAAC;AAID,SAAgB,GAAG,CAAC,OAAe,EAAE,QAAkB,MAAM;IAC3D,aAAa,EAAE,CAAC;IAChB,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,IAAI,EAAE,MAAM,KAAK,KAAK,OAAO,IAAI,CAAC;IAE/C,IAAI,WAAW,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS;QAAE,MAAM,EAAE,CAAC;IAEpD,IAAI,CAAC;QACH,EAAE,CAAC,cAAc,CAAC,IAAA,mBAAW,GAAE,EAAE,IAAI,CAAC,CAAC;QACvC,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,0BAA0B;QAC1B,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;SAChD,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;;QACnD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Electron 主进程 lifecycle 入口
5
+ * 单实例锁 → whenReady → createMainWindow → cleanup on quit
6
+ * 启动时: 装 menu / tray / IPC handlers / 首启引导
7
+ */
8
+ const electron_1 = require("electron");
9
+ const logger_1 = require("./logger");
10
+ const window_1 = require("./window");
11
+ const server_1 = require("./server");
12
+ const menu_1 = require("./menu");
13
+ const tray_1 = require("./tray");
14
+ const ipc_1 = require("./ipc");
15
+ const dialogs_1 = require("./dialogs");
16
+ const first_run_1 = require("./first-run");
17
+ const auto_update_js_1 = require("../utils/auto-update.js");
18
+ (0, logger_1.log)('Bolloon Electron 启动');
19
+ // 单实例锁
20
+ const gotTheLock = electron_1.app.requestSingleInstanceLock();
21
+ if (!gotTheLock) {
22
+ (0, logger_1.log)('已有实例在运行,退出');
23
+ electron_1.app.quit();
24
+ }
25
+ electron_1.app.on('second-instance', () => {
26
+ (0, window_1.focusMainWindow)();
27
+ });
28
+ electron_1.app.whenReady().then(async () => {
29
+ (0, logger_1.log)('Electron 准备好');
30
+ (0, ipc_1.registerCoreIpc)();
31
+ (0, dialogs_1.registerDialogIpc)();
32
+ (0, first_run_1.registerFirstRunIpc)();
33
+ (0, menu_1.installAppMenu)(window_1.getMainWindow);
34
+ (0, tray_1.createTray)(window_1.getMainWindow);
35
+ // 启动自动更新检查(后台,不阻塞 UI)。
36
+ // 安装成功后用 app.relaunch() 自动重启以应用新版本(避免单实例锁冲突)。
37
+ void (async () => {
38
+ try {
39
+ await (0, auto_update_js_1.checkAndUpdate)({
40
+ onUpdated: () => {
41
+ electron_1.app.relaunch();
42
+ electron_1.app.exit(0);
43
+ },
44
+ });
45
+ }
46
+ catch {
47
+ // 自动更新失败不影响主程序
48
+ }
49
+ })();
50
+ await (0, window_1.createMainWindow)();
51
+ // 首启引导 (在主窗口就绪后弹, 不阻塞 UI)
52
+ const win = (0, window_1.getMainWindow)();
53
+ if (win) {
54
+ win.webContents.once('did-finish-load', () => {
55
+ void (0, first_run_1.maybeShowFirstRun)(win);
56
+ });
57
+ }
58
+ electron_1.app.on('activate', async () => {
59
+ // macOS: dock 图标被点击且没有窗口时, 重开
60
+ if (electron_1.BrowserWindow.getAllWindows().length === 0) {
61
+ await (0, window_1.createMainWindow)();
62
+ }
63
+ });
64
+ });
65
+ electron_1.app.on('window-all-closed', () => {
66
+ (0, logger_1.log)('所有窗口已关闭');
67
+ (0, tray_1.destroyTray)();
68
+ (0, server_1.killWebServer)();
69
+ if (process.platform !== 'darwin') {
70
+ electron_1.app.quit();
71
+ }
72
+ });
73
+ electron_1.app.on('before-quit', () => {
74
+ (0, logger_1.log)('应用即将退出');
75
+ (0, tray_1.destroyTray)();
76
+ (0, server_1.killWebServer)();
77
+ });
78
+ (0, logger_1.log)('主进程初始化完成');
79
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../../../src/electron/main.ts"],"names":[],"mappings":";;AAAA;;;;GAIG;AACH,uCAA8C;AAC9C,qCAA+B;AAC/B,qCAA4E;AAC5E,qCAAyC;AACzC,iCAAwC;AACxC,iCAAiD;AACjD,+BAAwC;AACxC,uCAA8C;AAC9C,2CAAqE;AACrE,4DAAyD;AAEzD,IAAA,YAAG,EAAC,qBAAqB,CAAC,CAAC;AAE3B,OAAO;AACP,MAAM,UAAU,GAAG,cAAG,CAAC,yBAAyB,EAAE,CAAC;AACnD,IAAI,CAAC,UAAU,EAAE,CAAC;IAChB,IAAA,YAAG,EAAC,YAAY,CAAC,CAAC;IAClB,cAAG,CAAC,IAAI,EAAE,CAAC;AACb,CAAC;AAED,cAAG,CAAC,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,IAAA,wBAAe,GAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAEH,cAAG,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE;IAC9B,IAAA,YAAG,EAAC,cAAc,CAAC,CAAC;IACpB,IAAA,qBAAe,GAAE,CAAC;IAClB,IAAA,2BAAiB,GAAE,CAAC;IACpB,IAAA,+BAAmB,GAAE,CAAC;IACtB,IAAA,qBAAc,EAAC,sBAAa,CAAC,CAAC;IAC9B,IAAA,iBAAU,EAAC,sBAAa,CAAC,CAAC;IAE1B,uBAAuB;IACvB,8CAA8C;IAC9C,KAAK,CAAC,KAAK,IAAI,EAAE;QACf,IAAI,CAAC;YACH,MAAM,IAAA,+BAAc,EAAC;gBACnB,SAAS,EAAE,GAAG,EAAE;oBACd,cAAG,CAAC,QAAQ,EAAE,CAAC;oBACf,cAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACd,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,eAAe;QACjB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,IAAA,yBAAgB,GAAE,CAAC;IAEzB,0BAA0B;IAC1B,MAAM,GAAG,GAAG,IAAA,sBAAa,GAAE,CAAC;IAC5B,IAAI,GAAG,EAAE,CAAC;QACR,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,EAAE;YAC3C,KAAK,IAAA,6BAAiB,EAAC,GAAG,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,cAAG,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;QAC5B,8BAA8B;QAC9B,IAAI,wBAAa,CAAC,aAAa,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAA,yBAAgB,GAAE,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,cAAG,CAAC,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,IAAA,YAAG,EAAC,SAAS,CAAC,CAAC;IACf,IAAA,kBAAW,GAAE,CAAC;IACd,IAAA,sBAAa,GAAE,CAAC;IAChB,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,cAAG,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,cAAG,CAAC,EAAE,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,IAAA,YAAG,EAAC,QAAQ,CAAC,CAAC;IACd,IAAA,kBAAW,GAAE,CAAC;IACd,IAAA,sBAAa,GAAE,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,IAAA,YAAG,EAAC,UAAU,CAAC,CAAC"}
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildAppMenu = buildAppMenu;
4
+ exports.installAppMenu = installAppMenu;
5
+ /**
6
+ * 应用菜单 — macOS 标准 + File/Edit/View/Window/Help 自定义项
7
+ * "Open Data Folder" 等会跨平台显示 (mac 也会出现, 不会冲突)
8
+ */
9
+ const electron_1 = require("electron");
10
+ const paths_1 = require("./paths");
11
+ const logger_1 = require("./logger");
12
+ function openDataFolder() {
13
+ electron_1.shell.openPath((0, paths_1.dataDir)()).catch((e) => (0, logger_1.log)(`open data folder 失败: ${e.message}`, 'error'));
14
+ }
15
+ function openLogsFolder() {
16
+ electron_1.shell.openPath((0, paths_1.logsDir)()).catch((e) => (0, logger_1.log)(`open logs folder 失败: ${e.message}`, 'error'));
17
+ }
18
+ function openExternal(url) {
19
+ electron_1.shell.openExternal(url).catch((e) => (0, logger_1.log)(`openExternal 失败: ${e.message}`, 'error'));
20
+ }
21
+ function buildAppMenu(getMainWindow) {
22
+ const isMac = process.platform === 'darwin';
23
+ const win = getMainWindow();
24
+ const appMenu = {
25
+ label: electron_1.app.getName(),
26
+ submenu: [
27
+ { role: 'about' },
28
+ { type: 'separator' },
29
+ { role: 'services' },
30
+ { type: 'separator' },
31
+ { role: 'hide' },
32
+ { role: 'hideOthers' },
33
+ { role: 'unhide' },
34
+ { type: 'separator' },
35
+ { role: 'quit' },
36
+ ],
37
+ };
38
+ const fileMenu = {
39
+ label: 'File',
40
+ submenu: [
41
+ {
42
+ label: 'Open Data Folder',
43
+ accelerator: 'CmdOrCtrl+Shift+D',
44
+ click: () => openDataFolder(),
45
+ },
46
+ {
47
+ label: 'Open Logs Folder',
48
+ accelerator: 'CmdOrCtrl+Shift+L',
49
+ click: () => openLogsFolder(),
50
+ },
51
+ { type: 'separator' },
52
+ isMac ? { role: 'close' } : { role: 'quit' },
53
+ ],
54
+ };
55
+ const editMenu = {
56
+ label: 'Edit',
57
+ submenu: [
58
+ { role: 'undo' },
59
+ { role: 'redo' },
60
+ { type: 'separator' },
61
+ { role: 'cut' },
62
+ { role: 'copy' },
63
+ { role: 'paste' },
64
+ { role: 'selectAll' },
65
+ ],
66
+ };
67
+ const viewMenu = {
68
+ label: 'View',
69
+ submenu: [
70
+ {
71
+ label: 'Reload',
72
+ accelerator: 'CmdOrCtrl+R',
73
+ click: () => win?.webContents.reload(),
74
+ },
75
+ {
76
+ label: 'Force Reload',
77
+ accelerator: 'CmdOrCtrl+Shift+R',
78
+ click: () => win?.webContents.reloadIgnoringCache(),
79
+ },
80
+ {
81
+ label: 'Toggle DevTools',
82
+ accelerator: isMac ? 'Alt+Cmd+I' : 'Ctrl+Shift+I',
83
+ click: () => win?.webContents.toggleDevTools(),
84
+ },
85
+ { type: 'separator' },
86
+ { role: 'resetZoom' },
87
+ { role: 'zoomIn' },
88
+ { role: 'zoomOut' },
89
+ { type: 'separator' },
90
+ { role: 'togglefullscreen' },
91
+ ],
92
+ };
93
+ const windowMenu = {
94
+ label: 'Window',
95
+ submenu: [
96
+ { role: 'minimize' },
97
+ { role: 'zoom' },
98
+ ...(isMac
99
+ ? [{ type: 'separator' }, { role: 'front' }]
100
+ : [{ role: 'close' }]),
101
+ ],
102
+ };
103
+ const helpMenu = {
104
+ role: 'help',
105
+ submenu: [
106
+ {
107
+ label: 'GitHub Repository',
108
+ click: () => openExternal('https://github.com/bolloon/bolloon'),
109
+ },
110
+ {
111
+ label: 'Report Issue',
112
+ click: () => openExternal('https://github.com/bolloon/bolloon/issues'),
113
+ },
114
+ { type: 'separator' },
115
+ {
116
+ label: 'About Bolloon Agent',
117
+ click: () => {
118
+ // 简单 about — 用 dialog 暂代 (避免再造 HTML 窗口)
119
+ // 真实 about panel 在 macOS 是 app.role 触发的, 我们走菜单项即可
120
+ const { dialog } = require('electron');
121
+ dialog.showMessageBox({
122
+ type: 'info',
123
+ title: 'About Bolloon Agent',
124
+ message: `Bolloon Agent v${electron_1.app.getVersion()}`,
125
+ detail: `P2P AI Document Agent\nData: ${(0, paths_1.dataDir)()}\nLogs: ${(0, paths_1.logsDir)()}`,
126
+ buttons: ['OK'],
127
+ }).catch(() => { });
128
+ },
129
+ },
130
+ ],
131
+ };
132
+ const template = [
133
+ ...(isMac ? [appMenu] : []),
134
+ fileMenu,
135
+ editMenu,
136
+ viewMenu,
137
+ windowMenu,
138
+ helpMenu,
139
+ ];
140
+ return electron_1.Menu.buildFromTemplate(template);
141
+ }
142
+ function installAppMenu(getMainWindow) {
143
+ electron_1.Menu.setApplicationMenu(buildAppMenu(getMainWindow));
144
+ }
145
+ //# sourceMappingURL=menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.js","sourceRoot":"","sources":["../../../src/electron/menu.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
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.dataDir = dataDir;
37
+ exports.userDataDir = userDataDir;
38
+ exports.logsDir = logsDir;
39
+ exports.mainLogPath = mainLogPath;
40
+ exports.firstRunFlagPath = firstRunFlagPath;
41
+ exports.buildResourcesDir = buildResourcesDir;
42
+ /**
43
+ * 路径常量 — 单一来源, 避免散落各处
44
+ *
45
+ * dataDir: 用户数据 (LLM config / P2P secret / 频道 JSON 等) — 故意保持在 ~/.bolloon/
46
+ * 与 CLI 共用, 卸载 app 不删数据. 不要改这个路径, 不要做 userData 重定向.
47
+ * userDataDir: Electron 的 app.getPath('userData'), 用来放日志 / 临时 / 锁文件
48
+ * logsDir: userData 下的 logs/ 子目录
49
+ */
50
+ const electron_1 = require("electron");
51
+ const os = __importStar(require("os"));
52
+ const path = __importStar(require("path"));
53
+ function dataDir() {
54
+ return path.join(os.homedir(), '.bolloon');
55
+ }
56
+ function userDataDir() {
57
+ return electron_1.app.getPath('userData');
58
+ }
59
+ function logsDir() {
60
+ return path.join(userDataDir(), 'logs');
61
+ }
62
+ function mainLogPath() {
63
+ return path.join(logsDir(), 'bolloon.log');
64
+ }
65
+ function firstRunFlagPath() {
66
+ return path.join(userDataDir(), '.bolloon-first-run-seen');
67
+ }
68
+ /** 资源目录: packaged 下是 process.resourcesPath/build, dev 下是 repo/build/ */
69
+ function buildResourcesDir() {
70
+ if (electron_1.app.isPackaged) {
71
+ return path.join(process.resourcesPath, 'build');
72
+ }
73
+ return path.join(electron_1.app.getAppPath(), 'build');
74
+ }
75
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/electron/paths.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,0BAEC;AAED,kCAEC;AAED,0BAEC;AAED,kCAEC;AAED,4CAEC;AAGD,8CAKC;AAtCD;;;;;;;GAOG;AACH,uCAA+B;AAC/B,uCAAyB;AACzB,2CAA6B;AAE7B,SAAgB,OAAO;IACrB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,cAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AACjC,CAAC;AAED,SAAgB,OAAO;IACrB,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,SAAgB,WAAW;IACzB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,yBAAyB,CAAC,CAAC;AAC7D,CAAC;AAED,wEAAwE;AACxE,SAAgB,iBAAiB;IAC/B,IAAI,cAAG,CAAC,UAAU,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;IACnD,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,cAAG,CAAC,UAAU,EAAE,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC"}