@bolloon/bolloon-agent 0.3.36 → 0.3.38
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 +107 -0
- package/dist/agents/pi-sdk.js +20 -2
- package/dist/bootstrap/context-collector.js +5 -1
- package/dist/cli/ink-app.js +46 -8
- package/dist/cli/loading-tui.js +7 -5
- package/dist/cli-entry.js +1 -1
- 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 +606 -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 +134 -31
- package/dist/llm/config-store.js +18 -2
- package/dist/llm/pi-ai.js +29 -11
- package/dist/security/tool-gate.js +2 -0
- package/dist/utils/auto-update.js +19 -51
- package/package.json +6 -5
|
@@ -0,0 +1,606 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* npm 自动更新检查器
|
|
4
|
+
*
|
|
5
|
+
* 功能:
|
|
6
|
+
* - 启动时(后台、节流)检查 npm 注册表是否有新版本
|
|
7
|
+
* - 检测到新版本时自动下载并安装最新版本(可按需关闭)
|
|
8
|
+
* - 支持增量更新(只更新有变化的包)
|
|
9
|
+
*
|
|
10
|
+
* 设计要点:
|
|
11
|
+
* - 全局安装位置通过 `npm root -g` / `npm prefix -g` 动态探测,
|
|
12
|
+
* 不再依赖写死的路径,兼容 nvm / homebrew / 默认 prefix。
|
|
13
|
+
* - 运行中的包版本优先从全局安装位置(npm root -g 动态探测)读取,
|
|
14
|
+
* 开发态下若 cwd 的 package.json 就是本包则回退到 cwd,不受任意工作目录影响。
|
|
15
|
+
* - 检查频率受节流缓存约束(默认 24h 一次),不会每次启动都打 npm。
|
|
16
|
+
*/
|
|
17
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
18
|
+
if (k2 === undefined) k2 = k;
|
|
19
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
20
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
21
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
22
|
+
}
|
|
23
|
+
Object.defineProperty(o, k2, desc);
|
|
24
|
+
}) : (function(o, m, k, k2) {
|
|
25
|
+
if (k2 === undefined) k2 = k;
|
|
26
|
+
o[k2] = m[k];
|
|
27
|
+
}));
|
|
28
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
29
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
30
|
+
}) : function(o, v) {
|
|
31
|
+
o["default"] = v;
|
|
32
|
+
});
|
|
33
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
34
|
+
var ownKeys = function(o) {
|
|
35
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
36
|
+
var ar = [];
|
|
37
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
38
|
+
return ar;
|
|
39
|
+
};
|
|
40
|
+
return ownKeys(o);
|
|
41
|
+
};
|
|
42
|
+
return function (mod) {
|
|
43
|
+
if (mod && mod.__esModule) return mod;
|
|
44
|
+
var result = {};
|
|
45
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
46
|
+
__setModuleDefault(result, mod);
|
|
47
|
+
return result;
|
|
48
|
+
};
|
|
49
|
+
})();
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.setNotifyQuiet = setNotifyQuiet;
|
|
52
|
+
exports.checkAndUpdate = checkAndUpdate;
|
|
53
|
+
exports.checkForUpdates = checkForUpdates;
|
|
54
|
+
exports.performUpdate = performUpdate;
|
|
55
|
+
const child_process_1 = require("child_process");
|
|
56
|
+
const fs = __importStar(require("fs"));
|
|
57
|
+
const path = __importStar(require("path"));
|
|
58
|
+
const https = __importStar(require("https"));
|
|
59
|
+
const http = __importStar(require("http"));
|
|
60
|
+
// ANSI 颜色
|
|
61
|
+
const RESET = '\x1b[0m';
|
|
62
|
+
const BOLD = '\x1b[1m';
|
|
63
|
+
const CYAN = '\x1b[36m';
|
|
64
|
+
const GREEN = '\x1b[32m';
|
|
65
|
+
const YELLOW = '\x1b[33m';
|
|
66
|
+
const MAGENTA = '\x1b[35m';
|
|
67
|
+
const PKG_NAME = '@bolloon/bolloon-agent';
|
|
68
|
+
const BOLLOON_DIR = path.join(process.env.HOME || process.env.USERPROFILE || '/tmp', '.bolloon');
|
|
69
|
+
const UPDATE_CACHE = path.join(BOLLOON_DIR, '.update-check.json');
|
|
70
|
+
/** 2026-08-07: CLI 交互模式下静音自动更新通知 (避免后台检查污染 TUI 屏幕) */
|
|
71
|
+
let notifyQuiet = false;
|
|
72
|
+
function setNotifyQuiet(v) {
|
|
73
|
+
notifyQuiet = v;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 通知用户。使用 stderr,避免在交互式 CLI 模式下 stdout 被吞掉。
|
|
77
|
+
*/
|
|
78
|
+
function notify(msg, color = RESET) {
|
|
79
|
+
if (notifyQuiet)
|
|
80
|
+
return;
|
|
81
|
+
process.stderr.write(`${color}${msg}${RESET}`);
|
|
82
|
+
}
|
|
83
|
+
function httpGet(url) {
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
const client = url.startsWith('https') ? https : http;
|
|
86
|
+
const req = client.get(url, { timeout: 10000 }, (res) => {
|
|
87
|
+
let data = '';
|
|
88
|
+
res.on('data', (chunk) => data += chunk);
|
|
89
|
+
res.on('end', () => resolve(data));
|
|
90
|
+
});
|
|
91
|
+
req.on('error', reject);
|
|
92
|
+
req.on('timeout', () => {
|
|
93
|
+
req.destroy();
|
|
94
|
+
reject(new Error('请求超时'));
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* 读取某目录下的 package.json 版本号
|
|
100
|
+
*/
|
|
101
|
+
function readVersion(dir) {
|
|
102
|
+
if (!dir)
|
|
103
|
+
return null;
|
|
104
|
+
const pkgPath = path.join(dir, 'package.json');
|
|
105
|
+
try {
|
|
106
|
+
if (fs.existsSync(pkgPath)) {
|
|
107
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
|
|
108
|
+
return pkg.version || null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// 忽略
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* 获取 bolloon 全局安装目录(动态探测,兼容多种 npm 安装方式)。
|
|
118
|
+
* 同时兼容 ESM(Node) 与 CJS(Electron) 上下文,不依赖 import.meta。
|
|
119
|
+
*/
|
|
120
|
+
function getGlobalBolloonDir() {
|
|
121
|
+
const candidates = [];
|
|
122
|
+
// 1. npm root -g(最可靠)
|
|
123
|
+
try {
|
|
124
|
+
const npmRoot = (0, child_process_1.execSync)('npm root -g', { encoding: 'utf-8', timeout: 8000 }).trim();
|
|
125
|
+
if (npmRoot)
|
|
126
|
+
candidates.push(path.join(npmRoot, '@bolloon', 'bolloon-agent'));
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
// 忽略
|
|
130
|
+
}
|
|
131
|
+
// 2. npm prefix -g
|
|
132
|
+
try {
|
|
133
|
+
const npmPrefix = (0, child_process_1.execSync)('npm prefix -g', { encoding: 'utf-8', timeout: 8000 }).trim();
|
|
134
|
+
if (npmPrefix)
|
|
135
|
+
candidates.push(path.join(npmPrefix, 'lib', 'node_modules', '@bolloon', 'bolloon-agent'));
|
|
136
|
+
}
|
|
137
|
+
catch {
|
|
138
|
+
// 忽略
|
|
139
|
+
}
|
|
140
|
+
// 3. nvm 各版本目录
|
|
141
|
+
const home = process.env.HOME || '';
|
|
142
|
+
const nvmBase = path.join(home, '.nvm', 'versions', 'node');
|
|
143
|
+
try {
|
|
144
|
+
if (fs.existsSync(nvmBase)) {
|
|
145
|
+
for (const ver of fs.readdirSync(nvmBase)) {
|
|
146
|
+
candidates.push(path.join(nvmBase, ver, 'lib', 'node_modules', '@bolloon', 'bolloon-agent'));
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// 忽略
|
|
152
|
+
}
|
|
153
|
+
// 4. 常见写死路径兜底
|
|
154
|
+
candidates.push(path.join(home, '.npm-global', 'lib', 'node_modules', '@bolloon', 'bolloon-agent'), '/usr/local/lib/node_modules/@bolloon/bolloon-agent', '/opt/homebrew/lib/node_modules/@bolloon/bolloon-agent', path.join(home, 'node_modules', '@bolloon', 'bolloon-agent'));
|
|
155
|
+
for (const p of candidates) {
|
|
156
|
+
if (fs.existsSync(path.join(p, 'package.json')))
|
|
157
|
+
return p;
|
|
158
|
+
}
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 获取当前安装的包版本。
|
|
163
|
+
* 主包优先用「全局安装位置」;开发态下若 cwd 的 package.json 就是本包则回退到 cwd。
|
|
164
|
+
* 不再无差别回退到 cwd(避免全局启动时误读用户工作目录的版本)。
|
|
165
|
+
*/
|
|
166
|
+
function getInstalledVersion(packageName) {
|
|
167
|
+
if (packageName === PKG_NAME) {
|
|
168
|
+
const fromGlobal = readVersion(getGlobalBolloonDir());
|
|
169
|
+
if (fromGlobal)
|
|
170
|
+
return fromGlobal;
|
|
171
|
+
// 开发态:仅在 cwd 的 package.json 确为本包时才采用
|
|
172
|
+
const cwdPkg = path.join(process.cwd(), 'package.json');
|
|
173
|
+
try {
|
|
174
|
+
if (fs.existsSync(cwdPkg)) {
|
|
175
|
+
const data = JSON.parse(fs.readFileSync(cwdPkg, 'utf-8'));
|
|
176
|
+
if (data.name === PKG_NAME && data.version)
|
|
177
|
+
return data.version;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
// 忽略
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// 其它包:检查本地 node_modules
|
|
185
|
+
const packageJsonPath = findPackageJson(packageName);
|
|
186
|
+
if (packageJsonPath) {
|
|
187
|
+
return readVersion(path.dirname(packageJsonPath));
|
|
188
|
+
}
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* 查找包的 package.json 路径
|
|
193
|
+
*/
|
|
194
|
+
function findPackageJson(packageName) {
|
|
195
|
+
const checkPaths = [
|
|
196
|
+
path.join(process.cwd(), 'node_modules', packageName, 'package.json'),
|
|
197
|
+
path.join(process.cwd(), 'node_modules', '@' + packageName.split('/')[0], packageName.split('/')[1] || '', 'package.json'),
|
|
198
|
+
];
|
|
199
|
+
for (const p of checkPaths) {
|
|
200
|
+
if (fs.existsSync(p))
|
|
201
|
+
return p;
|
|
202
|
+
}
|
|
203
|
+
return null;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 检查 npm 注册表获取最新版本
|
|
207
|
+
*/
|
|
208
|
+
async function getLatestVersion(packageName) {
|
|
209
|
+
try {
|
|
210
|
+
const encodedName = encodeURIComponent(packageName);
|
|
211
|
+
const url = `https://registry.npmjs.org/${encodedName}`;
|
|
212
|
+
const response = await httpGet(url);
|
|
213
|
+
const data = JSON.parse(response);
|
|
214
|
+
return data['dist-tags']?.latest || null;
|
|
215
|
+
}
|
|
216
|
+
catch (e) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* 比较版本号
|
|
222
|
+
*/
|
|
223
|
+
function compareVersions(current, latest) {
|
|
224
|
+
const norm = (v) => v.replace(/^v/, '').split('-')[0].split('.').map(Number);
|
|
225
|
+
const currentParts = norm(current);
|
|
226
|
+
const latestParts = norm(latest);
|
|
227
|
+
for (let i = 0; i < Math.max(currentParts.length, latestParts.length); i++) {
|
|
228
|
+
const c = currentParts[i] || 0;
|
|
229
|
+
const l = latestParts[i] || 0;
|
|
230
|
+
if (c < l)
|
|
231
|
+
return -1;
|
|
232
|
+
if (c > l)
|
|
233
|
+
return 1;
|
|
234
|
+
}
|
|
235
|
+
return 0;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* 检查 bolloon 相关包是否有更新
|
|
239
|
+
*/
|
|
240
|
+
async function checkBolloonUpdates() {
|
|
241
|
+
const packagesToCheck = [
|
|
242
|
+
PKG_NAME,
|
|
243
|
+
'@bolloon/constraint-runtime',
|
|
244
|
+
];
|
|
245
|
+
const outdatedPackages = [];
|
|
246
|
+
let hasUpdate = false;
|
|
247
|
+
let currentVersion = '';
|
|
248
|
+
let latestVersion = '';
|
|
249
|
+
for (const pkg of packagesToCheck) {
|
|
250
|
+
const installed = getInstalledVersion(pkg);
|
|
251
|
+
if (!installed)
|
|
252
|
+
continue;
|
|
253
|
+
if (pkg === PKG_NAME) {
|
|
254
|
+
currentVersion = installed;
|
|
255
|
+
}
|
|
256
|
+
const latest = await getLatestVersion(pkg);
|
|
257
|
+
if (latest && compareVersions(installed, latest) < 0) {
|
|
258
|
+
hasUpdate = true;
|
|
259
|
+
latestVersion = latest;
|
|
260
|
+
outdatedPackages.push({
|
|
261
|
+
name: pkg,
|
|
262
|
+
current: installed,
|
|
263
|
+
wanted: latest,
|
|
264
|
+
latest,
|
|
265
|
+
location: pkg
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
if (outdatedPackages.length === 0) {
|
|
270
|
+
return {
|
|
271
|
+
name: PKG_NAME,
|
|
272
|
+
version: currentVersion,
|
|
273
|
+
latest: currentVersion,
|
|
274
|
+
outdated: false,
|
|
275
|
+
packages: []
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
name: PKG_NAME,
|
|
280
|
+
version: currentVersion,
|
|
281
|
+
latest: latestVersion,
|
|
282
|
+
outdated: hasUpdate,
|
|
283
|
+
packages: outdatedPackages
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* 使用 npm outdated 检查所有包的更新
|
|
288
|
+
*/
|
|
289
|
+
function checkNpmOutdated() {
|
|
290
|
+
try {
|
|
291
|
+
const output = (0, child_process_1.execSync)('npm outdated --json', {
|
|
292
|
+
encoding: 'utf-8',
|
|
293
|
+
timeout: 30000,
|
|
294
|
+
maxBuffer: 10 * 1024 * 1024,
|
|
295
|
+
cwd: process.cwd()
|
|
296
|
+
});
|
|
297
|
+
if (!output.trim())
|
|
298
|
+
return [];
|
|
299
|
+
const data = JSON.parse(output);
|
|
300
|
+
const packages = [];
|
|
301
|
+
for (const [name, info] of Object.entries(data)) {
|
|
302
|
+
const pkg = info;
|
|
303
|
+
packages.push({
|
|
304
|
+
name,
|
|
305
|
+
current: pkg.current || '0.0.0',
|
|
306
|
+
wanted: pkg.wanted || '0.0.0',
|
|
307
|
+
latest: pkg.latest || '0.0.0',
|
|
308
|
+
location: pkg.location || name
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
return packages;
|
|
312
|
+
}
|
|
313
|
+
catch (e) {
|
|
314
|
+
// npm outdated 在没有过时包时会返回非零退出码
|
|
315
|
+
if (e.status !== 0 && !e.message?.includes('npm outdated')) {
|
|
316
|
+
return [];
|
|
317
|
+
}
|
|
318
|
+
return [];
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* 解析 `name` 或 `name@version` 形式,未带版本时从 npm 解析 latest,
|
|
323
|
+
* 拼成 `name@version`,避免 npm 被本地 package.json 的 semver 约束卡住。
|
|
324
|
+
*/
|
|
325
|
+
async function resolveTargetsWithVersion(targets) {
|
|
326
|
+
return Promise.all(targets.map(async (spec) => {
|
|
327
|
+
const m = spec.match(/^(.+?)@([^@]+)$/);
|
|
328
|
+
// 形如 @scope/name@1.2.3 或 name@1.2.3 且版本以数字开头 -> 已带版本
|
|
329
|
+
if (m && m[2] && /^\d/.test(m[2]))
|
|
330
|
+
return spec;
|
|
331
|
+
const latest = await getLatestVersion(spec);
|
|
332
|
+
return latest ? `${spec}@${latest}` : spec;
|
|
333
|
+
}));
|
|
334
|
+
}
|
|
335
|
+
/**
|
|
336
|
+
* 自动更新 npm 包, 传 `name@version` 形式的目标让 npm install 不被本地
|
|
337
|
+
* package.json 的 semver 约束卡住(旧版只传 name 时, npm 看到本地
|
|
338
|
+
* package.json 里 "^0.3.x" 已经满足就判 up to date, 永远升不上去)
|
|
339
|
+
*/
|
|
340
|
+
async function updatePackagesWithVersion(packagesWithVersion) {
|
|
341
|
+
const parsed = packagesWithVersion.map(spec => {
|
|
342
|
+
const at = spec.lastIndexOf('@');
|
|
343
|
+
if (at <= 0)
|
|
344
|
+
return { name: spec, version: '' };
|
|
345
|
+
return { name: spec.slice(0, at), version: spec.slice(at + 1) };
|
|
346
|
+
});
|
|
347
|
+
const targets = parsed.map(p => p.name);
|
|
348
|
+
const before = new Map();
|
|
349
|
+
for (const p of targets)
|
|
350
|
+
before.set(p, getInstalledVersion(p));
|
|
351
|
+
// 用 targetsWithVersion 直接拼命令 - 包含具体版本号, 不会被本地约束拦截
|
|
352
|
+
const args = ['npm', 'install', '-g', ...packagesWithVersion];
|
|
353
|
+
notify(`\n${CYAN}📦 正在更新包...${RESET}\n`, RESET);
|
|
354
|
+
try {
|
|
355
|
+
(0, child_process_1.execSync)(args.join(' '), {
|
|
356
|
+
encoding: 'utf-8',
|
|
357
|
+
timeout: 300000,
|
|
358
|
+
stdio: 'inherit',
|
|
359
|
+
// 全局安装与 cwd 无关,用中性目录避免本地 package.json 干扰
|
|
360
|
+
cwd: process.env.TMPDIR || '/tmp'
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
catch (e) {
|
|
364
|
+
return {
|
|
365
|
+
success: false,
|
|
366
|
+
updated: false,
|
|
367
|
+
message: '更新失败',
|
|
368
|
+
error: e.message
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
// install 退出码 0 并不等于"真的升上去了" ("up to date" 也是 0)。
|
|
372
|
+
// 重新读取磁盘版本, 只有真的达到 latest 之一才算 updated。
|
|
373
|
+
const upgraded = [];
|
|
374
|
+
for (const p of parsed) {
|
|
375
|
+
const after = getInstalledVersion(p.name);
|
|
376
|
+
const was = before.get(p.name);
|
|
377
|
+
if (after && was && compareVersions(was, after) < 0) {
|
|
378
|
+
upgraded.push(p.name);
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
if (upgraded.length > 0) {
|
|
382
|
+
return {
|
|
383
|
+
success: true,
|
|
384
|
+
updated: true,
|
|
385
|
+
message: `已更新: ${upgraded.join(', ')}`,
|
|
386
|
+
updatedPackages: upgraded
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
return {
|
|
390
|
+
success: true,
|
|
391
|
+
updated: false,
|
|
392
|
+
message: '已是最新版本,无需重启',
|
|
393
|
+
updatedPackages: []
|
|
394
|
+
};
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* 自动更新 npm 包(不传版本时自动解析 latest)
|
|
398
|
+
*/
|
|
399
|
+
async function updatePackages(packages) {
|
|
400
|
+
const targets = packages && packages.length > 0 ? packages : [PKG_NAME];
|
|
401
|
+
const withVersion = await resolveTargetsWithVersion(targets);
|
|
402
|
+
return updatePackagesWithVersion(withVersion);
|
|
403
|
+
}
|
|
404
|
+
function loadUpdateConfig() {
|
|
405
|
+
const def = { autoUpdate: true, autoRestart: true, checkIntervalHours: 24 };
|
|
406
|
+
try {
|
|
407
|
+
const cfgPath = path.join(BOLLOON_DIR, 'config.json');
|
|
408
|
+
if (fs.existsSync(cfgPath)) {
|
|
409
|
+
const cfg = JSON.parse(fs.readFileSync(cfgPath, 'utf-8'));
|
|
410
|
+
if (typeof cfg.autoUpdate === 'boolean')
|
|
411
|
+
def.autoUpdate = cfg.autoUpdate;
|
|
412
|
+
if (typeof cfg.autoRestart === 'boolean')
|
|
413
|
+
def.autoRestart = cfg.autoRestart;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
// 忽略
|
|
418
|
+
}
|
|
419
|
+
return def;
|
|
420
|
+
}
|
|
421
|
+
function readCache() {
|
|
422
|
+
try {
|
|
423
|
+
if (fs.existsSync(UPDATE_CACHE)) {
|
|
424
|
+
return JSON.parse(fs.readFileSync(UPDATE_CACHE, 'utf-8'));
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
// 忽略
|
|
429
|
+
}
|
|
430
|
+
return {};
|
|
431
|
+
}
|
|
432
|
+
function writeCache(patch) {
|
|
433
|
+
try {
|
|
434
|
+
fs.mkdirSync(BOLLOON_DIR, { recursive: true });
|
|
435
|
+
const merged = { ...readCache(), ...patch, lastCheck: Date.now() };
|
|
436
|
+
fs.writeFileSync(UPDATE_CACHE, JSON.stringify(merged));
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
// 忽略
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
function shouldCheckNow(cfg) {
|
|
443
|
+
const cache = readCache();
|
|
444
|
+
const last = cache.lastCheck || 0;
|
|
445
|
+
const interval = cfg.checkIntervalHours * 3600 * 1000;
|
|
446
|
+
return Date.now() - last >= interval;
|
|
447
|
+
}
|
|
448
|
+
/**
|
|
449
|
+
* 判断本次启动是否应执行自动更新检查。
|
|
450
|
+
* 显式屏蔽(--no-update / BOLLOON_SKIP_UPDATE)始终优先。
|
|
451
|
+
* 否则依据 config.json 的 autoUpdate(默认开启)或显式允许标志。
|
|
452
|
+
*/
|
|
453
|
+
function resolveAutoUpdatePolicy() {
|
|
454
|
+
const blockFlag = process.argv.includes('--no-update') || process.argv.includes('--skip-update');
|
|
455
|
+
const blockEnv = process.env.BOLLOON_SKIP_UPDATE === 'true';
|
|
456
|
+
const allowFlag = process.argv.includes('--update-check')
|
|
457
|
+
|| process.argv.includes('--update-now')
|
|
458
|
+
|| process.argv.includes('--allow-update');
|
|
459
|
+
const allowEnv = process.env.BOLLOON_AUTO_UPDATE === '1';
|
|
460
|
+
const cfg = loadUpdateConfig();
|
|
461
|
+
const blocked = blockFlag || blockEnv;
|
|
462
|
+
const enabled = cfg.autoUpdate || allowFlag || allowEnv;
|
|
463
|
+
return { blocked, enabled, allowFlag, allowEnv, cfg };
|
|
464
|
+
}
|
|
465
|
+
/**
|
|
466
|
+
* 检查并自动更新(启动时调用)
|
|
467
|
+
*
|
|
468
|
+
* @param opts.force 忽略节流/配置强制检查
|
|
469
|
+
* @param opts.onUpdated 安装成功且允许自动重启时调用(由调用方提供模式相关的重启逻辑,
|
|
470
|
+
* 例如 Electron 用 app.relaunch(),Node 用 detached 重新 spawn)。
|
|
471
|
+
* 若未提供或 autoRestart=false,则仅提示用户手动重启。
|
|
472
|
+
*/
|
|
473
|
+
async function checkAndUpdate(opts = {}) {
|
|
474
|
+
const policy = resolveAutoUpdatePolicy();
|
|
475
|
+
if (policy.blocked) {
|
|
476
|
+
return { hasUpdate: false, info: null, updated: false, message: '跳过更新检查(已显式禁用)' };
|
|
477
|
+
}
|
|
478
|
+
if (!policy.enabled && !opts.force) {
|
|
479
|
+
return { hasUpdate: false, info: null, updated: false, message: '自动更新已关闭 (config.json autoUpdate=false,或设置 BOLLOON_AUTO_UPDATE=1 开启)' };
|
|
480
|
+
}
|
|
481
|
+
// 节流:除非显式触发或强制,否则距离上次检查不足间隔就跳过
|
|
482
|
+
if (!opts.force && !policy.allowFlag && !policy.allowEnv && !shouldCheckNow(policy.cfg)) {
|
|
483
|
+
return { hasUpdate: false, info: null, updated: false, message: '距上次检查不足间隔,跳过' };
|
|
484
|
+
}
|
|
485
|
+
notify(`\n${CYAN}🔍 检查更新...${RESET}`, RESET);
|
|
486
|
+
try {
|
|
487
|
+
const bolloonInfo = await checkBolloonUpdates();
|
|
488
|
+
if (bolloonInfo && bolloonInfo.outdated) {
|
|
489
|
+
notify(`\n${YELLOW}⚠️ 发现新版本: ${bolloonInfo.latest}${RESET}\n`, RESET);
|
|
490
|
+
notify(` 当前版本: ${bolloonInfo.version}\n`, RESET);
|
|
491
|
+
notify(` 最新版本: ${bolloonInfo.latest}\n\n`, RESET);
|
|
492
|
+
// 避免对同一个版本反复自动安装失败:记录上次尝试
|
|
493
|
+
const cache = readCache();
|
|
494
|
+
const lastAttempt = cache.lastAttempt || {};
|
|
495
|
+
if (lastAttempt.version === bolloonInfo.latest && lastAttempt.ok === false && !opts.force) {
|
|
496
|
+
notify(`${YELLOW}💡 该版本上次自动更新失败,请手动运行: bolloon --update-now${RESET}\n\n`, RESET);
|
|
497
|
+
writeCache({ lastCheck: Date.now() });
|
|
498
|
+
return {
|
|
499
|
+
hasUpdate: true,
|
|
500
|
+
info: bolloonInfo,
|
|
501
|
+
updated: false,
|
|
502
|
+
message: `更新 ${bolloonInfo.latest} 上次失败,需手动更新`
|
|
503
|
+
};
|
|
504
|
+
}
|
|
505
|
+
// 自动更新(用户要求:检测到新版本包时自动更新)
|
|
506
|
+
const targetsWithVersion = bolloonInfo.packages.map(p => `${p.name}@${p.latest}`);
|
|
507
|
+
const result = await updatePackagesWithVersion(targetsWithVersion);
|
|
508
|
+
if (result.success && result.updated) {
|
|
509
|
+
writeCache({ lastAttempt: { version: bolloonInfo.latest, ok: true } });
|
|
510
|
+
// 通知主进程更新完成
|
|
511
|
+
process.emit('bolloon-update-complete', result);
|
|
512
|
+
// 安装成功:按配置自动重启,或退回手动提示
|
|
513
|
+
if (opts.onUpdated && policy.cfg.autoRestart) {
|
|
514
|
+
notify(`\n${GREEN}✅ 已更新到 ${bolloonInfo.latest},即将自动重启以应用新版本...${RESET}\n\n`, RESET);
|
|
515
|
+
// 调用方执行模式相关的重启(Electron: app.relaunch(); Node: detached spawn)。
|
|
516
|
+
// 此调用预期会退出当前进程,不会返回。
|
|
517
|
+
opts.onUpdated();
|
|
518
|
+
// 兜底:若 onUpdated 意外返回,则手动退出
|
|
519
|
+
process.exit(0);
|
|
520
|
+
}
|
|
521
|
+
notify(`\n${GREEN}✅ 已更新到 ${bolloonInfo.latest}!请重新启动应用${RESET}\n`, RESET);
|
|
522
|
+
notify(`${YELLOW}💡 请重新运行 bolloon 以使用新版本${RESET}\n\n`, RESET);
|
|
523
|
+
return {
|
|
524
|
+
hasUpdate: true,
|
|
525
|
+
info: bolloonInfo,
|
|
526
|
+
updated: true,
|
|
527
|
+
message: `已更新到 ${bolloonInfo.latest}`
|
|
528
|
+
};
|
|
529
|
+
}
|
|
530
|
+
else if (result.success && !result.updated) {
|
|
531
|
+
// npm 判定已是最新(未真正升级),记录失败避免反复尝试
|
|
532
|
+
writeCache({ lastAttempt: { version: bolloonInfo.latest, ok: false } });
|
|
533
|
+
notify(` ${YELLOW}⚠ 已是最新(无需重启)${RESET}\n\n`, RESET);
|
|
534
|
+
return {
|
|
535
|
+
hasUpdate: true,
|
|
536
|
+
info: bolloonInfo,
|
|
537
|
+
updated: false,
|
|
538
|
+
message: '已是最新版本'
|
|
539
|
+
};
|
|
540
|
+
}
|
|
541
|
+
else {
|
|
542
|
+
writeCache({ lastAttempt: { version: bolloonInfo.latest, ok: false } });
|
|
543
|
+
notify(` ${YELLOW}⚠ 自动更新失败: ${result.error}${RESET}\n`, RESET);
|
|
544
|
+
notify(`${YELLOW}💡 可手动运行: bolloon --update-now${RESET}\n\n`, RESET);
|
|
545
|
+
return {
|
|
546
|
+
hasUpdate: true,
|
|
547
|
+
info: bolloonInfo,
|
|
548
|
+
updated: false,
|
|
549
|
+
message: `更新失败: ${result.error}`
|
|
550
|
+
};
|
|
551
|
+
}
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
notify(` ${GREEN}✓${RESET} 已是最新版本 (${bolloonInfo?.version || 'unknown'})\n`, RESET);
|
|
555
|
+
writeCache({ lastAttempt: { version: '', ok: true } });
|
|
556
|
+
return {
|
|
557
|
+
hasUpdate: false,
|
|
558
|
+
info: bolloonInfo,
|
|
559
|
+
updated: false,
|
|
560
|
+
message: '已是最新版本'
|
|
561
|
+
};
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
catch (e) {
|
|
565
|
+
notify(` ${YELLOW}⚠${RESET} 更新检查失败: ${e.message}\n`, RESET);
|
|
566
|
+
return {
|
|
567
|
+
hasUpdate: false,
|
|
568
|
+
info: null,
|
|
569
|
+
updated: false,
|
|
570
|
+
message: `检查失败: ${e.message}`
|
|
571
|
+
};
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* 仅检查更新,不自动安装
|
|
576
|
+
*/
|
|
577
|
+
async function checkForUpdates() {
|
|
578
|
+
return await checkBolloonUpdates();
|
|
579
|
+
}
|
|
580
|
+
/**
|
|
581
|
+
* 手动触发更新
|
|
582
|
+
*/
|
|
583
|
+
async function performUpdate(packages) {
|
|
584
|
+
return await updatePackages(packages);
|
|
585
|
+
}
|
|
586
|
+
// CLI 入口
|
|
587
|
+
if (process.argv[1]?.includes('auto-update')) {
|
|
588
|
+
(async () => {
|
|
589
|
+
const command = process.argv[2];
|
|
590
|
+
switch (command) {
|
|
591
|
+
case 'check':
|
|
592
|
+
const info = await checkForUpdates();
|
|
593
|
+
if (info) {
|
|
594
|
+
console.log(JSON.stringify(info, null, 2));
|
|
595
|
+
}
|
|
596
|
+
break;
|
|
597
|
+
case 'update':
|
|
598
|
+
const result = await performUpdate(process.argv.slice(3));
|
|
599
|
+
console.log(JSON.stringify(result, null, 2));
|
|
600
|
+
break;
|
|
601
|
+
default:
|
|
602
|
+
await checkAndUpdate();
|
|
603
|
+
}
|
|
604
|
+
})();
|
|
605
|
+
}
|
|
606
|
+
//# sourceMappingURL=auto-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-update.js","sourceRoot":"","sources":["../../../src/utils/auto-update.ts"],"names":[],"mappings":"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"}
|