@bolloon/bolloon-agent 0.3.5 → 0.3.7

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