@msn-control/liftoff 0.7.0 → 0.8.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 (106) hide show
  1. package/README.md +10 -1
  2. package/assets/governance/single-maintainer-gitflow/policy.md +705 -0
  3. package/assets/locks/frontend/package-lock.json +1012 -1694
  4. package/assets/locks/frontend/package.json +5 -6
  5. package/assets/locks/go-backend/go.mod +17 -0
  6. package/assets/locks/go-backend/go.sum +159 -0
  7. package/assets/locks/node-backend/package-lock.json +1473 -2320
  8. package/assets/locks/node-backend/package.json +8 -7
  9. package/assets/locks/opentofu-azure/.terraform.lock.hcl +39 -0
  10. package/assets/locks/opentofu-azure/versions.tf +10 -0
  11. package/assets/locks/python-genai/function-requirements.txt +1734 -0
  12. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/PKG-INFO +25 -0
  13. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/SOURCES.txt +6 -0
  14. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/dependency_links.txt +1 -0
  15. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/requires.txt +23 -0
  16. package/assets/locks/python-genai/liftoff_template_python_genai.egg-info/top_level.txt +1 -0
  17. package/assets/locks/python-genai/pyproject.toml +42 -0
  18. package/assets/locks/python-genai/uv.lock +2536 -0
  19. package/assets/locks/python-standard/pyproject.toml +36 -0
  20. package/assets/locks/python-standard/uv.lock +1780 -0
  21. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/catalog.json +4 -4
  22. package/assets/power-apps-code-app/3438c352483e40982f6c5c0fc36fd71f8e7adbbb/starter/package-lock.json +667 -1108
  23. package/assets/supported-stack.json +711 -0
  24. package/dist/args.js +12 -0
  25. package/dist/args.js.map +1 -1
  26. package/dist/catalogs.d.ts +3 -1
  27. package/dist/catalogs.js +29 -7
  28. package/dist/catalogs.js.map +1 -1
  29. package/dist/cli.js +2 -1
  30. package/dist/cli.js.map +1 -1
  31. package/dist/commands.d.ts +6 -0
  32. package/dist/commands.js +243 -40
  33. package/dist/commands.js.map +1 -1
  34. package/dist/container-validation.d.ts +2 -0
  35. package/dist/container-validation.js +26 -0
  36. package/dist/container-validation.js.map +1 -0
  37. package/dist/file-system.js +130 -5
  38. package/dist/file-system.js.map +1 -1
  39. package/dist/framework-adapters.js +1 -0
  40. package/dist/framework-adapters.js.map +1 -1
  41. package/dist/go-template-assets.d.ts +2 -0
  42. package/dist/go-template-assets.js +14 -0
  43. package/dist/go-template-assets.js.map +1 -0
  44. package/dist/init-filesystem.js +5 -4
  45. package/dist/init-filesystem.js.map +1 -1
  46. package/dist/interactive.js +11 -7
  47. package/dist/interactive.js.map +1 -1
  48. package/dist/opentofu-template-assets.d.ts +2 -0
  49. package/dist/opentofu-template-assets.js +10 -0
  50. package/dist/opentofu-template-assets.js.map +1 -0
  51. package/dist/package-identity.d.ts +8 -0
  52. package/dist/package-identity.js +16 -0
  53. package/dist/package-identity.js.map +1 -0
  54. package/dist/planner.js +42 -3
  55. package/dist/planner.js.map +1 -1
  56. package/dist/power-apps-templates.js +6 -0
  57. package/dist/power-apps-templates.js.map +1 -1
  58. package/dist/project-dependencies.d.ts +1 -1
  59. package/dist/project-dependencies.js +15 -34
  60. package/dist/project-dependencies.js.map +1 -1
  61. package/dist/published-verifier.js +11 -1
  62. package/dist/published-verifier.js.map +1 -1
  63. package/dist/python-template-assets.d.ts +4 -0
  64. package/dist/python-template-assets.js +34 -0
  65. package/dist/python-template-assets.js.map +1 -0
  66. package/dist/repository-governance.d.ts +17 -0
  67. package/dist/repository-governance.js +507 -0
  68. package/dist/repository-governance.js.map +1 -0
  69. package/dist/runtime.d.ts +1 -1
  70. package/dist/runtime.js +3 -1
  71. package/dist/runtime.js.map +1 -1
  72. package/dist/self-upgrade.d.ts +77 -0
  73. package/dist/self-upgrade.js +499 -0
  74. package/dist/self-upgrade.js.map +1 -0
  75. package/dist/stable-release.d.ts +18 -0
  76. package/dist/stable-release.js +66 -0
  77. package/dist/stable-release.js.map +1 -0
  78. package/dist/standard-templates.js +28 -97
  79. package/dist/standard-templates.js.map +1 -1
  80. package/dist/supported-stack.d.ts +115 -0
  81. package/dist/supported-stack.js +439 -0
  82. package/dist/supported-stack.js.map +1 -0
  83. package/dist/telemetry/contract.d.ts +1 -1
  84. package/dist/telemetry/contract.js +1 -0
  85. package/dist/telemetry/contract.js.map +1 -1
  86. package/dist/templates.js +214 -123
  87. package/dist/templates.js.map +1 -1
  88. package/dist/types.d.ts +18 -1
  89. package/dist/workstation-catalog.js +15 -12
  90. package/dist/workstation-catalog.js.map +1 -1
  91. package/dist/workstation.js +16 -6
  92. package/dist/workstation.js.map +1 -1
  93. package/docs/cli-reference.md +59 -2
  94. package/docs/configuration-and-manifests.md +13 -5
  95. package/docs/existing-repositories.md +21 -0
  96. package/docs/getting-started.md +23 -7
  97. package/docs/prerequisites.md +30 -4
  98. package/docs/project-structure.md +20 -1
  99. package/docs/repository-governance.md +91 -0
  100. package/docs/safety-and-consent.md +25 -0
  101. package/docs/spec-workflows-and-agents.md +19 -6
  102. package/docs/supported-stack.md +89 -0
  103. package/docs/telemetry.md +6 -0
  104. package/docs/troubleshooting.md +78 -0
  105. package/docs/workloads.md +14 -5
  106. package/package.json +14 -6
