@evomap/evolver 1.72.0 → 1.74.1

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.
@@ -0,0 +1,100 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const { execSync } = require('child_process');
4
+ const { getRepoRoot } = require('./gep/paths');
5
+
6
+ const MAX_EXEC_BUFFER = 10 * 1024 * 1024;
7
+
8
+ // Force Update: triggered by Hub when version is critically outdated.
9
+ // Extracted from src/evolve.js so both the evolve main loop and heartbeat
10
+ // thread can trigger it independently (heartbeat-only workers need this
11
+ // because they never reach the evolve run() loop that consumes the pending
12
+ // force_update directive).
13
+ function executeForceUpdate(forceUpdate) {
14
+ const REPO_ROOT = getRepoRoot();
15
+ const requiredVersion = String(forceUpdate.required_version || '').replace(/^>=/, '');
16
+ console.log('[ForceUpdate] Starting multi-channel update (target: >=' + requiredVersion + ')');
17
+
18
+ function parseVer(v) {
19
+ var m = String(v || '').match(/(\d+)\.(\d+)\.(\d+)/);
20
+ return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : [0, 0, 0];
21
+ }
22
+ function isAtLeast(current, required) {
23
+ var c = parseVer(current), r = parseVer(required);
24
+ for (var i = 0; i < 3; i++) {
25
+ if (c[i] > r[i]) return true;
26
+ if (c[i] < r[i]) return false;
27
+ }
28
+ return true;
29
+ }
30
+ function getCurrentVersion() {
31
+ try {
32
+ var pkg = JSON.parse(fs.readFileSync(path.join(REPO_ROOT, 'package.json'), 'utf8'));
33
+ return pkg.version || '0.0.0';
34
+ } catch (_) { return '0.0.0'; }
35
+ }
36
+
37
+ // Channel 1: GitHub Release (via degit)
38
+ try {
39
+ console.log('[ForceUpdate] Channel 1: GitHub Release download...');
40
+ var tmpTarget = path.resolve(REPO_ROOT, '..', '.evolver-update-tmp');
41
+ try { fs.rmSync(tmpTarget, { recursive: true, force: true }); } catch (_) {}
42
+ execSync('npx -y degit EvoMap/evolver ' + JSON.stringify(tmpTarget), {
43
+ encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'],
44
+ timeout: 60000, windowsHide: true, maxBuffer: MAX_EXEC_BUFFER,
45
+ });
46
+ var tmpPkg = JSON.parse(fs.readFileSync(path.join(tmpTarget, 'package.json'), 'utf8'));
47
+ if (tmpPkg.version && isAtLeast(tmpPkg.version, requiredVersion)) {
48
+ var entries = fs.readdirSync(REPO_ROOT, { withFileTypes: true });
49
+ for (var ei = 0; ei < entries.length; ei++) {
50
+ var eName = entries[ei].name;
51
+ if (eName === 'node_modules' || eName === 'memory' || eName === '.git' || eName === 'MEMORY.md') continue;
52
+ try { fs.rmSync(path.join(REPO_ROOT, eName), { recursive: true, force: true }); } catch (_) {}
53
+ }
54
+ var newEntries = fs.readdirSync(tmpTarget, { withFileTypes: true });
55
+ for (var ni = 0; ni < newEntries.length; ni++) {
56
+ var src = path.join(tmpTarget, newEntries[ni].name);
57
+ var dst = path.join(REPO_ROOT, newEntries[ni].name);
58
+ fs.cpSync(src, dst, { recursive: true });
59
+ }
60
+ try { fs.rmSync(tmpTarget, { recursive: true, force: true }); } catch (_) {}
61
+ console.log('[ForceUpdate] GitHub Release update successful: ' + tmpPkg.version);
62
+ return true;
63
+ }
64
+ try { fs.rmSync(tmpTarget, { recursive: true, force: true }); } catch (_) {}
65
+ } catch (e) {
66
+ console.warn('[ForceUpdate] GitHub Release failed:', e && e.message || e);
67
+ try { fs.rmSync(path.resolve(REPO_ROOT, '..', '.evolver-update-tmp'), { recursive: true, force: true }); } catch (_) {}
68
+ }
69
+
70
+ // Channel 2: npm
71
+ try {
72
+ console.log('[ForceUpdate] Channel 2: npm install...');
73
+ var npmCmd = 'npm install -g @evomap/evolver@latest';
74
+ execSync(npmCmd, {
75
+ encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'],
76
+ timeout: 120000, windowsHide: true, maxBuffer: MAX_EXEC_BUFFER,
77
+ });
78
+ var newVerNpm = getCurrentVersion();
79
+ if (isAtLeast(newVerNpm, requiredVersion)) {
80
+ console.log('[ForceUpdate] npm update successful: ' + newVerNpm);
81
+ return true;
82
+ }
83
+ } catch (e) {
84
+ console.warn('[ForceUpdate] npm failed:', e && e.message || e);
85
+ }
86
+
87
+ // Channel 3: GitHub release (manual download URL only)
88
+ try {
89
+ var releaseUrl = forceUpdate.release_url;
90
+ if (releaseUrl) {
91
+ console.log('[ForceUpdate] Channel 3: GitHub release -- manual download required');
92
+ console.log('[ForceUpdate] Visit: ' + releaseUrl);
93
+ }
94
+ } catch (_) {}
95
+
96
+ console.warn('[ForceUpdate] All automatic channels exhausted. Current version: ' + getCurrentVersion());
97
+ return false;
98
+ }
99
+
100
+ module.exports = { executeForceUpdate };
Binary file