@bolloon/bolloon-agent 0.3.35 → 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.
- package/dist/agents/pi-sdk-tools.js +2 -1
- package/dist/cli/ink-app.js +44 -1
- package/dist/cli/mention-data.js +23 -0
- package/dist/cli-entry.js +113 -6
- package/dist/electron/config.js +9 -14
- package/dist/electron/dialogs.js +16 -53
- package/dist/electron/first-run.js +24 -65
- package/dist/electron/ipc.js +10 -14
- package/dist/electron/logger.js +7 -44
- package/dist/electron/main.js +42 -45
- package/dist/electron/menu.js +13 -18
- package/dist/electron/paths.js +12 -54
- package/dist/electron/server.js +18 -57
- package/dist/electron/tray.js +15 -53
- package/dist/electron/window.js +22 -61
- package/dist/electron-build/electron/config.js +21 -0
- package/dist/electron-build/electron/config.js.map +1 -0
- package/dist/electron-build/electron/dialogs.js +108 -0
- package/dist/electron-build/electron/dialogs.js.map +1 -0
- package/dist/electron-build/electron/first-run.js +170 -0
- package/dist/electron-build/electron/first-run.js.map +1 -0
- package/dist/electron-build/electron/ipc.js +20 -0
- package/dist/electron-build/electron/ipc.js.map +1 -0
- package/dist/electron-build/electron/logger.js +114 -0
- package/dist/electron-build/electron/logger.js.map +1 -0
- package/dist/electron-build/electron/main.js +79 -0
- package/dist/electron-build/electron/main.js.map +1 -0
- package/dist/electron-build/electron/menu.js +145 -0
- package/dist/electron-build/electron/menu.js.map +1 -0
- package/dist/electron-build/electron/paths.js +75 -0
- package/dist/electron-build/electron/paths.js.map +1 -0
- package/dist/electron-build/electron/server.js +119 -0
- package/dist/electron-build/electron/server.js.map +1 -0
- package/dist/electron-build/electron/tray.js +111 -0
- package/dist/electron-build/electron/tray.js.map +1 -0
- package/dist/electron-build/electron/window.js +111 -0
- package/dist/electron-build/electron/window.js.map +1 -0
- package/dist/electron-build/electron-preload.js +32 -0
- package/dist/electron-build/electron-preload.js.map +1 -0
- package/dist/electron-build/electron.js +8 -0
- package/dist/electron-build/electron.js.map +1 -0
- package/dist/electron-build/utils/auto-update.js +598 -0
- package/dist/electron-build/utils/auto-update.js.map +1 -0
- package/dist/electron-preload.js +16 -19
- package/dist/electron.js +1 -4
- package/dist/index.js +426 -0
- package/dist/utils/auto-update.js +12 -51
- package/package.json +5 -4
|
@@ -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"}
|
|
@@ -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"}
|