@@ -0,0 +1,77 @@
1
+ import type { Stats } from 'node:fs';
2
+ import { type StableRelease } from './stable-release.js';
3
+ import { type CommandRunner } from './process-runner.js';
4
+ import type { ExternalCommand } from './types.js';
5
+ export declare const selfUpgradeSchemaVersion: 1;
6
+ export declare const selfUpgradeInstallTimeoutMs: number;
7
+ export declare const selfUpgradeProbeTimeoutMs = 30000;
8
+ export declare const selfUpgradeVerificationTimeoutMs = 15000;
9
+ export type SelfUpgradeMode = 'apply' | 'check';
10
+ export type SelfUpgradeStatus = 'blocked' | 'current' | 'failed' | 'update-available' | 'upgraded';
11
+ export type SelfUpgradeRegistryKind = 'canonical' | 'configured';
12
+ export type SelfUpgradeReasonCode = 'canonical_invalid' | 'canonical_timeout' | 'canonical_unavailable' | 'current' | 'downgrade_refused' | 'invalid_global_root' | 'invalid_package' | 'npm_install_failed' | 'npm_install_timeout' | 'npm_unavailable' | 'registry_invalid' | 'registry_stale' | 'registry_unavailable' | 'unsupported_installation' | 'update_available' | 'upgrade_complete' | 'verification_failed';
13
+ interface SelfUpgradeResultBase {
14
+ schemaVersion: typeof selfUpgradeSchemaVersion;
15
+ mode: SelfUpgradeMode;
16
+ status: SelfUpgradeStatus;
17
+ currentVersion: string;
18
+ reasonCode: SelfUpgradeReasonCode;
19
+ }
20
+ export type SelfUpgradeResult = (SelfUpgradeResultBase & {
21
+ status: 'current';
22
+ reasonCode: 'current';
23
+ }) | (SelfUpgradeResultBase & {
24
+ status: 'update-available';
25
+ reasonCode: 'update_available';
26
+ targetVersion: string;
27
+ registryKind: SelfUpgradeRegistryKind;
28
+ }) | (SelfUpgradeResultBase & {
29
+ status: 'upgraded';
30
+ reasonCode: 'upgrade_complete';
31
+ targetVersion: string;
32
+ registryKind: SelfUpgradeRegistryKind;
33
+ }) | (SelfUpgradeResultBase & {
34
+ status: 'blocked' | 'failed';
35
+ targetVersion?: string;
36
+ registryKind?: SelfUpgradeRegistryKind;
37
+ });
38
+ export type SelfUpgradeStage = 'Inspect global installation' | 'Resolve canonical stable target' | 'Verify configured registry parity' | 'Install exact Liftoff release' | 'Verify replacement';
39
+ export interface SelfUpgradeRequest {
40
+ mode: SelfUpgradeMode;
41
+ currentVersion: string;
42
+ stdout: NodeJS.WritableStream;
43
+ stderr: NodeJS.WritableStream;
44
+ json: boolean;
45
+ runningPackageRoot?: string;
46
+ onStage?: (stage: SelfUpgradeStage, detail?: string) => void;
47
+ onInstallCommand?: (command: ExternalCommand) => void;
48
+ }
49
+ export type SelfUpgradeExecutor = (request: SelfUpgradeRequest) => Promise<SelfUpgradeResult>;
50
+ export interface SelfUpgradeDependencies {
51
+ runner: CommandRunner;
52
+ lookupStableRelease(): Promise<StableRelease>;
53
+ makeNeutralDirectory(): Promise<string>;
54
+ removeNeutralDirectory(directory: string): Promise<void>;
55
+ readJson(filePath: string): Promise<unknown>;
56
+ lstat(filePath: string): Promise<Stats>;
57
+ realpath(filePath: string): Promise<string>;
58
+ platform: NodeJS.Platform;
59
+ execPath: string;
60
+ environment: NodeJS.ProcessEnv;
61
+ }
62
+ export type ConfiguredRegistryTargetResult = {
63
+ status: 'available';
64
+ registryKind: SelfUpgradeRegistryKind;
65
+ } | {
66
+ status: 'stale' | 'unavailable';
67
+ };
68
+ export type ConfiguredRegistryTargetLookup = (targetVersion: string) => Promise<ConfiguredRegistryTargetResult>;
69
+ export declare function pathIsContained(root: string, candidate: string, platform: NodeJS.Platform): boolean;
70
+ export declare function expectedGlobalPackageRoot(globalRoot: string, platform: NodeJS.Platform): string;
71
+ export declare function buildGlobalNpmInstallCommand(targetVersion: string, platform: NodeJS.Platform): ExternalCommand;
72
+ export declare function selfUpgradeExitCode(value: SelfUpgradeResult): number;
73
+ export declare function selfUpgradeRemedy(value: SelfUpgradeResult): string | undefined;
74
+ export declare function selfUpgradeSummary(value: SelfUpgradeResult): string;
75
+ export declare function checkConfiguredRegistryTarget(targetVersion: string, overrides?: Partial<SelfUpgradeDependencies>): Promise<ConfiguredRegistryTargetResult>;
76
+ export declare function runSelfUpgrade(request: SelfUpgradeRequest, overrides?: Partial<SelfUpgradeDependencies>): Promise<SelfUpgradeResult>;
77
+ export {};
@@ -0,0 +1,499 @@
1
+ import { lstat, mkdtemp, readFile, realpath, rm } from 'node:fs/promises';
2
+ import os from 'node:os';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { canonicalManualInstallCommand, canonicalNpmRegistry, exactGlobalInstallCommand, liftoffBinaryName, liftoffPackageName, npmExecutableForPlatform } from './package-identity.js';
6
+ import { isStableSemver, lookupStableRelease, stableReleaseLookupTimeoutMs, StableReleaseLookupError } from './stable-release.js';
7
+ import { NodeCommandRunner } from './process-runner.js';
8
+ import { compareSemver } from './semver.js';
9
+ export const selfUpgradeSchemaVersion = 1;
10
+ export const selfUpgradeInstallTimeoutMs = 10 * 60_000;
11
+ export const selfUpgradeProbeTimeoutMs = 30_000;
12
+ export const selfUpgradeVerificationTimeoutMs = 15_000;
13
+ class SelfUpgradeFailure extends Error {
14
+ status;
15
+ reasonCode;
16
+ registryKind;
17
+ constructor(status, reasonCode, registryKind) {
18
+ super(reasonCode);
19
+ this.status = status;
20
+ this.reasonCode = reasonCode;
21
+ this.registryKind = registryKind;
22
+ this.name = 'SelfUpgradeFailure';
23
+ }
24
+ }
25
+ const sourcePackageRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
26
+ function pathApiForPlatform(platform) {
27
+ return platform === 'win32' ? path.win32 : path.posix;
28
+ }
29
+ function comparisonPath(value, platform) {
30
+ const normalized = pathApiForPlatform(platform).resolve(value);
31
+ return platform === 'win32' ? normalized.toLowerCase() : normalized;
32
+ }
33
+ export function pathIsContained(root, candidate, platform) {
34
+ const api = pathApiForPlatform(platform);
35
+ const relative = api.relative(comparisonPath(root, platform), comparisonPath(candidate, platform));
36
+ return relative === '' || (relative !== '..' &&
37
+ !relative.startsWith(`..${api.sep}`) &&
38
+ !api.isAbsolute(relative));
39
+ }
40
+ export function expectedGlobalPackageRoot(globalRoot, platform) {
41
+ return pathApiForPlatform(platform).join(globalRoot, ...liftoffPackageName.split('/'));
42
+ }
43
+ export function buildGlobalNpmInstallCommand(targetVersion, platform) {
44
+ return {
45
+ executable: npmExecutableForPlatform(platform),
46
+ args: [
47
+ 'install',
48
+ '--global',
49
+ '--ignore-scripts',
50
+ '--no-audit',
51
+ '--no-fund',
52
+ `${liftoffPackageName}@${targetVersion}`
53
+ ]
54
+ };
55
+ }
56
+ function result(request, status, reasonCode, details = {}) {
57
+ return {
58
+ schemaVersion: selfUpgradeSchemaVersion,
59
+ mode: request.mode,
60
+ status,
61
+ currentVersion: request.currentVersion,
62
+ reasonCode,
63
+ ...(details.targetVersion ? { targetVersion: details.targetVersion } : {}),
64
+ ...(details.registryKind ? { registryKind: details.registryKind } : {})
65
+ };
66
+ }
67
+ function assertNever(value) {
68
+ throw new Error(`Unhandled self-upgrade state: ${String(value)}`);
69
+ }
70
+ export function selfUpgradeExitCode(value) {
71
+ switch (value.status) {
72
+ case 'current':
73
+ case 'upgraded':
74
+ return 0;
75
+ case 'update-available':
76
+ return 2;
77
+ case 'blocked':
78
+ case 'failed':
79
+ return 1;
80
+ default:
81
+ return assertNever(value);
82
+ }
83
+ }
84
+ export function selfUpgradeRemedy(value) {
85
+ switch (value.reasonCode) {
86
+ case 'current':
87
+ case 'update_available':
88
+ case 'upgrade_complete':
89
+ return undefined;
90
+ case 'registry_stale':
91
+ return 'Ask the managed registry owner to synchronize or approve the canonical target, then retry.';
92
+ case 'npm_install_failed':
93
+ case 'npm_install_timeout':
94
+ case 'verification_failed':
95
+ return value.targetVersion
96
+ ? `Run the exact repair command manually: ${exactGlobalInstallCommand(value.targetVersion)}`
97
+ : undefined;
98
+ case 'unsupported_installation':
99
+ case 'invalid_global_root':
100
+ case 'invalid_package':
101
+ case 'npm_unavailable':
102
+ return `Use a supported global npm installation: ${canonicalManualInstallCommand()}`;
103
+ case 'canonical_invalid':
104
+ case 'canonical_timeout':
105
+ case 'canonical_unavailable':
106
+ return 'Retry after canonical npm is reachable and exposes valid stable Liftoff metadata.';
107
+ case 'registry_invalid':
108
+ case 'registry_unavailable':
109
+ return 'Repair the approved npm registry configuration without placing credentials in the registry URL, then retry.';
110
+ case 'downgrade_refused':
111
+ return 'Keep the newer installed CLI; Liftoff does not perform automatic downgrades.';
112
+ default:
113
+ return assertNever(value);
114
+ }
115
+ }
116
+ export function selfUpgradeSummary(value) {
117
+ switch (value.status) {
118
+ case 'current':
119
+ return `Liftoff ${value.currentVersion} is already the canonical stable release.`;
120
+ case 'update-available':
121
+ return `Liftoff ${value.targetVersion} is available for this supported global npm installation.`;
122
+ case 'upgraded':
123
+ return `Liftoff ${value.targetVersion} was installed and verified.`;
124
+ case 'blocked':
125
+ return `CLI upgrade was blocked (${value.reasonCode}).`;
126
+ case 'failed':
127
+ return `CLI upgrade failed (${value.reasonCode}).`;
128
+ default:
129
+ return assertNever(value);
130
+ }
131
+ }
132
+ function readOnlyEnvironment(dependencies, neutralDirectory) {
133
+ return {
134
+ ...dependencies.environment,
135
+ npm_config_cache: path.join(neutralDirectory, 'npm-cache')
136
+ };
137
+ }
138
+ function commandFailed(command) {
139
+ return command.errorCode !== undefined ||
140
+ command.errorMessage !== undefined ||
141
+ command.timedOut ||
142
+ command.signal !== null ||
143
+ command.status !== 0;
144
+ }
145
+ async function inspectGlobalInstallation(request, neutralDirectory, dependencies) {
146
+ const npmExecutable = npmExecutableForPlatform(dependencies.platform);
147
+ const rootResult = await dependencies.runner.run({ executable: npmExecutable, args: ['root', '--global'] }, {
148
+ cwd: neutralDirectory,
149
+ env: readOnlyEnvironment(dependencies, neutralDirectory),
150
+ timeoutMs: selfUpgradeProbeTimeoutMs
151
+ });
152
+ if (rootResult.errorCode === 'ENOENT') {
153
+ throw new SelfUpgradeFailure('blocked', 'npm_unavailable');
154
+ }
155
+ if (commandFailed(rootResult)) {
156
+ throw new SelfUpgradeFailure('failed', 'invalid_global_root');
157
+ }
158
+ const rootLines = rootResult.stdout.trim().split(/\r?\n/).filter(Boolean);
159
+ if (rootLines.length !== 1) {
160
+ throw new SelfUpgradeFailure('blocked', 'invalid_global_root');
161
+ }
162
+ const pathApi = pathApiForPlatform(dependencies.platform);
163
+ const reportedRoot = rootLines[0];
164
+ if (!pathApi.isAbsolute(reportedRoot)) {
165
+ throw new SelfUpgradeFailure('blocked', 'invalid_global_root');
166
+ }
167
+ let globalRoot;
168
+ let runningRoot;
169
+ try {
170
+ globalRoot = await dependencies.realpath(reportedRoot);
171
+ runningRoot = await dependencies.realpath(request.runningPackageRoot ?? sourcePackageRoot);
172
+ }
173
+ catch {
174
+ throw new SelfUpgradeFailure('blocked', 'invalid_global_root');
175
+ }
176
+ const packageRoot = expectedGlobalPackageRoot(globalRoot, dependencies.platform);
177
+ if (!pathIsContained(globalRoot, packageRoot, dependencies.platform) ||
178
+ comparisonPath(packageRoot, dependencies.platform) !==
179
+ comparisonPath(runningRoot, dependencies.platform)) {
180
+ throw new SelfUpgradeFailure('blocked', 'unsupported_installation');
181
+ }
182
+ let packageDetails;
183
+ let metadata;
184
+ try {
185
+ packageDetails = await dependencies.lstat(packageRoot);
186
+ metadata = await dependencies.readJson(pathApi.join(packageRoot, 'package.json'));
187
+ }
188
+ catch {
189
+ throw new SelfUpgradeFailure('blocked', 'invalid_package');
190
+ }
191
+ if (packageDetails.isSymbolicLink() || !packageDetails.isDirectory()) {
192
+ throw new SelfUpgradeFailure('blocked', 'unsupported_installation');
193
+ }
194
+ if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {
195
+ throw new SelfUpgradeFailure('blocked', 'invalid_package');
196
+ }
197
+ const packageMetadata = metadata;
198
+ if (packageMetadata.name !== liftoffPackageName ||
199
+ packageMetadata.version !== request.currentVersion) {
200
+ throw new SelfUpgradeFailure('blocked', 'invalid_package');
201
+ }
202
+ return { npmExecutable, packageRoot };
203
+ }
204
+ function registryKind(value) {
205
+ let parsed;
206
+ try {
207
+ parsed = new URL(value);
208
+ }
209
+ catch {
210
+ throw new SelfUpgradeFailure('blocked', 'registry_invalid');
211
+ }
212
+ if (parsed.protocol !== 'https:' ||
213
+ parsed.username ||
214
+ parsed.password ||
215
+ parsed.search ||
216
+ parsed.hash) {
217
+ throw new SelfUpgradeFailure('blocked', 'registry_invalid');
218
+ }
219
+ const normalized = parsed.toString().replace(/\/$/, '');
220
+ return normalized === canonicalNpmRegistry ? 'canonical' : 'configured';
221
+ }
222
+ async function inspectRegistryParity(targetVersion, npmExecutable, neutralDirectory, dependencies, timeoutMs = selfUpgradeProbeTimeoutMs) {
223
+ const options = {
224
+ cwd: neutralDirectory,
225
+ env: readOnlyEnvironment(dependencies, neutralDirectory),
226
+ timeoutMs
227
+ };
228
+ const registryResult = await dependencies.runner.run({ executable: npmExecutable, args: ['config', 'get', 'registry'] }, options);
229
+ if (commandFailed(registryResult)) {
230
+ throw new SelfUpgradeFailure('failed', 'registry_unavailable');
231
+ }
232
+ const configuredRegistry = registryResult.stdout.trim();
233
+ const kind = registryKind(configuredRegistry);
234
+ const targetResult = await dependencies.runner.run({
235
+ executable: npmExecutable,
236
+ args: [
237
+ 'view',
238
+ `${liftoffPackageName}@${targetVersion}`,
239
+ 'name',
240
+ 'version',
241
+ '--json'
242
+ ]
243
+ }, options);
244
+ if (commandFailed(targetResult)) {
245
+ const notFound = targetResult.status === 1 &&
246
+ /\b(?:E404|404|not found|no match)\b/i.test(targetResult.stderr);
247
+ throw new SelfUpgradeFailure(notFound ? 'blocked' : 'failed', notFound ? 'registry_stale' : 'registry_unavailable', kind);
248
+ }
249
+ let metadata;
250
+ try {
251
+ metadata = JSON.parse(targetResult.stdout);
252
+ }
253
+ catch {
254
+ throw new SelfUpgradeFailure('failed', 'registry_invalid', kind);
255
+ }
256
+ if (!metadata || typeof metadata !== 'object' || Array.isArray(metadata)) {
257
+ throw new SelfUpgradeFailure('failed', 'registry_invalid', kind);
258
+ }
259
+ const record = metadata;
260
+ if (record.name !== liftoffPackageName || record.version !== targetVersion) {
261
+ throw new SelfUpgradeFailure('blocked', 'registry_stale', kind);
262
+ }
263
+ return { kind };
264
+ }
265
+ export async function checkConfiguredRegistryTarget(targetVersion, overrides = {}) {
266
+ const dependencies = {
267
+ ...defaultSelfUpgradeDependencies(),
268
+ ...overrides
269
+ };
270
+ let neutralDirectory;
271
+ try {
272
+ neutralDirectory = await dependencies.makeNeutralDirectory();
273
+ }
274
+ catch {
275
+ return { status: 'unavailable' };
276
+ }
277
+ try {
278
+ const inspection = await inspectRegistryParity(targetVersion, npmExecutableForPlatform(dependencies.platform), neutralDirectory, dependencies, stableReleaseLookupTimeoutMs);
279
+ return { status: 'available', registryKind: inspection.kind };
280
+ }
281
+ catch (error) {
282
+ if (error instanceof SelfUpgradeFailure &&
283
+ error.reasonCode === 'registry_stale') {
284
+ return { status: 'stale' };
285
+ }
286
+ return { status: 'unavailable' };
287
+ }
288
+ finally {
289
+ await dependencies.removeNeutralDirectory(neutralDirectory);
290
+ }
291
+ }
292
+ async function npmGlobalRoot(npmExecutable, neutralDirectory, dependencies) {
293
+ const rootResult = await dependencies.runner.run({ executable: npmExecutable, args: ['root', '--global'] }, {
294
+ cwd: neutralDirectory,
295
+ env: readOnlyEnvironment(dependencies, neutralDirectory),
296
+ timeoutMs: selfUpgradeProbeTimeoutMs
297
+ });
298
+ if (commandFailed(rootResult)) {
299
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
300
+ }
301
+ const lines = rootResult.stdout.trim().split(/\r?\n/).filter(Boolean);
302
+ if (lines.length !== 1 || !pathApiForPlatform(dependencies.platform).isAbsolute(lines[0])) {
303
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
304
+ }
305
+ try {
306
+ return await dependencies.realpath(lines[0]);
307
+ }
308
+ catch {
309
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
310
+ }
311
+ }
312
+ async function verifyReplacement(targetVersion, npmExecutable, neutralDirectory, dependencies) {
313
+ const pathApi = pathApiForPlatform(dependencies.platform);
314
+ const globalRoot = await npmGlobalRoot(npmExecutable, neutralDirectory, dependencies);
315
+ const packageRoot = expectedGlobalPackageRoot(globalRoot, dependencies.platform);
316
+ let packageDetails;
317
+ let metadata;
318
+ try {
319
+ packageDetails = await dependencies.lstat(packageRoot);
320
+ metadata = await dependencies.readJson(pathApi.join(packageRoot, 'package.json'));
321
+ }
322
+ catch {
323
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
324
+ }
325
+ if (packageDetails.isSymbolicLink() ||
326
+ !packageDetails.isDirectory() ||
327
+ !metadata ||
328
+ typeof metadata !== 'object' ||
329
+ Array.isArray(metadata)) {
330
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
331
+ }
332
+ const record = metadata;
333
+ const bin = record.bin;
334
+ if (record.name !== liftoffPackageName ||
335
+ record.version !== targetVersion ||
336
+ !bin ||
337
+ typeof bin !== 'object' ||
338
+ Array.isArray(bin) ||
339
+ typeof bin[liftoffBinaryName] !== 'string') {
340
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
341
+ }
342
+ const declaredBin = bin[liftoffBinaryName];
343
+ if (pathApi.isAbsolute(declaredBin)) {
344
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
345
+ }
346
+ const binaryPath = pathApi.resolve(packageRoot, declaredBin);
347
+ if (!pathIsContained(packageRoot, binaryPath, dependencies.platform)) {
348
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
349
+ }
350
+ let binaryDetails;
351
+ let canonicalBinary;
352
+ try {
353
+ binaryDetails = await dependencies.lstat(binaryPath);
354
+ canonicalBinary = await dependencies.realpath(binaryPath);
355
+ }
356
+ catch {
357
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
358
+ }
359
+ if (binaryDetails.isSymbolicLink() ||
360
+ !binaryDetails.isFile() ||
361
+ !pathIsContained(packageRoot, canonicalBinary, dependencies.platform)) {
362
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
363
+ }
364
+ const versionResult = await dependencies.runner.run({
365
+ executable: dependencies.execPath,
366
+ args: [canonicalBinary, '--version']
367
+ }, {
368
+ cwd: neutralDirectory,
369
+ env: {
370
+ ...dependencies.environment,
371
+ CI: 'true',
372
+ DO_NOT_TRACK: '1',
373
+ LIFTOFF_TELEMETRY: '0'
374
+ },
375
+ timeoutMs: selfUpgradeVerificationTimeoutMs
376
+ });
377
+ if (commandFailed(versionResult) ||
378
+ versionResult.stdout.trim() !== `Liftoff ${targetVersion}`) {
379
+ throw new SelfUpgradeFailure('failed', 'verification_failed');
380
+ }
381
+ }
382
+ function canonicalFailureReason(error) {
383
+ switch (error.code) {
384
+ case 'invalid_metadata':
385
+ return 'canonical_invalid';
386
+ case 'timeout':
387
+ return 'canonical_timeout';
388
+ case 'http_failure':
389
+ case 'network_failure':
390
+ return 'canonical_unavailable';
391
+ default:
392
+ return assertNever(error.code);
393
+ }
394
+ }
395
+ export async function runSelfUpgrade(request, overrides = {}) {
396
+ const dependencies = {
397
+ ...defaultSelfUpgradeDependencies(),
398
+ ...overrides
399
+ };
400
+ const neutralDirectory = await dependencies.makeNeutralDirectory();
401
+ let targetVersion;
402
+ let registry;
403
+ try {
404
+ request.onStage?.('Inspect global installation');
405
+ const installation = await inspectGlobalInstallation(request, neutralDirectory, dependencies);
406
+ request.onStage?.('Resolve canonical stable target');
407
+ let stable;
408
+ try {
409
+ stable = await dependencies.lookupStableRelease();
410
+ }
411
+ catch (error) {
412
+ if (error instanceof StableReleaseLookupError) {
413
+ return result(request, 'failed', canonicalFailureReason(error));
414
+ }
415
+ return result(request, 'failed', 'canonical_unavailable');
416
+ }
417
+ if (stable.name !== liftoffPackageName || !isStableSemver(stable.version)) {
418
+ return result(request, 'failed', 'canonical_invalid');
419
+ }
420
+ targetVersion = stable.version;
421
+ const comparison = compareSemver(targetVersion, request.currentVersion);
422
+ if (comparison === 0) {
423
+ return result(request, 'current', 'current');
424
+ }
425
+ if (comparison < 0) {
426
+ return result(request, 'blocked', 'downgrade_refused', { targetVersion });
427
+ }
428
+ request.onStage?.('Verify configured registry parity');
429
+ const registryInspection = await inspectRegistryParity(targetVersion, installation.npmExecutable, neutralDirectory, dependencies);
430
+ registry = registryInspection.kind;
431
+ if (request.mode === 'check') {
432
+ return result(request, 'update-available', 'update_available', {
433
+ targetVersion,
434
+ registryKind: registry
435
+ });
436
+ }
437
+ request.onStage?.('Install exact Liftoff release', targetVersion);
438
+ const installCommand = buildGlobalNpmInstallCommand(targetVersion, dependencies.platform);
439
+ request.onInstallCommand?.(installCommand);
440
+ const installResult = await dependencies.runner.run(installCommand, {
441
+ cwd: neutralDirectory,
442
+ env: dependencies.environment,
443
+ timeoutMs: selfUpgradeInstallTimeoutMs,
444
+ stream: true,
445
+ stdout: request.json ? request.stderr : request.stdout,
446
+ stderr: request.stderr
447
+ });
448
+ if (installResult.timedOut) {
449
+ return result(request, 'failed', 'npm_install_timeout', {
450
+ targetVersion,
451
+ registryKind: registry
452
+ });
453
+ }
454
+ if (commandFailed(installResult)) {
455
+ return result(request, 'failed', 'npm_install_failed', {
456
+ targetVersion,
457
+ registryKind: registry
458
+ });
459
+ }
460
+ request.onStage?.('Verify replacement', targetVersion);
461
+ await verifyReplacement(targetVersion, installation.npmExecutable, neutralDirectory, dependencies);
462
+ return result(request, 'upgraded', 'upgrade_complete', {
463
+ targetVersion,
464
+ registryKind: registry
465
+ });
466
+ }
467
+ catch (error) {
468
+ if (error instanceof SelfUpgradeFailure) {
469
+ return result(request, error.status, error.reasonCode, {
470
+ ...(targetVersion ? { targetVersion } : {}),
471
+ ...(registry ?? error.registryKind
472
+ ? { registryKind: registry ?? error.registryKind }
473
+ : {})
474
+ });
475
+ }
476
+ return result(request, 'failed', 'verification_failed', {
477
+ ...(targetVersion ? { targetVersion } : {}),
478
+ ...(registry ? { registryKind: registry } : {})
479
+ });
480
+ }
481
+ finally {
482
+ await dependencies.removeNeutralDirectory(neutralDirectory);
483
+ }
484
+ }
485
+ function defaultSelfUpgradeDependencies() {
486
+ return {
487
+ runner: new NodeCommandRunner(),
488
+ lookupStableRelease,
489
+ makeNeutralDirectory: () => mkdtemp(path.join(os.tmpdir(), 'liftoff-upgrade-')),
490
+ removeNeutralDirectory: (directory) => rm(directory, { recursive: true, force: true }),
491
+ readJson: async (filePath) => JSON.parse(await readFile(filePath, 'utf8')),
492
+ lstat,
493
+ realpath,
494
+ platform: process.platform,
495
+ execPath: process.execPath,
496
+ environment: process.env
497
+ };
498
+ }
499
+ //# sourceMappingURL=self-upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"self-upgrade.js","sourceRoot":"","sources":["../src/self-upgrade.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,EAClB,wBAAwB,EACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,4BAA4B,EAC5B,wBAAwB,EAEzB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,iBAAiB,EAGlB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAU,CAAC;AACnD,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,GAAG,MAAM,CAAC;AACvD,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC;AAChD,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC;AA6HvD,MAAM,kBAAmB,SAAQ,KAAK;IAEzB,MAAM;IACN,UAAU;IACV,YAAY;IAHvB,YACW,MAA4B,EAC5B,UAAiC,EACjC,YAAsC;QAE/C,KAAK,CAAC,UAAU,CAAC,CAAC;sBAJT,MAAM;0BACN,UAAU;4BACV,YAAY;QAGrB,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,CACpC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAC5C,IAAI,CACL,CAAC;AAEF,SAAS,kBAAkB,CAAC,QAAyB;IACnD,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;AACxD,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,QAAyB;IAC9D,MAAM,UAAU,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,SAAiB,EACjB,QAAyB;IAEzB,MAAM,GAAG,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACzC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAC3B,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,EAC9B,cAAc,CAAC,SAAS,EAAE,QAAQ,CAAC,CACpC,CAAC;IACF,OAAO,QAAQ,KAAK,EAAE,IAAI,CACxB,QAAQ,KAAK,IAAI;QACjB,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,GAAG,EAAE,CAAC;QACpC,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,UAAkB,EAClB,QAAyB;IAEzB,OAAO,kBAAkB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,aAAqB,EACrB,QAAyB;IAEzB,OAAO;QACL,UAAU,EAAE,wBAAwB,CAAC,QAAQ,CAAC;QAC9C,IAAI,EAAE;YACJ,SAAS;YACT,UAAU;YACV,kBAAkB;YAClB,YAAY;YACZ,WAAW;YACX,GAAG,kBAAkB,IAAI,aAAa,EAAE;SACzC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CACb,OAA2B,EAC3B,MAAyB,EACzB,UAAiC,EACjC,OAAO,GAGH,EAAE;IAEN,OAAO;QACL,aAAa,EAAE,wBAAwB;QACvC,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,MAAM;QACN,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,UAAU;QACV,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnD,CAAC;AACzB,CAAC;AAED,SAAS,WAAW,CAAC,KAAY;IAC/B,MAAM,IAAI,KAAK,CAAC,iCAAiC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAwB;IAC1D,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,SAAS,CAAC;QACf,KAAK,UAAU;YACb,OAAO,CAAC,CAAC;QACX,KAAK,kBAAkB;YACrB,OAAO,CAAC,CAAC;QACX,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC;QACX;YACE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAwB;IACxD,QAAQ,KAAK,CAAC,UAAU,EAAE,CAAC;QACzB,KAAK,SAAS,CAAC;QACf,KAAK,kBAAkB,CAAC;QACxB,KAAK,kBAAkB;YACrB,OAAO,SAAS,CAAC;QACnB,KAAK,gBAAgB;YACnB,OAAO,4FAA4F,CAAC;QACtG,KAAK,oBAAoB,CAAC;QAC1B,KAAK,qBAAqB,CAAC;QAC3B,KAAK,qBAAqB;YACxB,OAAO,KAAK,CAAC,aAAa;gBACxB,CAAC,CAAC,0CAA0C,yBAAyB,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;gBAC5F,CAAC,CAAC,SAAS,CAAC;QAChB,KAAK,0BAA0B,CAAC;QAChC,KAAK,qBAAqB,CAAC;QAC3B,KAAK,iBAAiB,CAAC;QACvB,KAAK,iBAAiB;YACpB,OAAO,4CAA4C,6BAA6B,EAAE,EAAE,CAAC;QACvF,KAAK,mBAAmB,CAAC;QACzB,KAAK,mBAAmB,CAAC;QACzB,KAAK,uBAAuB;YAC1B,OAAO,mFAAmF,CAAC;QAC7F,KAAK,kBAAkB,CAAC;QACxB,KAAK,sBAAsB;YACzB,OAAO,6GAA6G,CAAC;QACvH,KAAK,mBAAmB;YACtB,OAAO,8EAA8E,CAAC;QACxF;YACE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAwB;IACzD,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,WAAW,KAAK,CAAC,cAAc,2CAA2C,CAAC;QACpF,KAAK,kBAAkB;YACrB,OAAO,WAAW,KAAK,CAAC,aAAa,2DAA2D,CAAC;QACnG,KAAK,UAAU;YACb,OAAO,WAAW,KAAK,CAAC,aAAa,8BAA8B,CAAC;QACtE,KAAK,SAAS;YACZ,OAAO,4BAA4B,KAAK,CAAC,UAAU,IAAI,CAAC;QAC1D,KAAK,QAAQ;YACX,OAAO,uBAAuB,KAAK,CAAC,UAAU,IAAI,CAAC;QACrD;YACE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,YAAqC,EACrC,gBAAwB;IAExB,OAAO;QACL,GAAG,YAAY,CAAC,WAAW;QAC3B,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,OAAsB;IAC3C,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS;QACpC,OAAO,CAAC,YAAY,KAAK,SAAS;QAClC,OAAO,CAAC,QAAQ;QAChB,OAAO,CAAC,MAAM,KAAK,IAAI;QACvB,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC;AACzB,CAAC;AAED,KAAK,UAAU,yBAAyB,CACtC,OAA2B,EAC3B,gBAAwB,EACxB,YAAqC;IAErC,MAAM,aAAa,GAAG,wBAAwB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,CAC9C,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,EACzD;QACE,GAAG,EAAE,gBAAgB;QACrB,GAAG,EAAE,mBAAmB,CAAC,YAAY,EAAE,gBAAgB,CAAC;QACxD,SAAS,EAAE,yBAAyB;KACrC,CACF,CAAC;IACF,IAAI,UAAU,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;QACtC,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC1E,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,OAAO,GAAG,kBAAkB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,UAAkB,CAAC;IACvB,IAAI,WAAmB,CAAC;IACxB,IAAI,CAAC;QACH,UAAU,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACvD,WAAW,GAAG,MAAM,YAAY,CAAC,QAAQ,CACvC,OAAO,CAAC,kBAAkB,IAAI,iBAAiB,CAChD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,WAAW,GAAG,yBAAyB,CAAC,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACjF,IACE,CAAC,eAAe,CAAC,UAAU,EAAE,WAAW,EAAE,YAAY,CAAC,QAAQ,CAAC;QAChE,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,QAAQ,CAAC;YAChD,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,QAAQ,CAAC,EACpD,CAAC;QACD,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;IACtE,CAAC;IAED,IAAI,cAAqB,CAAC;IAC1B,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QACH,cAAc,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACvD,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC7D,CAAC;IACD,IAAI,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,CAAC;QACrE,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,0BAA0B,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC7D,CAAC;IACD,MAAM,eAAe,GAAG,QAAmC,CAAC;IAC5D,IACE,eAAe,CAAC,IAAI,KAAK,kBAAkB;QAC3C,eAAe,CAAC,OAAO,KAAK,OAAO,CAAC,cAAc,EAClD,CAAC;QACD,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,CAAC;AACxC,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,MAAW,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAC9D,CAAC;IACD,IACE,MAAM,CAAC,QAAQ,KAAK,QAAQ;QAC5B,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,QAAQ;QACf,MAAM,CAAC,MAAM;QACb,MAAM,CAAC,IAAI,EACX,CAAC;QACD,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,UAAU,KAAK,oBAAoB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,qBAAqB,CAClC,aAAqB,EACrB,aAAqB,EACrB,gBAAwB,EACxB,YAAqC,EACrC,SAAS,GAAG,yBAAyB;IAErC,MAAM,OAAO,GAAG;QACd,GAAG,EAAE,gBAAgB;QACrB,GAAG,EAAE,mBAAmB,CAAC,YAAY,EAAE,gBAAgB,CAAC;QACxD,SAAS;KACV,CAAC;IACF,MAAM,cAAc,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,CAClD,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,EAClE,OAAO,CACR,CAAC;IACF,IAAI,aAAa,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,kBAAkB,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACxD,MAAM,IAAI,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,CAChD;QACE,UAAU,EAAE,aAAa;QACzB,IAAI,EAAE;YACJ,MAAM;YACN,GAAG,kBAAkB,IAAI,aAAa,EAAE;YACxC,MAAM;YACN,SAAS;YACT,QAAQ;SACT;KACF,EACD,OAAO,CACR,CAAC;IACF,IAAI,aAAa,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC;YACxC,sCAAsC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,IAAI,kBAAkB,CAC1B,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAC/B,QAAQ,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,sBAAsB,EACpD,IAAI,CACL,CAAC;IACJ,CAAC;IACD,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC;IACD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,IAAI,CAAC,CAAC;IACnE,CAAC;IACD,MAAM,MAAM,GAAG,QAAmC,CAAC;IACnD,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,IAAI,MAAM,CAAC,OAAO,KAAK,aAAa,EAAE,CAAC;QAC3E,MAAM,IAAI,kBAAkB,CAAC,SAAS,EAAE,gBAAgB,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,6BAA6B,CACjD,aAAqB,EACrB,SAAS,GAAqC,EAAE;IAEhD,MAAM,YAAY,GAA4B;QAC5C,GAAG,8BAA8B,EAAE;QACnC,GAAG,SAAS;KACb,CAAC;IACF,IAAI,gBAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,gBAAgB,GAAG,MAAM,YAAY,CAAC,oBAAoB,EAAE,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACnC,CAAC;IACD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,qBAAqB,CAC5C,aAAa,EACb,wBAAwB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAC/C,gBAAgB,EAChB,YAAY,EACZ,4BAA4B,CAC7B,CAAC;QACF,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;IAChE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,kBAAkB;YACnC,KAAK,CAAC,UAAU,KAAK,gBAAgB,EACrC,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;IACnC,CAAC;YAAS,CAAC;QACT,MAAM,YAAY,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAC1B,aAAqB,EACrB,gBAAwB,EACxB,YAAqC;IAErC,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,CAC9C,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC,EAAE,EACzD;QACE,GAAG,EAAE,gBAAgB;QACrB,GAAG,EAAE,mBAAmB,CAAC,YAAY,EAAE,gBAAgB,CAAC;QACxD,SAAS,EAAE,yBAAyB;KACrC,CACF,CAAC;IACF,IAAI,aAAa,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACtE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,CAAC;QACH,OAAO,MAAM,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,aAAqB,EACrB,aAAqB,EACrB,gBAAwB,EACxB,YAAqC;IAErC,MAAM,OAAO,GAAG,kBAAkB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,aAAa,EAAE,gBAAgB,EAAE,YAAY,CAAC,CAAC;IACtF,MAAM,WAAW,GAAG,yBAAyB,CAAC,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IACjF,IAAI,cAAqB,CAAC;IAC1B,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QACH,cAAc,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACvD,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;IACpF,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;IACD,IACE,cAAc,CAAC,cAAc,EAAE;QAC/B,CAAC,cAAc,CAAC,WAAW,EAAE;QAC7B,CAAC,QAAQ;QACT,OAAO,QAAQ,KAAK,QAAQ;QAC5B,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EACvB,CAAC;QACD,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,MAAM,GAAG,QAAmC,CAAC;IACnD,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;IACvB,IACE,MAAM,CAAC,IAAI,KAAK,kBAAkB;QAClC,MAAM,CAAC,OAAO,KAAK,aAAa;QAChC,CAAC,GAAG;QACJ,OAAO,GAAG,KAAK,QAAQ;QACvB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAClB,OAAQ,GAA+B,CAAC,iBAAiB,CAAC,KAAK,QAAQ,EACvE,CAAC;QACD,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,WAAW,GAAI,GAA8B,CAAC,iBAAiB,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC7D,IAAI,CAAC,eAAe,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;IACD,IAAI,aAAoB,CAAC;IACzB,IAAI,eAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACrD,eAAe,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;IACD,IACE,aAAa,CAAC,cAAc,EAAE;QAC9B,CAAC,aAAa,CAAC,MAAM,EAAE;QACvB,CAAC,eAAe,CAAC,WAAW,EAAE,eAAe,EAAE,YAAY,CAAC,QAAQ,CAAC,EACrE,CAAC;QACD,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;IACD,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,CACjD;QACE,UAAU,EAAE,YAAY,CAAC,QAAQ;QACjC,IAAI,EAAE,CAAC,eAAe,EAAE,WAAW,CAAC;KACrC,EACD;QACE,GAAG,EAAE,gBAAgB;QACrB,GAAG,EAAE;YACH,GAAG,YAAY,CAAC,WAAW;YAC3B,EAAE,EAAE,MAAM;YACV,YAAY,EAAE,GAAG;YACjB,iBAAiB,EAAE,GAAG;SACvB;QACD,SAAS,EAAE,gCAAgC;KAC5C,CACF,CAAC;IACF,IACE,aAAa,CAAC,aAAa,CAAC;QAC5B,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,WAAW,aAAa,EAAE,EAC1D,CAAC;QACD,MAAM,IAAI,kBAAkB,CAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,KAA+B;IAC7D,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,kBAAkB;YACrB,OAAO,mBAAmB,CAAC;QAC7B,KAAK,SAAS;YACZ,OAAO,mBAAmB,CAAC;QAC7B,KAAK,cAAc,CAAC;QACpB,KAAK,iBAAiB;YACpB,OAAO,uBAAuB,CAAC;QACjC;YACE,OAAO,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAA2B,EAC3B,SAAS,GAAqC,EAAE;IAEhD,MAAM,YAAY,GAA4B;QAC5C,GAAG,8BAA8B,EAAE;QACnC,GAAG,SAAS;KACb,CAAC;IACF,MAAM,gBAAgB,GAAG,MAAM,YAAY,CAAC,oBAAoB,EAAE,CAAC;IACnE,IAAI,aAAiC,CAAC;IACtC,IAAI,QAA6C,CAAC;IAClD,IAAI,CAAC;QACH,OAAO,CAAC,OAAO,EAAE,CAAC,6BAA6B,CAAC,CAAC;QACjD,MAAM,YAAY,GAAG,MAAM,yBAAyB,CAClD,OAAO,EACP,gBAAgB,EAChB,YAAY,CACb,CAAC;QAEF,OAAO,CAAC,OAAO,EAAE,CAAC,iCAAiC,CAAC,CAAC;QACrD,IAAI,MAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,YAAY,CAAC,mBAAmB,EAAE,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,wBAAwB,EAAE,CAAC;gBAC9C,OAAO,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;YAClE,CAAC;YACD,OAAO,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QAC5D,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,kBAAkB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1E,OAAO,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,CAAC,CAAC;QACxD,CAAC;QACD,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QACxE,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,CAAC,OAAO,EAAE,CAAC,mCAAmC,CAAC,CAAC;QACvD,MAAM,kBAAkB,GAAG,MAAM,qBAAqB,CACpD,aAAa,EACb,YAAY,CAAC,aAAa,EAC1B,gBAAgB,EAChB,YAAY,CACb,CAAC;QACF,QAAQ,GAAG,kBAAkB,CAAC,IAAI,CAAC;QACnC,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC7B,OAAO,MAAM,CAAC,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE;gBAC7D,aAAa;gBACb,YAAY,EAAE,QAAQ;aACvB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,OAAO,EAAE,CAAC,+BAA+B,EAAE,aAAa,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,4BAA4B,CACjD,aAAa,EACb,YAAY,CAAC,QAAQ,CACtB,CAAC;QACF,OAAO,CAAC,gBAAgB,EAAE,CAAC,cAAc,CAAC,CAAC;QAC3C,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE;YAClE,GAAG,EAAE,gBAAgB;YACrB,GAAG,EAAE,YAAY,CAAC,WAAW;YAC7B,SAAS,EAAE,2BAA2B;YACtC,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM;YACtD,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,IAAI,aAAa,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE;gBACtD,aAAa;gBACb,YAAY,EAAE,QAAQ;aACvB,CAAC,CAAC;QACL,CAAC;QACD,IAAI,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC;YACjC,OAAO,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE;gBACrD,aAAa;gBACb,YAAY,EAAE,QAAQ;aACvB,CAAC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,OAAO,EAAE,CAAC,oBAAoB,EAAE,aAAa,CAAC,CAAC;QACvD,MAAM,iBAAiB,CACrB,aAAa,EACb,YAAY,CAAC,aAAa,EAC1B,gBAAgB,EAChB,YAAY,CACb,CAAC;QACF,OAAO,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE;YACrD,aAAa;YACb,YAAY,EAAE,QAAQ;SACvB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;YACxC,OAAO,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE;gBACrD,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3C,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC,YAAY;oBAChC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,IAAI,KAAK,CAAC,YAAY,EAAE;oBAClD,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE;YACtD,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3C,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChD,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,MAAM,YAAY,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC;AAED,SAAS,8BAA8B;IACrC,OAAO;QACL,MAAM,EAAE,IAAI,iBAAiB,EAAE;QAC/B,mBAAmB;QACnB,oBAAoB,EAAE,GAAG,EAAE,CACzB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC;QACrD,sBAAsB,EAAE,CAAC,SAAS,EAAE,EAAE,CACpC,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACjD,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAC3B,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAY;QACzD,KAAK;QACL,QAAQ;QACR,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,OAAO,CAAC,GAAG;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { liftoffPackageName } from './package-identity.js';
2
+ export declare const stableReleaseLookupTimeoutMs = 2000;
3
+ export type StableReleaseFailureCode = 'http_failure' | 'invalid_metadata' | 'network_failure' | 'timeout';
4
+ export declare class StableReleaseLookupError extends Error {
5
+ readonly code: StableReleaseFailureCode;
6
+ constructor(code: StableReleaseFailureCode, message: string);
7
+ }
8
+ export interface StableRelease {
9
+ name: typeof liftoffPackageName;
10
+ version: string;
11
+ }
12
+ export interface StableReleaseLookupOptions {
13
+ fetch?: typeof globalThis.fetch;
14
+ registry?: string;
15
+ timeoutMs?: number;
16
+ }
17
+ export declare function isStableSemver(value: unknown): value is string;
18
+ export declare function lookupStableRelease(options?: StableReleaseLookupOptions): Promise<StableRelease>;