@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.
Files changed (122) hide show
  1. package/README.md +310 -0
  2. package/dist/commands/agent.d.ts +3 -0
  3. package/dist/commands/agent.d.ts.map +1 -0
  4. package/dist/commands/agent.js +660 -0
  5. package/dist/commands/agent.js.map +1 -0
  6. package/dist/commands/apikey.d.ts +3 -0
  7. package/dist/commands/apikey.d.ts.map +1 -0
  8. package/dist/commands/apikey.js +767 -0
  9. package/dist/commands/apikey.js.map +1 -0
  10. package/dist/commands/audit.d.ts +3 -0
  11. package/dist/commands/audit.d.ts.map +1 -0
  12. package/dist/commands/audit.js +147 -0
  13. package/dist/commands/audit.js.map +1 -0
  14. package/dist/commands/auth.d.ts +3 -0
  15. package/dist/commands/auth.d.ts.map +1 -0
  16. package/dist/commands/auth.js +426 -0
  17. package/dist/commands/auth.js.map +1 -0
  18. package/dist/commands/cert.d.ts +3 -0
  19. package/dist/commands/cert.d.ts.map +1 -0
  20. package/dist/commands/cert.js +398 -0
  21. package/dist/commands/cert.js.map +1 -0
  22. package/dist/commands/cluster.d.ts +3 -0
  23. package/dist/commands/cluster.d.ts.map +1 -0
  24. package/dist/commands/cluster.js +228 -0
  25. package/dist/commands/cluster.js.map +1 -0
  26. package/dist/commands/emergency.d.ts +3 -0
  27. package/dist/commands/emergency.d.ts.map +1 -0
  28. package/dist/commands/emergency.js +223 -0
  29. package/dist/commands/emergency.js.map +1 -0
  30. package/dist/commands/health.d.ts +3 -0
  31. package/dist/commands/health.d.ts.map +1 -0
  32. package/dist/commands/health.js +188 -0
  33. package/dist/commands/health.js.map +1 -0
  34. package/dist/commands/lockdown.d.ts +3 -0
  35. package/dist/commands/lockdown.d.ts.map +1 -0
  36. package/dist/commands/lockdown.js +232 -0
  37. package/dist/commands/lockdown.js.map +1 -0
  38. package/dist/commands/permissions.d.ts +3 -0
  39. package/dist/commands/permissions.d.ts.map +1 -0
  40. package/dist/commands/permissions.js +168 -0
  41. package/dist/commands/permissions.js.map +1 -0
  42. package/dist/commands/policy.d.ts +3 -0
  43. package/dist/commands/policy.d.ts.map +1 -0
  44. package/dist/commands/policy.js +660 -0
  45. package/dist/commands/policy.js.map +1 -0
  46. package/dist/commands/superadmin.d.ts +3 -0
  47. package/dist/commands/superadmin.d.ts.map +1 -0
  48. package/dist/commands/superadmin.js +203 -0
  49. package/dist/commands/superadmin.js.map +1 -0
  50. package/dist/commands/tenant.d.ts +3 -0
  51. package/dist/commands/tenant.d.ts.map +1 -0
  52. package/dist/commands/tenant.js +277 -0
  53. package/dist/commands/tenant.js.map +1 -0
  54. package/dist/commands/update.d.ts +9 -0
  55. package/dist/commands/update.d.ts.map +1 -0
  56. package/dist/commands/update.js +359 -0
  57. package/dist/commands/update.js.map +1 -0
  58. package/dist/commands/user.d.ts +3 -0
  59. package/dist/commands/user.d.ts.map +1 -0
  60. package/dist/commands/user.js +363 -0
  61. package/dist/commands/user.js.map +1 -0
  62. package/dist/index.d.ts +3 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +82 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/lib/client.d.ts +246 -0
  67. package/dist/lib/client.d.ts.map +1 -0
  68. package/dist/lib/client.js +734 -0
  69. package/dist/lib/client.js.map +1 -0
  70. package/dist/lib/config.d.ts +130 -0
  71. package/dist/lib/config.d.ts.map +1 -0
  72. package/dist/lib/config.js +342 -0
  73. package/dist/lib/config.js.map +1 -0
  74. package/dist/lib/db.d.ts +111 -0
  75. package/dist/lib/db.d.ts.map +1 -0
  76. package/dist/lib/db.js +698 -0
  77. package/dist/lib/db.js.map +1 -0
  78. package/dist/lib/local.d.ts +41 -0
  79. package/dist/lib/local.d.ts.map +1 -0
  80. package/dist/lib/local.js +236 -0
  81. package/dist/lib/local.js.map +1 -0
  82. package/dist/lib/mode.d.ts +210 -0
  83. package/dist/lib/mode.d.ts.map +1 -0
  84. package/dist/lib/mode.js +389 -0
  85. package/dist/lib/mode.js.map +1 -0
  86. package/dist/lib/output.d.ts +61 -0
  87. package/dist/lib/output.d.ts.map +1 -0
  88. package/dist/lib/output.js +190 -0
  89. package/dist/lib/output.js.map +1 -0
  90. package/dist/lib/prompts.d.ts +32 -0
  91. package/dist/lib/prompts.d.ts.map +1 -0
  92. package/dist/lib/prompts.js +96 -0
  93. package/dist/lib/prompts.js.map +1 -0
  94. package/dist/services/auto-update-daemon.d.ts +48 -0
  95. package/dist/services/auto-update-daemon.d.ts.map +1 -0
  96. package/dist/services/auto-update-daemon.js +296 -0
  97. package/dist/services/auto-update-daemon.js.map +1 -0
  98. package/dist/services/signature-verifier.d.ts +38 -0
  99. package/dist/services/signature-verifier.d.ts.map +1 -0
  100. package/dist/services/signature-verifier.js +209 -0
  101. package/dist/services/signature-verifier.js.map +1 -0
  102. package/dist/services/update-checker.d.ts +39 -0
  103. package/dist/services/update-checker.d.ts.map +1 -0
  104. package/dist/services/update-checker.js +198 -0
  105. package/dist/services/update-checker.js.map +1 -0
  106. package/dist/services/update-installer.d.ts +54 -0
  107. package/dist/services/update-installer.d.ts.map +1 -0
  108. package/dist/services/update-installer.js +360 -0
  109. package/dist/services/update-installer.js.map +1 -0
  110. package/dist/types/index.d.ts +411 -0
  111. package/dist/types/index.d.ts.map +1 -0
  112. package/dist/types/index.js +2 -0
  113. package/dist/types/index.js.map +1 -0
  114. package/dist/types/update.d.ts +137 -0
  115. package/dist/types/update.d.ts.map +1 -0
  116. package/dist/types/update.js +27 -0
  117. package/dist/types/update.js.map +1 -0
  118. package/dist/utils/platform.d.ts +35 -0
  119. package/dist/utils/platform.d.ts.map +1 -0
  120. package/dist/utils/platform.js +115 -0
  121. package/dist/utils/platform.js.map +1 -0
  122. 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"}