@zincapp/znvault-cli 2.1.0
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/README.md +310 -0
- package/dist/commands/agent.d.ts +3 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +660 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/apikey.d.ts +3 -0
- package/dist/commands/apikey.d.ts.map +1 -0
- package/dist/commands/apikey.js +767 -0
- package/dist/commands/apikey.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +147 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +426 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/cert.d.ts +3 -0
- package/dist/commands/cert.d.ts.map +1 -0
- package/dist/commands/cert.js +398 -0
- package/dist/commands/cert.js.map +1 -0
- package/dist/commands/cluster.d.ts +3 -0
- package/dist/commands/cluster.d.ts.map +1 -0
- package/dist/commands/cluster.js +228 -0
- package/dist/commands/cluster.js.map +1 -0
- package/dist/commands/emergency.d.ts +3 -0
- package/dist/commands/emergency.d.ts.map +1 -0
- package/dist/commands/emergency.js +223 -0
- package/dist/commands/emergency.js.map +1 -0
- package/dist/commands/health.d.ts +3 -0
- package/dist/commands/health.d.ts.map +1 -0
- package/dist/commands/health.js +188 -0
- package/dist/commands/health.js.map +1 -0
- package/dist/commands/lockdown.d.ts +3 -0
- package/dist/commands/lockdown.d.ts.map +1 -0
- package/dist/commands/lockdown.js +232 -0
- package/dist/commands/lockdown.js.map +1 -0
- package/dist/commands/permissions.d.ts +3 -0
- package/dist/commands/permissions.d.ts.map +1 -0
- package/dist/commands/permissions.js +168 -0
- package/dist/commands/permissions.js.map +1 -0
- package/dist/commands/policy.d.ts +3 -0
- package/dist/commands/policy.d.ts.map +1 -0
- package/dist/commands/policy.js +660 -0
- package/dist/commands/policy.js.map +1 -0
- package/dist/commands/superadmin.d.ts +3 -0
- package/dist/commands/superadmin.d.ts.map +1 -0
- package/dist/commands/superadmin.js +203 -0
- package/dist/commands/superadmin.js.map +1 -0
- package/dist/commands/tenant.d.ts +3 -0
- package/dist/commands/tenant.d.ts.map +1 -0
- package/dist/commands/tenant.js +277 -0
- package/dist/commands/tenant.js.map +1 -0
- package/dist/commands/update.d.ts +9 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +359 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/user.d.ts +3 -0
- package/dist/commands/user.d.ts.map +1 -0
- package/dist/commands/user.js +363 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/client.d.ts +246 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +734 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +130 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +342 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/db.d.ts +111 -0
- package/dist/lib/db.d.ts.map +1 -0
- package/dist/lib/db.js +698 -0
- package/dist/lib/db.js.map +1 -0
- package/dist/lib/local.d.ts +41 -0
- package/dist/lib/local.d.ts.map +1 -0
- package/dist/lib/local.js +236 -0
- package/dist/lib/local.js.map +1 -0
- package/dist/lib/mode.d.ts +210 -0
- package/dist/lib/mode.d.ts.map +1 -0
- package/dist/lib/mode.js +389 -0
- package/dist/lib/mode.js.map +1 -0
- package/dist/lib/output.d.ts +61 -0
- package/dist/lib/output.d.ts.map +1 -0
- package/dist/lib/output.js +190 -0
- package/dist/lib/output.js.map +1 -0
- package/dist/lib/prompts.d.ts +32 -0
- package/dist/lib/prompts.d.ts.map +1 -0
- package/dist/lib/prompts.js +96 -0
- package/dist/lib/prompts.js.map +1 -0
- package/dist/services/auto-update-daemon.d.ts +48 -0
- package/dist/services/auto-update-daemon.d.ts.map +1 -0
- package/dist/services/auto-update-daemon.js +296 -0
- package/dist/services/auto-update-daemon.js.map +1 -0
- package/dist/services/signature-verifier.d.ts +38 -0
- package/dist/services/signature-verifier.d.ts.map +1 -0
- package/dist/services/signature-verifier.js +209 -0
- package/dist/services/signature-verifier.js.map +1 -0
- package/dist/services/update-checker.d.ts +39 -0
- package/dist/services/update-checker.d.ts.map +1 -0
- package/dist/services/update-checker.js +198 -0
- package/dist/services/update-checker.js.map +1 -0
- package/dist/services/update-installer.d.ts +54 -0
- package/dist/services/update-installer.d.ts.map +1 -0
- package/dist/services/update-installer.js +360 -0
- package/dist/services/update-installer.js.map +1 -0
- package/dist/types/index.d.ts +411 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/update.d.ts +137 -0
- package/dist/types/update.d.ts.map +1 -0
- package/dist/types/update.js +27 -0
- package/dist/types/update.js.map +1 -0
- package/dist/utils/platform.d.ts +35 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +115 -0
- package/dist/utils/platform.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
// Path: znvault-cli/src/services/signature-verifier.ts
|
|
2
|
+
/**
|
|
3
|
+
* Signature Verification Service
|
|
4
|
+
*
|
|
5
|
+
* Verifies GPG signatures and SHA256 checksums for agent updates.
|
|
6
|
+
* Uses the openpgp library for pure JavaScript implementation.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as crypto from 'crypto';
|
|
10
|
+
import * as https from 'https';
|
|
11
|
+
import * as openpgp from 'openpgp';
|
|
12
|
+
import { getPublicKeyUrl } from '../types/update.js';
|
|
13
|
+
/**
|
|
14
|
+
* Embedded public key for verification
|
|
15
|
+
* This is the fallback key used when the remote key cannot be fetched.
|
|
16
|
+
* It should be updated when the signing key is rotated.
|
|
17
|
+
*
|
|
18
|
+
* Key ID: 8E703B1277C29EEFADA1C7AF843C39536B732281
|
|
19
|
+
* Email: agent-releases@zincapp.com
|
|
20
|
+
*/
|
|
21
|
+
const EMBEDDED_PUBLIC_KEY = `-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
22
|
+
|
|
23
|
+
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
|
|
82
|
+
WHcbEBz8WFnmLA==
|
|
83
|
+
=TbOo
|
|
84
|
+
-----END PGP PUBLIC KEY BLOCK-----`;
|
|
85
|
+
export class SignatureVerifier {
|
|
86
|
+
publicKeyArmored = null;
|
|
87
|
+
publicKeyFetched = false;
|
|
88
|
+
/**
|
|
89
|
+
* Verify SHA256 checksum of a file
|
|
90
|
+
*/
|
|
91
|
+
verifyChecksum(filePath, expectedSha256) {
|
|
92
|
+
const fileBuffer = fs.readFileSync(filePath);
|
|
93
|
+
const hash = crypto.createHash('sha256').update(fileBuffer).digest('hex');
|
|
94
|
+
return hash.toLowerCase() === expectedSha256.toLowerCase();
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Calculate SHA256 checksum of a file
|
|
98
|
+
*/
|
|
99
|
+
calculateChecksum(filePath) {
|
|
100
|
+
const fileBuffer = fs.readFileSync(filePath);
|
|
101
|
+
return crypto.createHash('sha256').update(fileBuffer).digest('hex');
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Fetch the public key from S3
|
|
105
|
+
*/
|
|
106
|
+
async fetchPublicKey() {
|
|
107
|
+
if (this.publicKeyArmored) {
|
|
108
|
+
return this.publicKeyArmored;
|
|
109
|
+
}
|
|
110
|
+
const url = getPublicKeyUrl();
|
|
111
|
+
return new Promise((resolve, reject) => {
|
|
112
|
+
https.get(url, { rejectUnauthorized: true }, (res) => {
|
|
113
|
+
if (res.statusCode !== 200) {
|
|
114
|
+
reject(new Error(`Failed to fetch public key: HTTP ${res.statusCode}`));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
let data = '';
|
|
118
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
119
|
+
res.on('end', () => {
|
|
120
|
+
this.publicKeyArmored = data;
|
|
121
|
+
this.publicKeyFetched = true;
|
|
122
|
+
resolve(data);
|
|
123
|
+
});
|
|
124
|
+
}).on('error', reject);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get the public key for verification
|
|
129
|
+
* Tries to fetch from S3, falls back to embedded key
|
|
130
|
+
*/
|
|
131
|
+
async getPublicKey() {
|
|
132
|
+
if (this.publicKeyArmored) {
|
|
133
|
+
return this.publicKeyArmored;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
return await this.fetchPublicKey();
|
|
137
|
+
}
|
|
138
|
+
catch (err) {
|
|
139
|
+
console.warn('Failed to fetch public key from S3, using embedded key');
|
|
140
|
+
this.publicKeyArmored = EMBEDDED_PUBLIC_KEY;
|
|
141
|
+
return EMBEDDED_PUBLIC_KEY;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Verify GPG signature of a file
|
|
146
|
+
*
|
|
147
|
+
* @param filePath - Path to the file to verify
|
|
148
|
+
* @param signatureBase64 - Base64-encoded detached signature
|
|
149
|
+
* @returns true if signature is valid
|
|
150
|
+
*/
|
|
151
|
+
async verifySignature(filePath, signatureBase64) {
|
|
152
|
+
try {
|
|
153
|
+
const publicKeyArmored = await this.getPublicKey();
|
|
154
|
+
// Check if signature is empty (release not signed)
|
|
155
|
+
if (!signatureBase64 || signatureBase64.trim() === '') {
|
|
156
|
+
console.warn('WARNING: Release is not signed - signature verification skipped');
|
|
157
|
+
return true; // Allow unsigned releases (e.g., during development)
|
|
158
|
+
}
|
|
159
|
+
// Read the file to verify
|
|
160
|
+
const fileData = fs.readFileSync(filePath);
|
|
161
|
+
// Decode the signature from base64
|
|
162
|
+
const signatureArmored = Buffer.from(signatureBase64, 'base64').toString('utf-8');
|
|
163
|
+
// Read the public key
|
|
164
|
+
const publicKey = await openpgp.readKey({ armoredKey: publicKeyArmored });
|
|
165
|
+
// Read the signature
|
|
166
|
+
const signature = await openpgp.readSignature({ armoredSignature: signatureArmored });
|
|
167
|
+
// Create a message from the file data
|
|
168
|
+
const message = await openpgp.createMessage({ binary: fileData });
|
|
169
|
+
// Verify the signature
|
|
170
|
+
const verificationResult = await openpgp.verify({
|
|
171
|
+
message,
|
|
172
|
+
signature,
|
|
173
|
+
verificationKeys: publicKey,
|
|
174
|
+
});
|
|
175
|
+
// Check if any signature is valid
|
|
176
|
+
const { verified } = verificationResult.signatures[0];
|
|
177
|
+
await verified; // throws on invalid signature
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
console.error('Signature verification failed:', err instanceof Error ? err.message : String(err));
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Verify both checksum and signature
|
|
187
|
+
*/
|
|
188
|
+
async verifyArtifact(filePath, expectedSha256, signatureBase64) {
|
|
189
|
+
// First verify checksum (fast)
|
|
190
|
+
if (!this.verifyChecksum(filePath, expectedSha256)) {
|
|
191
|
+
return { valid: false, error: 'Checksum verification failed - file may be corrupted' };
|
|
192
|
+
}
|
|
193
|
+
// Then verify signature (slower)
|
|
194
|
+
const signatureValid = await this.verifySignature(filePath, signatureBase64);
|
|
195
|
+
if (!signatureValid) {
|
|
196
|
+
return { valid: false, error: 'Signature verification failed - file may be tampered' };
|
|
197
|
+
}
|
|
198
|
+
return { valid: true };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
// Singleton instance
|
|
202
|
+
let verifierInstance = null;
|
|
203
|
+
export function getSignatureVerifier() {
|
|
204
|
+
if (!verifierInstance) {
|
|
205
|
+
verifierInstance = new SignatureVerifier();
|
|
206
|
+
}
|
|
207
|
+
return verifierInstance;
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=signature-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"signature-verifier.js","sourceRoot":"","sources":["../../src/services/signature-verifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { AgentManifest, UpdateCheckResult, UpdateChannel } from '../types/update.js';
|
|
2
|
+
export declare class UpdateChecker {
|
|
3
|
+
private channel;
|
|
4
|
+
private cachedManifest;
|
|
5
|
+
private lastCheck;
|
|
6
|
+
private cacheTimeout;
|
|
7
|
+
constructor(channel?: UpdateChannel);
|
|
8
|
+
/**
|
|
9
|
+
* Set the update channel
|
|
10
|
+
*/
|
|
11
|
+
setChannel(channel: UpdateChannel): void;
|
|
12
|
+
/**
|
|
13
|
+
* Fetch manifest from S3
|
|
14
|
+
*/
|
|
15
|
+
private fetchManifest;
|
|
16
|
+
/**
|
|
17
|
+
* Check for available updates
|
|
18
|
+
*/
|
|
19
|
+
checkForUpdates(currentVersion: string): Promise<UpdateCheckResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Get the cached manifest if available
|
|
22
|
+
*/
|
|
23
|
+
getCachedManifest(): AgentManifest | null;
|
|
24
|
+
/**
|
|
25
|
+
* Force refresh the manifest cache
|
|
26
|
+
*/
|
|
27
|
+
refreshManifest(): Promise<AgentManifest>;
|
|
28
|
+
/**
|
|
29
|
+
* Save the last known version to cache file
|
|
30
|
+
* Used for persistent tracking between daemon restarts
|
|
31
|
+
*/
|
|
32
|
+
saveLastKnownVersion(version: string): void;
|
|
33
|
+
/**
|
|
34
|
+
* Load the last known version from cache file
|
|
35
|
+
*/
|
|
36
|
+
loadLastKnownVersion(): string | null;
|
|
37
|
+
}
|
|
38
|
+
export declare function createUpdateChecker(channel?: UpdateChannel): UpdateChecker;
|
|
39
|
+
//# sourceMappingURL=update-checker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-checker.d.ts","sourceRoot":"","sources":["../../src/services/update-checker.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EACV,aAAa,EACb,iBAAiB,EACjB,aAAa,EAEd,MAAM,oBAAoB,CAAC;AAwC5B,qBAAa,aAAa;IACxB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,SAAS,CAAqB;IACtC,OAAO,CAAC,YAAY,CAAS;gBAEjB,OAAO,GAAE,aAAwB;IAI7C;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAOxC;;OAEG;YACW,aAAa;IAkC3B;;OAEG;IACG,eAAe,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiDzE;;OAEG;IACH,iBAAiB,IAAI,aAAa,GAAG,IAAI;IAIzC;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,aAAa,CAAC;IAM/C;;;OAGG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAgB3C;;OAEG;IACH,oBAAoB,IAAI,MAAM,GAAG,IAAI;CActC;AAGD,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,aAAwB,GAAG,aAAa,CAEpF"}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// Path: znvault-cli/src/services/update-checker.ts
|
|
2
|
+
/**
|
|
3
|
+
* Update Checker Service
|
|
4
|
+
*
|
|
5
|
+
* Checks for new agent versions by fetching manifests from S3.
|
|
6
|
+
* Compares versions using semantic versioning.
|
|
7
|
+
*/
|
|
8
|
+
import * as https from 'https';
|
|
9
|
+
import * as fs from 'fs';
|
|
10
|
+
import * as path from 'path';
|
|
11
|
+
import { getManifestUrl } from '../types/update.js';
|
|
12
|
+
import { getPlatform, getConfigDir } from '../utils/platform.js';
|
|
13
|
+
/**
|
|
14
|
+
* Parse a semantic version string into components
|
|
15
|
+
*/
|
|
16
|
+
function parseVersion(version) {
|
|
17
|
+
const match = version.match(/^v?(\d+)\.(\d+)\.(\d+)/);
|
|
18
|
+
if (!match) {
|
|
19
|
+
return { major: 0, minor: 0, patch: 0 };
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
major: parseInt(match[1], 10),
|
|
23
|
+
minor: parseInt(match[2], 10),
|
|
24
|
+
patch: parseInt(match[3], 10),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Compare two semantic versions
|
|
29
|
+
* Returns: -1 if a < b, 0 if a == b, 1 if a > b
|
|
30
|
+
*/
|
|
31
|
+
function compareVersions(a, b) {
|
|
32
|
+
const va = parseVersion(a);
|
|
33
|
+
const vb = parseVersion(b);
|
|
34
|
+
if (va.major !== vb.major)
|
|
35
|
+
return va.major < vb.major ? -1 : 1;
|
|
36
|
+
if (va.minor !== vb.minor)
|
|
37
|
+
return va.minor < vb.minor ? -1 : 1;
|
|
38
|
+
if (va.patch !== vb.patch)
|
|
39
|
+
return va.patch < vb.patch ? -1 : 1;
|
|
40
|
+
return 0;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check if version a is newer than version b
|
|
44
|
+
*/
|
|
45
|
+
function isNewerVersion(a, b) {
|
|
46
|
+
return compareVersions(a, b) > 0;
|
|
47
|
+
}
|
|
48
|
+
export class UpdateChecker {
|
|
49
|
+
channel;
|
|
50
|
+
cachedManifest = null;
|
|
51
|
+
lastCheck = null;
|
|
52
|
+
cacheTimeout = 60000; // 1 minute cache
|
|
53
|
+
constructor(channel = 'stable') {
|
|
54
|
+
this.channel = channel;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Set the update channel
|
|
58
|
+
*/
|
|
59
|
+
setChannel(channel) {
|
|
60
|
+
if (this.channel !== channel) {
|
|
61
|
+
this.channel = channel;
|
|
62
|
+
this.cachedManifest = null; // Invalidate cache on channel change
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Fetch manifest from S3
|
|
67
|
+
*/
|
|
68
|
+
async fetchManifest() {
|
|
69
|
+
// Check cache
|
|
70
|
+
if (this.cachedManifest && this.lastCheck) {
|
|
71
|
+
const elapsed = Date.now() - this.lastCheck.getTime();
|
|
72
|
+
if (elapsed < this.cacheTimeout) {
|
|
73
|
+
return this.cachedManifest;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const url = getManifestUrl(this.channel);
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
https.get(url, { rejectUnauthorized: true }, (res) => {
|
|
79
|
+
if (res.statusCode !== 200) {
|
|
80
|
+
reject(new Error(`Failed to fetch manifest: HTTP ${res.statusCode}`));
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
let data = '';
|
|
84
|
+
res.on('data', (chunk) => { data += chunk; });
|
|
85
|
+
res.on('end', () => {
|
|
86
|
+
try {
|
|
87
|
+
const manifest = JSON.parse(data);
|
|
88
|
+
this.cachedManifest = manifest;
|
|
89
|
+
this.lastCheck = new Date();
|
|
90
|
+
resolve(manifest);
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
reject(new Error(`Failed to parse manifest: ${err}`));
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
}).on('error', reject);
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Check for available updates
|
|
101
|
+
*/
|
|
102
|
+
async checkForUpdates(currentVersion) {
|
|
103
|
+
try {
|
|
104
|
+
const manifest = await this.fetchManifest();
|
|
105
|
+
const platform = getPlatform();
|
|
106
|
+
// Handle unsupported platform
|
|
107
|
+
if (platform === 'unsupported') {
|
|
108
|
+
return {
|
|
109
|
+
updateAvailable: false,
|
|
110
|
+
currentVersion,
|
|
111
|
+
latestVersion: manifest.version,
|
|
112
|
+
error: `Unsupported platform: ${process.platform}/${process.arch}`,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// Check if update is available
|
|
116
|
+
const updateAvailable = isNewerVersion(manifest.version, currentVersion);
|
|
117
|
+
// Check minimum version requirement
|
|
118
|
+
if (updateAvailable && manifest.minVersion) {
|
|
119
|
+
if (compareVersions(currentVersion, manifest.minVersion) < 0) {
|
|
120
|
+
return {
|
|
121
|
+
updateAvailable: false,
|
|
122
|
+
currentVersion,
|
|
123
|
+
latestVersion: manifest.version,
|
|
124
|
+
error: `Current version ${currentVersion} is too old. Minimum required: ${manifest.minVersion}. Please update manually.`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const artifact = manifest.artifacts[platform];
|
|
129
|
+
return {
|
|
130
|
+
updateAvailable,
|
|
131
|
+
currentVersion,
|
|
132
|
+
latestVersion: manifest.version,
|
|
133
|
+
manifest: updateAvailable ? manifest : undefined,
|
|
134
|
+
artifact: updateAvailable ? artifact : undefined,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
catch (err) {
|
|
138
|
+
return {
|
|
139
|
+
updateAvailable: false,
|
|
140
|
+
currentVersion,
|
|
141
|
+
latestVersion: 'unknown',
|
|
142
|
+
error: err instanceof Error ? err.message : String(err),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Get the cached manifest if available
|
|
148
|
+
*/
|
|
149
|
+
getCachedManifest() {
|
|
150
|
+
return this.cachedManifest;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Force refresh the manifest cache
|
|
154
|
+
*/
|
|
155
|
+
async refreshManifest() {
|
|
156
|
+
this.cachedManifest = null;
|
|
157
|
+
this.lastCheck = null;
|
|
158
|
+
return this.fetchManifest();
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Save the last known version to cache file
|
|
162
|
+
* Used for persistent tracking between daemon restarts
|
|
163
|
+
*/
|
|
164
|
+
saveLastKnownVersion(version) {
|
|
165
|
+
const cacheFile = path.join(getConfigDir(), 'last-version.json');
|
|
166
|
+
const data = {
|
|
167
|
+
version,
|
|
168
|
+
channel: this.channel,
|
|
169
|
+
checkedAt: new Date().toISOString(),
|
|
170
|
+
};
|
|
171
|
+
const dir = path.dirname(cacheFile);
|
|
172
|
+
if (!fs.existsSync(dir)) {
|
|
173
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
174
|
+
}
|
|
175
|
+
fs.writeFileSync(cacheFile, JSON.stringify(data, null, 2));
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Load the last known version from cache file
|
|
179
|
+
*/
|
|
180
|
+
loadLastKnownVersion() {
|
|
181
|
+
const cacheFile = path.join(getConfigDir(), 'last-version.json');
|
|
182
|
+
try {
|
|
183
|
+
if (fs.existsSync(cacheFile)) {
|
|
184
|
+
const data = JSON.parse(fs.readFileSync(cacheFile, 'utf-8'));
|
|
185
|
+
return data.version;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
// Ignore errors reading cache
|
|
190
|
+
}
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
// Factory function
|
|
195
|
+
export function createUpdateChecker(channel = 'stable') {
|
|
196
|
+
return new UpdateChecker(channel);
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=update-checker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-checker.js","sourceRoot":"","sources":["../../src/services/update-checker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { ArtifactInfo, ProgressCallback } from '../types/update.js';
|
|
2
|
+
export declare class UpdateInstaller {
|
|
3
|
+
private installPath;
|
|
4
|
+
private onProgress?;
|
|
5
|
+
constructor(installPath?: string, onProgress?: ProgressCallback);
|
|
6
|
+
/**
|
|
7
|
+
* Report progress to callback
|
|
8
|
+
*/
|
|
9
|
+
private report;
|
|
10
|
+
/**
|
|
11
|
+
* Download file with progress reporting
|
|
12
|
+
*/
|
|
13
|
+
private download;
|
|
14
|
+
/**
|
|
15
|
+
* Extract tarball to directory
|
|
16
|
+
*/
|
|
17
|
+
private extractTarball;
|
|
18
|
+
/**
|
|
19
|
+
* Find the binary in extracted directory
|
|
20
|
+
*/
|
|
21
|
+
private findBinary;
|
|
22
|
+
/**
|
|
23
|
+
* Install the update
|
|
24
|
+
*
|
|
25
|
+
* @param artifact - Artifact info with URL, checksum, and signature
|
|
26
|
+
* @param version - Version being installed
|
|
27
|
+
*/
|
|
28
|
+
install(artifact: ArtifactInfo, version: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Install a directory-based package (Node.js with dist/)
|
|
31
|
+
*/
|
|
32
|
+
private installDirectory;
|
|
33
|
+
/**
|
|
34
|
+
* Recursively copy a directory
|
|
35
|
+
*/
|
|
36
|
+
private copyDirectory;
|
|
37
|
+
/**
|
|
38
|
+
* Atomically replace the binary with rollback on failure
|
|
39
|
+
*/
|
|
40
|
+
private atomicReplace;
|
|
41
|
+
/**
|
|
42
|
+
* Check if we have permission to install
|
|
43
|
+
*/
|
|
44
|
+
canInstall(): {
|
|
45
|
+
canInstall: boolean;
|
|
46
|
+
reason?: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Get the install path
|
|
50
|
+
*/
|
|
51
|
+
getInstallPath(): string;
|
|
52
|
+
}
|
|
53
|
+
export declare function createUpdateInstaller(installPath?: string, onProgress?: ProgressCallback): UpdateInstaller;
|
|
54
|
+
//# sourceMappingURL=update-installer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update-installer.d.ts","sourceRoot":"","sources":["../../src/services/update-installer.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,YAAY,EAAkB,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAKzF,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,UAAU,CAAC,CAAmB;gBAE1B,WAAW,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,gBAAgB;IAK/D;;OAEG;IACH,OAAO,CAAC,MAAM;IAMd;;OAEG;YACW,QAAQ;IA4DtB;;OAEG;YACW,cAAc;IAI5B;;OAEG;IACH,OAAO,CAAC,UAAU;IA+BlB;;;;;OAKG;IACG,OAAO,CAAC,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiGrE;;OAEG;YACW,gBAAgB;IAkD9B;;OAEG;YACW,aAAa;IAgB3B;;OAEG;YACW,aAAa;IA0C3B;;OAEG;IACH,UAAU,IAAI;QAAE,UAAU,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;IA2BtD;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB;AAGD,wBAAgB,qBAAqB,CACnC,WAAW,CAAC,EAAE,MAAM,EACpB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,eAAe,CAEjB"}
|