@bolloon/bolloon-agent 0.3.12 → 0.3.14

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.
@@ -1,14 +1,54 @@
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;
1
41
  /**
2
42
  * 首启检测 + 引导浮层
3
43
  *
4
44
  * 标记文件写在 userData (不是 ~/.bolloon/), 卸载 app 自然清掉
5
45
  * 引导窗是父主窗的 modal, frame=false, 透明背景; 关闭时标记写入
6
46
  */
7
- import { BrowserWindow, app, ipcMain } from 'electron';
8
- import * as fs from 'fs';
9
- import * as path from 'path';
10
- import { firstRunFlagPath, dataDir, logsDir } from './paths';
11
- import { log } from './logger';
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");
12
52
  const OVERLAY_HTML = `
13
53
  <!DOCTYPE html>
14
54
  <html>
@@ -64,26 +104,26 @@ const OVERLAY_HTML = `
64
104
  </body>
65
105
  </html>
66
106
  `;
67
- export function hasSeenFirstRun() {
107
+ function hasSeenFirstRun() {
68
108
  try {
69
- return fs.existsSync(firstRunFlagPath());
109
+ return fs.existsSync((0, paths_1.firstRunFlagPath)());
70
110
  }
71
111
  catch {
72
112
  return false;
73
113
  }
74
114
  }
75
- export function markFirstRunSeen() {
115
+ function markFirstRunSeen() {
76
116
  try {
77
- fs.mkdirSync(path.dirname(firstRunFlagPath()), { recursive: true });
78
- fs.writeFileSync(firstRunFlagPath(), new Date().toISOString());
117
+ fs.mkdirSync(path.dirname((0, paths_1.firstRunFlagPath)()), { recursive: true });
118
+ fs.writeFileSync((0, paths_1.firstRunFlagPath)(), new Date().toISOString());
79
119
  }
80
120
  catch (err) {
81
- log(`写入首启标记失败: ${err.message}`, 'warn');
121
+ (0, logger_1.log)(`写入首启标记失败: ${err.message}`, 'warn');
82
122
  }
83
123
  }
84
- export function showFirstRunOverlay(parent) {
124
+ function showFirstRunOverlay(parent) {
85
125
  return new Promise((resolve) => {
86
- const overlay = new BrowserWindow({
126
+ const overlay = new electron_1.BrowserWindow({
87
127
  parent,
88
128
  modal: true,
89
129
  frame: false,
@@ -103,27 +143,28 @@ export function showFirstRunOverlay(parent) {
103
143
  markFirstRunSeen();
104
144
  overlay.close();
105
145
  };
106
- ipcMain.once('first-run:ack', handler);
146
+ electron_1.ipcMain.once('first-run:ack', handler);
107
147
  overlay.on('closed', () => {
108
- ipcMain.removeListener('first-run:ack', handler);
148
+ electron_1.ipcMain.removeListener('first-run:ack', handler);
109
149
  resolve();
110
150
  });
111
151
  });
112
152
  }
113
153
  /** 注册 IPC handlers (给 preload 桥用) */
114
- export function registerFirstRunIpc() {
115
- ipcMain.handle('first-run:seen', () => hasSeenFirstRun());
116
- ipcMain.handle('first-run:mark-seen', () => { markFirstRunSeen(); });
154
+ function registerFirstRunIpc() {
155
+ electron_1.ipcMain.handle('first-run:seen', () => hasSeenFirstRun());
156
+ electron_1.ipcMain.handle('first-run:mark-seen', () => { markFirstRunSeen(); });
117
157
  // 同步值 (不用 ipcRenderer.invoke 的 await) — 用 exposeInMainWorld 的 sync getter 更顺
118
- ipcMain.handle('first-run:data-dir', () => dataDir());
119
- ipcMain.handle('first-run:logs-dir', () => logsDir());
120
- log('first-run IPC handlers registered');
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');
121
161
  }
122
162
  /** 包装 — 决定要不要弹 overlay */
123
- export async function maybeShowFirstRun(parent) {
163
+ async function maybeShowFirstRun(parent) {
124
164
  if (hasSeenFirstRun())
125
165
  return;
126
- log('首启 — 弹出引导');
166
+ (0, logger_1.log)('首启 — 弹出引导');
127
167
  await showFirstRunOverlay(parent);
128
- app.addRecentDocument(firstRunFlagPath()); // 跟踪最近文档, 让 user 知道有这文件
168
+ electron_1.app.addRecentDocument((0, paths_1.firstRunFlagPath)()); // 跟踪最近文档, 让 user 知道有这文件
129
169
  }
170
+ //# sourceMappingURL=first-run.js.map
@@ -1,16 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.registerCoreIpc = registerCoreIpc;
1
4
  /**
2
5
  * IPC handler 集中注册 — version / userData path / open-external (legacy 3 个)
3
6
  * dialog/fs 的注册在 dialogs.ts; updater 的注册在 updater.ts
4
7
  */
5
- import { app, ipcMain, shell } from 'electron';
6
- import { userDataDir, dataDir } from './paths';
7
- import { log } from './logger';
8
- export function registerCoreIpc() {
9
- ipcMain.handle('get-version', () => app.getVersion());
10
- ipcMain.handle('get-user-data-path', () => userDataDir());
11
- ipcMain.handle('get-data-path', () => dataDir()); // 跟 userData 分开, 渲染层要用
12
- ipcMain.handle('open-external', async (_event, url) => {
13
- await shell.openExternal(url);
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);
14
17
  });
15
- log('core IPC handlers registered');
18
+ (0, logger_1.log)('core IPC handlers registered');
16
19
  }
20
+ //# sourceMappingURL=ipc.js.map
@@ -1,3 +1,39 @@
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;
1
37
  /**
2
38
  * 简单 logger: 写日志到 <userData>/logs/bolloon.log, size-based 轮转
3
39
  * (5MB 上限, 保留 .1 .2 .3 共 3 个备份 → ~20MB 上限)
@@ -5,8 +41,8 @@
5
41
  * 同步写是因为 Electron 主进程日志量小, 同步 append 简单可靠, 不丢日志.
6
42
  * 量大的会话级 jsonl 走自己路径 (lifecycle-hooks 等), 跟本 logger 无关.
7
43
  */
8
- import * as fs from 'fs';
9
- import { mainLogPath, logsDir } from './paths';
44
+ const fs = __importStar(require("fs"));
45
+ const paths_1 = require("./paths");
10
46
  const MAX_BYTES = 5 * 1024 * 1024;
11
47
  const MAX_BACKUPS = 3; // 保留 bolloon.log.1 .2 .3
12
48
  let currentSize = 0;
@@ -16,9 +52,9 @@ function ensureLogFile() {
16
52
  return;
17
53
  initialized = true;
18
54
  try {
19
- fs.mkdirSync(logsDir(), { recursive: true });
55
+ fs.mkdirSync((0, paths_1.logsDir)(), { recursive: true });
20
56
  try {
21
- currentSize = fs.statSync(mainLogPath()).size;
57
+ currentSize = fs.statSync((0, paths_1.mainLogPath)()).size;
22
58
  }
23
59
  catch {
24
60
  currentSize = 0;
@@ -31,7 +67,7 @@ function ensureLogFile() {
31
67
  }
32
68
  }
33
69
  function rotate() {
34
- const logPath = mainLogPath();
70
+ const logPath = (0, paths_1.mainLogPath)();
35
71
  for (let i = MAX_BACKUPS; i >= 1; i--) {
36
72
  const src = `${logPath}.${i}`;
37
73
  const dst = `${logPath}.${i + 1}`;
@@ -54,14 +90,14 @@ function rotate() {
54
90
  catch { /* missing ok */ }
55
91
  currentSize = 0;
56
92
  }
57
- export function log(message, level = 'info') {
93
+ function log(message, level = 'info') {
58
94
  ensureLogFile();
59
95
  const ts = new Date().toISOString();
60
96
  const line = `[${ts}] [${level}] ${message}\n`;
61
97
  if (currentSize + line.length > MAX_BYTES)
62
98
  rotate();
63
99
  try {
64
- fs.appendFileSync(mainLogPath(), line);
100
+ fs.appendFileSync((0, paths_1.mainLogPath)(), line);
65
101
  currentSize += line.length;
66
102
  }
67
103
  catch (err) {
@@ -75,3 +111,4 @@ export function log(message, level = 'info') {
75
111
  else
76
112
  console.log(line.trimEnd());
77
113
  }
114
+ //# sourceMappingURL=logger.js.map
@@ -1,43 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
1
3
  /**
2
4
  * Electron 主进程 lifecycle 入口
3
5
  * 单实例锁 → whenReady → createMainWindow → cleanup on quit
4
6
  * 启动时: 装 menu / tray / IPC handlers / 首启引导
5
7
  */
6
- import { app, BrowserWindow } from 'electron';
7
- import { log } from './logger';
8
- import { createMainWindow, focusMainWindow, getMainWindow } from './window';
9
- import { killWebServer } from './server';
10
- import { installAppMenu } from './menu';
11
- import { createTray, destroyTray } from './tray';
12
- import { registerCoreIpc } from './ipc';
13
- import { registerDialogIpc } from './dialogs';
14
- import { registerFirstRunIpc, maybeShowFirstRun } from './first-run';
15
- import { checkAndUpdate } from '../utils/auto-update.js';
16
- log('Bolloon Electron 启动');
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 启动');
17
19
  // 单实例锁
18
- const gotTheLock = app.requestSingleInstanceLock();
20
+ const gotTheLock = electron_1.app.requestSingleInstanceLock();
19
21
  if (!gotTheLock) {
20
- log('已有实例在运行,退出');
21
- app.quit();
22
+ (0, logger_1.log)('已有实例在运行,退出');
23
+ electron_1.app.quit();
22
24
  }
23
- app.on('second-instance', () => {
24
- focusMainWindow();
25
+ electron_1.app.on('second-instance', () => {
26
+ (0, window_1.focusMainWindow)();
25
27
  });
26
- app.whenReady().then(async () => {
27
- log('Electron 准备好');
28
- registerCoreIpc();
29
- registerDialogIpc();
30
- registerFirstRunIpc();
31
- installAppMenu(getMainWindow);
32
- createTray(getMainWindow);
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);
33
35
  // 启动自动更新检查(后台,不阻塞 UI)。
34
36
  // 安装成功后用 app.relaunch() 自动重启以应用新版本(避免单实例锁冲突)。
35
37
  void (async () => {
36
38
  try {
37
- await checkAndUpdate({
39
+ await (0, auto_update_js_1.checkAndUpdate)({
38
40
  onUpdated: () => {
39
- app.relaunch();
40
- app.exit(0);
41
+ electron_1.app.relaunch();
42
+ electron_1.app.exit(0);
41
43
  },
42
44
  });
43
45
  }
@@ -45,32 +47,33 @@ app.whenReady().then(async () => {
45
47
  // 自动更新失败不影响主程序
46
48
  }
47
49
  })();
48
- await createMainWindow();
50
+ await (0, window_1.createMainWindow)();
49
51
  // 首启引导 (在主窗口就绪后弹, 不阻塞 UI)
50
- const win = getMainWindow();
52
+ const win = (0, window_1.getMainWindow)();
51
53
  if (win) {
52
54
  win.webContents.once('did-finish-load', () => {
53
- void maybeShowFirstRun(win);
55
+ void (0, first_run_1.maybeShowFirstRun)(win);
54
56
  });
55
57
  }
56
- app.on('activate', async () => {
58
+ electron_1.app.on('activate', async () => {
57
59
  // macOS: dock 图标被点击且没有窗口时, 重开
58
- if (BrowserWindow.getAllWindows().length === 0) {
59
- await createMainWindow();
60
+ if (electron_1.BrowserWindow.getAllWindows().length === 0) {
61
+ await (0, window_1.createMainWindow)();
60
62
  }
61
63
  });
62
64
  });
63
- app.on('window-all-closed', () => {
64
- log('所有窗口已关闭');
65
- destroyTray();
66
- killWebServer();
65
+ electron_1.app.on('window-all-closed', () => {
66
+ (0, logger_1.log)('所有窗口已关闭');
67
+ (0, tray_1.destroyTray)();
68
+ (0, server_1.killWebServer)();
67
69
  if (process.platform !== 'darwin') {
68
- app.quit();
70
+ electron_1.app.quit();
69
71
  }
70
72
  });
71
- app.on('before-quit', () => {
72
- log('应用即将退出');
73
- destroyTray();
74
- killWebServer();
73
+ electron_1.app.on('before-quit', () => {
74
+ (0, logger_1.log)('应用即将退出');
75
+ (0, tray_1.destroyTray)();
76
+ (0, server_1.killWebServer)();
75
77
  });
76
- log('主进程初始化完成');
78
+ (0, logger_1.log)('主进程初始化完成');
79
+ //# sourceMappingURL=main.js.map
@@ -1,24 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildAppMenu = buildAppMenu;
4
+ exports.installAppMenu = installAppMenu;
1
5
  /**
2
6
  * 应用菜单 — macOS 标准 + File/Edit/View/Window/Help 自定义项
3
7
  * "Open Data Folder" 等会跨平台显示 (mac 也会出现, 不会冲突)
4
8
  */
5
- import { app, Menu, shell } from 'electron';
6
- import { dataDir, logsDir } from './paths';
7
- import { log } from './logger';
9
+ const electron_1 = require("electron");
10
+ const paths_1 = require("./paths");
11
+ const logger_1 = require("./logger");
8
12
  function openDataFolder() {
9
- shell.openPath(dataDir()).catch((e) => log(`open data folder 失败: ${e.message}`, 'error'));
13
+ electron_1.shell.openPath((0, paths_1.dataDir)()).catch((e) => (0, logger_1.log)(`open data folder 失败: ${e.message}`, 'error'));
10
14
  }
11
15
  function openLogsFolder() {
12
- shell.openPath(logsDir()).catch((e) => log(`open logs folder 失败: ${e.message}`, 'error'));
16
+ electron_1.shell.openPath((0, paths_1.logsDir)()).catch((e) => (0, logger_1.log)(`open logs folder 失败: ${e.message}`, 'error'));
13
17
  }
14
18
  function openExternal(url) {
15
- shell.openExternal(url).catch((e) => log(`openExternal 失败: ${e.message}`, 'error'));
19
+ electron_1.shell.openExternal(url).catch((e) => (0, logger_1.log)(`openExternal 失败: ${e.message}`, 'error'));
16
20
  }
17
- export function buildAppMenu(getMainWindow) {
21
+ function buildAppMenu(getMainWindow) {
18
22
  const isMac = process.platform === 'darwin';
19
23
  const win = getMainWindow();
20
24
  const appMenu = {
21
- label: app.getName(),
25
+ label: electron_1.app.getName(),
22
26
  submenu: [
23
27
  { role: 'about' },
24
28
  { type: 'separator' },
@@ -117,8 +121,8 @@ export function buildAppMenu(getMainWindow) {
117
121
  dialog.showMessageBox({
118
122
  type: 'info',
119
123
  title: 'About Bolloon Agent',
120
- message: `Bolloon Agent v${app.getVersion()}`,
121
- detail: `P2P AI Document Agent\nData: ${dataDir()}\nLogs: ${logsDir()}`,
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)()}`,
122
126
  buttons: ['OK'],
123
127
  }).catch(() => { });
124
128
  },
@@ -133,8 +137,9 @@ export function buildAppMenu(getMainWindow) {
133
137
  windowMenu,
134
138
  helpMenu,
135
139
  ];
136
- return Menu.buildFromTemplate(template);
140
+ return electron_1.Menu.buildFromTemplate(template);
137
141
  }
138
- export function installAppMenu(getMainWindow) {
139
- Menu.setApplicationMenu(buildAppMenu(getMainWindow));
142
+ function installAppMenu(getMainWindow) {
143
+ electron_1.Menu.setApplicationMenu(buildAppMenu(getMainWindow));
140
144
  }
145
+ //# sourceMappingURL=menu.js.map
@@ -1,3 +1,44 @@
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;
1
42
  /**
2
43
  * 路径常量 — 单一来源, 避免散落各处
3
44
  *
@@ -6,28 +47,29 @@
6
47
  * userDataDir: Electron 的 app.getPath('userData'), 用来放日志 / 临时 / 锁文件
7
48
  * logsDir: userData 下的 logs/ 子目录
8
49
  */
9
- import { app } from 'electron';
10
- import * as os from 'os';
11
- import * as path from 'path';
12
- export function dataDir() {
50
+ const electron_1 = require("electron");
51
+ const os = __importStar(require("os"));
52
+ const path = __importStar(require("path"));
53
+ function dataDir() {
13
54
  return path.join(os.homedir(), '.bolloon');
14
55
  }
15
- export function userDataDir() {
16
- return app.getPath('userData');
56
+ function userDataDir() {
57
+ return electron_1.app.getPath('userData');
17
58
  }
18
- export function logsDir() {
59
+ function logsDir() {
19
60
  return path.join(userDataDir(), 'logs');
20
61
  }
21
- export function mainLogPath() {
62
+ function mainLogPath() {
22
63
  return path.join(logsDir(), 'bolloon.log');
23
64
  }
24
- export function firstRunFlagPath() {
65
+ function firstRunFlagPath() {
25
66
  return path.join(userDataDir(), '.bolloon-first-run-seen');
26
67
  }
27
68
  /** 资源目录: packaged 下是 process.resourcesPath/build, dev 下是 repo/build/ */
28
- export function buildResourcesDir() {
29
- if (app.isPackaged) {
69
+ function buildResourcesDir() {
70
+ if (electron_1.app.isPackaged) {
30
71
  return path.join(process.resourcesPath, 'build');
31
72
  }
32
- return path.join(app.getAppPath(), 'build');
73
+ return path.join(electron_1.app.getAppPath(), 'build');
33
74
  }
75
+ //# sourceMappingURL=paths.js.map
@@ -1,13 +1,51 @@
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;
1
39
  /**
2
40
  * Spawns dist/web/server.js as a child Node process (via Electron's
3
41
  * ELECTRON_RUN_AS_NODE=1) and parses BOLLOON_PORT=NNNN to learn the
4
42
  * actually-bound port (which may have drifted from the preferred port
5
43
  * due to EADDRINUSE auto-bump).
6
44
  */
7
- import { spawn } from 'child_process';
8
- import * as path from 'path';
9
- import { log } from './logger';
10
- import { WEB_SERVER_STARTUP_TIMEOUT_MS, DEFAULT_HOST } from './config';
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");
11
49
  // Resolve to the directory holding this file. See src/electron/window.ts for the rationale;
12
50
  // this avoids the same `import.meta` / `__dirname` redeclaration conflicts that broke
13
51
  // the electron tsconfig when esnext module mode was set.
@@ -15,30 +53,30 @@ const g = globalThis;
15
53
  const __basedir = g.__dirname
16
54
  ?? (g.__filename ? path.dirname(g.__filename) : process.cwd());
17
55
  let webServerProcess = null;
18
- export function getWebServerProcess() {
56
+ function getWebServerProcess() {
19
57
  return webServerProcess;
20
58
  }
21
- export function killWebServer() {
59
+ function killWebServer() {
22
60
  if (webServerProcess && !webServerProcess.killed) {
23
- log('终止 Web 服务器进程');
61
+ (0, logger_1.log)('终止 Web 服务器进程');
24
62
  webServerProcess.kill();
25
63
  }
26
64
  webServerProcess = null;
27
65
  }
28
- export function startWebServer(preferredPort) {
66
+ function startWebServer(preferredPort) {
29
67
  return new Promise((resolve, reject) => {
30
68
  const serverScript = path.join(__basedir, '..', 'web', 'server.js');
31
- log(`启动 Web 服务器进程: ${serverScript}`);
69
+ (0, logger_1.log)(`启动 Web 服务器进程: ${serverScript}`);
32
70
  // ELECTRON_RUN_AS_NODE=1 — packaged 时 process.execPath 是 Electron 二进制,
33
71
  // 没这行 require() 会失败. Dev 模式 (electron dist/electron.js) 同样情况.
34
- webServerProcess = spawn(process.execPath, [serverScript], {
72
+ webServerProcess = (0, child_process_1.spawn)(process.execPath, [serverScript], {
35
73
  env: {
36
74
  ...process.env,
37
75
  ELECTRON_RUN_AS_NODE: '1',
38
76
  NODE_ENV: 'production',
39
77
  PORT: String(preferredPort),
40
78
  ELECTRON_PORT: String(preferredPort),
41
- BOLLOON_HOST: DEFAULT_HOST,
79
+ BOLLOON_HOST: config_1.DEFAULT_HOST,
42
80
  },
43
81
  stdio: ['ignore', 'pipe', 'pipe'],
44
82
  });
@@ -50,31 +88,32 @@ export function startWebServer(preferredPort) {
50
88
  const m = stdoutBuf.match(/^BOLLOON_PORT=(\d+)/m);
51
89
  if (m) {
52
90
  const actualPort = parseInt(m[1], 10);
53
- log(`Web 服务器就绪: 实际端口=${actualPort} (preferred=${preferredPort})`);
91
+ (0, logger_1.log)(`Web 服务器就绪: 实际端口=${actualPort} (preferred=${preferredPort})`);
54
92
  resolve({ port: actualPort });
55
93
  }
56
94
  });
57
95
  webServerProcess.stderr?.on('data', (data) => {
58
96
  stderrData += data.toString();
59
97
  process.stderr.write(`[WebServer ERR] ${data}`);
60
- log(`[WebServer stderr] ${data.toString().trim()}`, 'warn');
98
+ (0, logger_1.log)(`[WebServer stderr] ${data.toString().trim()}`, 'warn');
61
99
  });
62
100
  webServerProcess.on('error', (err) => {
63
- log(`Web 服务器启动失败: ${err.message}`, 'error');
101
+ (0, logger_1.log)(`Web 服务器启动失败: ${err.message}`, 'error');
64
102
  reject(err);
65
103
  });
66
104
  webServerProcess.on('exit', (code, signal) => {
67
- log(`Web 服务器退出: code=${code} signal=${signal}`);
105
+ (0, logger_1.log)(`Web 服务器退出: code=${code} signal=${signal}`);
68
106
  if (code !== 0 && code !== null) {
69
- log(`Web 服务器 stderr: ${stderrData.slice(0, 500)}`, 'error');
107
+ (0, logger_1.log)(`Web 服务器 stderr: ${stderrData.slice(0, 500)}`, 'error');
70
108
  }
71
109
  webServerProcess = null;
72
110
  });
73
111
  setTimeout(() => {
74
112
  if (webServerProcess && !webServerProcess.killed) {
75
- log(`Web 服务器启动超时 (${WEB_SERVER_STARTUP_TIMEOUT_MS}ms)`, 'error');
113
+ (0, logger_1.log)(`Web 服务器启动超时 (${config_1.WEB_SERVER_STARTUP_TIMEOUT_MS}ms)`, 'error');
76
114
  reject(new Error('Web server startup timeout'));
77
115
  }
78
- }, WEB_SERVER_STARTUP_TIMEOUT_MS);
116
+ }, config_1.WEB_SERVER_STARTUP_TIMEOUT_MS);
79
117
  });
80
118
  }
119
+ //# sourceMappingURL=server.js.map