@meterapp/car-image 1.13.0 → 1.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -9
- package/dist/agent-config.js +8 -2
- package/dist/agent-config.js.map +1 -1
- package/dist/args.js +2 -0
- package/dist/args.js.map +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/client.js.map +1 -1
- package/dist/commands/about.js.map +1 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/help.js.map +1 -1
- package/dist/commands/images.js.map +1 -1
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/maintenance.js +72 -25
- package/dist/commands/maintenance.js.map +1 -1
- package/dist/commands/whoami.js +9 -1
- package/dist/commands/whoami.js.map +1 -1
- package/dist/config.js +10 -1
- package/dist/config.js.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/host-plugins.js +101 -0
- package/dist/host-plugins.js.map +1 -0
- package/dist/main.js +46 -35
- package/dist/main.js.map +1 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/output.js.map +1 -1
- package/dist/telemetry.js.map +1 -1
- package/dist/update.js +332 -84
- package/dist/update.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +7 -6
package/dist/update.js
CHANGED
|
@@ -1,8 +1,19 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { accessSync, closeSync, constants, existsSync, mkdirSync, openSync, statSync, unlinkSync, writeSync } from "node:fs";
|
|
3
|
+
import { posix } from "node:path";
|
|
4
|
+
import { fileURLToPath } from "node:url";
|
|
2
5
|
import { readJsonFile, writeJsonFile } from "./config.js";
|
|
3
|
-
import { PACKAGE_NAME } from "./version.js";
|
|
4
|
-
export const
|
|
5
|
-
|
|
6
|
+
import { BIN_NAME, CLI_VERSION, PACKAGE_NAME } from "./version.js";
|
|
7
|
+
export const DEFAULT_REGISTRY = "https://registry.npmjs.org";
|
|
8
|
+
/** How long a registry answer stands before the next command asks again, in the background. */
|
|
9
|
+
export const UPDATE_CHECK_TTL_MS = 60 * 60 * 1000;
|
|
10
|
+
/** A notice the CLI cannot act on itself (npx, `never`, a failed install) repeats at most once a day. */
|
|
11
|
+
export const NOTICE_INTERVAL_MS = 24 * 60 * 60 * 1000;
|
|
12
|
+
/** An automatic install of one version is tried again after a day; `car-image update` tries now. */
|
|
13
|
+
export const INSTALL_RETRY_MS = 24 * 60 * 60 * 1000;
|
|
14
|
+
/** A lock older than this belongs to a worker that died. */
|
|
15
|
+
export const LOCK_STALE_MS = 10 * 60 * 1000;
|
|
16
|
+
export const INSTALL_TIMEOUT_MS = 5 * 60 * 1000;
|
|
6
17
|
function parseVersion(version) {
|
|
7
18
|
const match = /^v?(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?/.exec(version.trim());
|
|
8
19
|
if (!match)
|
|
@@ -32,111 +43,348 @@ export function compareVersions(a, b) {
|
|
|
32
43
|
export function isNewer(latest, current) {
|
|
33
44
|
return typeof latest === "string" && compareVersions(latest, current) > 0;
|
|
34
45
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const agent = (env.npm_config_user_agent ?? "").toLowerCase();
|
|
38
|
-
if (agent.startsWith("pnpm/"))
|
|
39
|
-
return "pnpm";
|
|
40
|
-
if (agent.startsWith("bun/"))
|
|
41
|
-
return "bun";
|
|
42
|
-
if (agent.startsWith("yarn/"))
|
|
43
|
-
return "yarn";
|
|
44
|
-
return "npm";
|
|
45
|
-
}
|
|
46
|
-
export function installCommand(manager, pkg = PACKAGE_NAME) {
|
|
47
|
-
switch (manager) {
|
|
48
|
-
case "pnpm":
|
|
49
|
-
return { command: "pnpm", args: ["add", "-g", `${pkg}@latest`] };
|
|
50
|
-
case "bun":
|
|
51
|
-
return { command: "bun", args: ["add", "-g", `${pkg}@latest`] };
|
|
52
|
-
case "yarn":
|
|
53
|
-
return { command: "yarn", args: ["global", "add", `${pkg}@latest`] };
|
|
54
|
-
default:
|
|
55
|
-
return { command: "npm", args: ["install", "-g", `${pkg}@latest`] };
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
/** True when running through `npx`, `pnpm dlx`, `bunx` or similar one-shot runners. */
|
|
59
|
-
export function isNpxInvocation(env = process.env, argv1 = process.argv[1] ?? "") {
|
|
60
|
-
if (env.npm_command === "exec")
|
|
61
|
-
return true;
|
|
62
|
-
if (env.npm_lifecycle_event === "npx")
|
|
63
|
-
return true;
|
|
64
|
-
const path = argv1.replace(/\\/g, "/");
|
|
65
|
-
return /\/_npx\//.test(path) || /\/\.pnpm-store\/|\/dlx-[^/]*\//.test(path) || /\/\.bun\/install\/cache\//.test(path);
|
|
46
|
+
function truthy(value) {
|
|
47
|
+
return value !== undefined && value !== "" && value !== "0" && value.toLowerCase() !== "false";
|
|
66
48
|
}
|
|
67
|
-
/**
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
export function decideUpdate(input) {
|
|
75
|
-
if (!isNewer(input.latest, input.current))
|
|
76
|
-
return { action: "none", reason: "up to date" };
|
|
77
|
-
if (input.command === "mcp" || input.command === "update")
|
|
78
|
-
return { action: "none", reason: "command excluded" };
|
|
79
|
-
if (!input.isTTY)
|
|
80
|
-
return { action: "none", reason: "not a tty" };
|
|
81
|
-
if (input.quiet)
|
|
82
|
-
return { action: "none", reason: "quiet" };
|
|
83
|
-
if (input.lastNoticeAt !== null && input.now - input.lastNoticeAt < UPDATE_CHECK_TTL_MS) {
|
|
84
|
-
return { action: "none", reason: "already notified today" };
|
|
85
|
-
}
|
|
86
|
-
if (input.viaNpx)
|
|
87
|
-
return { action: "notice", latest: input.latest };
|
|
88
|
-
switch (input.autoUpdate) {
|
|
89
|
-
case "always":
|
|
90
|
-
return { action: "install", latest: input.latest };
|
|
91
|
-
case "never":
|
|
92
|
-
return { action: "notice", latest: input.latest };
|
|
93
|
-
default:
|
|
94
|
-
return { action: "ask", latest: input.latest };
|
|
95
|
-
}
|
|
49
|
+
/** `CAR_IMAGE_NO_UPDATE_CHECK=1`, the conventional `NO_UPDATE_NOTIFIER=1`, or `CI`: no background check, install or notice. `car-image update` still works. */
|
|
50
|
+
export function updateChecksDisabled(env = process.env) {
|
|
51
|
+
return truthy(env.CAR_IMAGE_NO_UPDATE_CHECK) || truthy(env.NO_UPDATE_NOTIFIER) || truthy(env.CI);
|
|
52
|
+
}
|
|
53
|
+
/** `CAR_IMAGE_NPM_REGISTRY` for mirrors and tests; otherwise the public registry. */
|
|
54
|
+
export function registryUrl(env = process.env) {
|
|
55
|
+
return (env.CAR_IMAGE_NPM_REGISTRY?.trim() || DEFAULT_REGISTRY).replace(/\/+$/, "");
|
|
96
56
|
}
|
|
97
57
|
/** Latest published version from the npm registry, or null on any failure. */
|
|
98
|
-
export async function fetchLatestVersion(fetchImpl = fetch, timeoutMs = 2500) {
|
|
58
|
+
export async function fetchLatestVersion(fetchImpl = fetch, timeoutMs = 2500, registry = DEFAULT_REGISTRY) {
|
|
99
59
|
try {
|
|
100
|
-
const response = await fetchImpl(
|
|
60
|
+
const response = await fetchImpl(`${registry}/${PACKAGE_NAME}/latest`, {
|
|
101
61
|
signal: AbortSignal.timeout(timeoutMs),
|
|
102
62
|
headers: { Accept: "application/vnd.npm.install-v1+json, application/json" },
|
|
103
63
|
});
|
|
104
64
|
if (!response.ok)
|
|
105
65
|
return null;
|
|
106
66
|
const body = (await response.json());
|
|
107
|
-
return typeof body.version === "string" ? body.version : null;
|
|
67
|
+
return typeof body.version === "string" && parseVersion(body.version) ? body.version : null;
|
|
108
68
|
}
|
|
109
69
|
catch {
|
|
110
70
|
return null;
|
|
111
71
|
}
|
|
112
72
|
}
|
|
113
|
-
|
|
73
|
+
export async function readUpdateCache(cachePath) {
|
|
74
|
+
const raw = await readJsonFile(cachePath);
|
|
75
|
+
if (!raw || typeof raw.checkedAt !== "number")
|
|
76
|
+
return null;
|
|
77
|
+
const cache = { checkedAt: raw.checkedAt, latest: typeof raw.latest === "string" ? raw.latest : null };
|
|
78
|
+
if (typeof raw.lastNoticeAt === "number")
|
|
79
|
+
cache.lastNoticeAt = raw.lastNoticeAt;
|
|
80
|
+
const install = raw.install;
|
|
81
|
+
if (install && typeof install.version === "string" && typeof install.from === "string" && typeof install.at === "number" && typeof install.ok === "boolean") {
|
|
82
|
+
cache.install = { version: install.version, from: install.from, at: install.at, ok: install.ok };
|
|
83
|
+
if (typeof install.error === "string")
|
|
84
|
+
cache.install.error = install.error;
|
|
85
|
+
if (install.announced === true)
|
|
86
|
+
cache.install.announced = true;
|
|
87
|
+
}
|
|
88
|
+
return cache;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Reads the cache, asking the registry when it is stale or forced. A lookup
|
|
92
|
+
* that fails keeps the last answer, so an offline machine is asked again at
|
|
93
|
+
* the next interval rather than on every command.
|
|
94
|
+
*/
|
|
114
95
|
export async function checkForUpdate(options) {
|
|
115
96
|
const now = options.now ?? Date.now();
|
|
116
97
|
const ttl = options.ttlMs ?? UPDATE_CHECK_TTL_MS;
|
|
117
|
-
const cached = await
|
|
118
|
-
if (!options.force && cached &&
|
|
119
|
-
return { latest: cached.latest
|
|
98
|
+
const cached = await readUpdateCache(options.cachePath);
|
|
99
|
+
if (!options.force && cached && now - cached.checkedAt < ttl) {
|
|
100
|
+
return { latest: cached.latest, cache: cached, fromCache: true };
|
|
120
101
|
}
|
|
121
|
-
const
|
|
122
|
-
const
|
|
102
|
+
const fetched = await fetchLatestVersion(options.fetchImpl, options.timeoutMs, options.registry);
|
|
103
|
+
const latest = fetched ?? cached?.latest ?? null;
|
|
104
|
+
const cache = { ...cached, checkedAt: now, latest };
|
|
123
105
|
await writeJsonFile(options.cachePath, cache, 0o600).catch(() => undefined);
|
|
124
|
-
return { latest, cache, fromCache:
|
|
106
|
+
return { latest, cache, fromCache: fetched === null };
|
|
125
107
|
}
|
|
126
108
|
export async function markNoticeShown(cachePath, cache, now = Date.now()) {
|
|
127
|
-
|
|
109
|
+
// Re-read: a background worker may have written an install record since `cache` was read.
|
|
110
|
+
const current = (await readUpdateCache(cachePath)) ?? cache;
|
|
111
|
+
await writeJsonFile(cachePath, { ...current, lastNoticeAt: now }, 0o600).catch(() => undefined);
|
|
112
|
+
}
|
|
113
|
+
function thisModulePath() {
|
|
114
|
+
try {
|
|
115
|
+
return fileURLToPath(import.meta.url);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
return "";
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function isWritable(path) {
|
|
122
|
+
try {
|
|
123
|
+
accessSync(path, constants.W_OK);
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
128
129
|
}
|
|
129
|
-
/**
|
|
130
|
-
|
|
131
|
-
const
|
|
132
|
-
|
|
130
|
+
/** npm's own entry point beside the Node binary, so the install runs without a shell and lands in that Node's prefix. */
|
|
131
|
+
function npmCliPath(execPath, platform, exists) {
|
|
132
|
+
const dir = posix.dirname(execPath.replace(/\\/g, "/"));
|
|
133
|
+
const candidate = platform === "win32" ? `${dir}/node_modules/npm/bin/npm-cli.js` : `${dir}/../lib/node_modules/npm/bin/npm-cli.js`;
|
|
134
|
+
return exists(candidate) ? posix.normalize(candidate) : null;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Works out from where this file lives how the CLI was installed, so an
|
|
138
|
+
* update goes through the same package manager into the same directory:
|
|
139
|
+
* a global npm install (`<prefix>/lib/node_modules`, or `<prefix>/node_modules`
|
|
140
|
+
* on Windows, with the `car-image` command beside it), pnpm, bun, yarn or
|
|
141
|
+
* Volta globals, an npx/dlx cache, a project dependency or a source build.
|
|
142
|
+
*/
|
|
143
|
+
export function detectInstall(options = {}) {
|
|
144
|
+
const platform = options.platform ?? process.platform;
|
|
145
|
+
const exists = options.exists ?? existsSync;
|
|
146
|
+
const writable = options.writable ?? isWritable;
|
|
147
|
+
const spec = `${PACKAGE_NAME}@${options.version ?? "latest"}`;
|
|
148
|
+
const path = (options.modulePath ?? thisModulePath()).replace(/\\/g, "/");
|
|
149
|
+
const at = path.lastIndexOf(`/node_modules/${PACKAGE_NAME}/`);
|
|
150
|
+
if (at < 0)
|
|
151
|
+
return { method: "source", display: "rebuild it from source" };
|
|
152
|
+
if (path.includes("/_npx/") || /\/dlx[-/]/.test(path) || path.includes("/.bun/install/cache/")) {
|
|
153
|
+
return { method: "npx", display: `npx ${spec}` };
|
|
154
|
+
}
|
|
155
|
+
const nodeModules = path.slice(0, at + "/node_modules".length);
|
|
156
|
+
const blockedUnless = (dir) => (writable(dir) ? undefined : `${dir} is not writable by this user`);
|
|
157
|
+
const managed = (method, command, args) => {
|
|
158
|
+
const blocked = blockedUnless(nodeModules);
|
|
159
|
+
return { method, command, args, display: [command, ...args].join(" "), ...(blocked ? { blocked } : {}) };
|
|
160
|
+
};
|
|
161
|
+
if (path.includes("/.volta/"))
|
|
162
|
+
return managed("volta", "volta", ["install", spec]);
|
|
163
|
+
if (path.includes("/pnpm/global/") || path.includes("/.pnpm-global/"))
|
|
164
|
+
return managed("pnpm", "pnpm", ["add", "--global", spec]);
|
|
165
|
+
if (path.includes("/.bun/install/global/"))
|
|
166
|
+
return managed("bun", "bun", ["add", "--global", spec]);
|
|
167
|
+
if (path.includes("/yarn/global/"))
|
|
168
|
+
return managed("yarn", "yarn", ["global", "add", spec]);
|
|
169
|
+
const parent = posix.dirname(nodeModules);
|
|
170
|
+
const prefix = platform === "win32" ? parent : posix.basename(parent) === "lib" ? posix.dirname(parent) : null;
|
|
171
|
+
const bin = prefix === null ? null : platform === "win32" ? `${prefix}/${BIN_NAME}.cmd` : `${prefix}/bin/${BIN_NAME}`;
|
|
172
|
+
if (prefix === null || bin === null || !exists(bin)) {
|
|
173
|
+
return { method: "project", display: `npm install ${spec} in the project that depends on it` };
|
|
174
|
+
}
|
|
175
|
+
const args = ["install", "--global", "--prefix", prefix, spec];
|
|
176
|
+
const display = `npm install -g ${spec}`;
|
|
177
|
+
const blocked = blockedUnless(nodeModules) ?? blockedUnless(posix.dirname(bin));
|
|
178
|
+
const npmCli = npmCliPath(options.execPath ?? process.execPath, platform, exists);
|
|
179
|
+
const command = npmCli ? { command: options.execPath ?? process.execPath, args: [npmCli, ...args] } : { command: "npm", args };
|
|
180
|
+
return { method: "npm", ...command, display, ...(blocked ? { blocked } : {}) };
|
|
181
|
+
}
|
|
182
|
+
/** Quotes for cmd.exe, which `shell: true` hands the arguments to joined by spaces. */
|
|
183
|
+
function windowsArg(value) {
|
|
184
|
+
return /[\s"&|<>^]/.test(value) ? `"${value.replace(/"/g, '""')}"` : value;
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Runs the install and resolves with its exit code; `stdio` is "inherit"
|
|
188
|
+
* (`car-image update`) or a file descriptor for `update.log` (the background
|
|
189
|
+
* worker). Never throws.
|
|
190
|
+
*/
|
|
191
|
+
export function runInstall(target, stdio, timeoutMs = INSTALL_TIMEOUT_MS) {
|
|
192
|
+
const { command, args } = target;
|
|
193
|
+
if (!command || !args)
|
|
194
|
+
return Promise.resolve({ code: 1, error: `cannot update this copy automatically: ${target.display}` });
|
|
133
195
|
return new Promise((resolve) => {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
196
|
+
// npm through the Node binary needs no shell; a package manager's own command is a .cmd shim on Windows.
|
|
197
|
+
const shell = process.platform === "win32" && command !== process.execPath;
|
|
198
|
+
let settled = false;
|
|
199
|
+
const finish = (result) => {
|
|
200
|
+
if (settled)
|
|
201
|
+
return;
|
|
202
|
+
settled = true;
|
|
203
|
+
clearTimeout(timer);
|
|
204
|
+
resolve(result);
|
|
205
|
+
};
|
|
206
|
+
const child = spawn(command, shell ? args.map(windowsArg) : args, { stdio: typeof stdio === "number" ? ["ignore", stdio, stdio] : stdio, shell, windowsHide: true });
|
|
207
|
+
const timer = setTimeout(() => {
|
|
208
|
+
child.kill();
|
|
209
|
+
finish({ code: 1, error: `${target.display} took longer than ${Math.round(timeoutMs / 1000)} s` });
|
|
210
|
+
}, timeoutMs);
|
|
211
|
+
child.on("error", (error) => finish({ code: 1, error: `could not start ${command}: ${error.message}` }));
|
|
212
|
+
child.on("exit", (code, signal) => finish(code === 0 ? { code: 0 } : { code: code ?? 1, error: `${target.display} ${signal ? `stopped (${signal})` : `exited with ${code}`}` }));
|
|
140
213
|
});
|
|
141
214
|
}
|
|
215
|
+
// ---------------------------------------------------------------------------
|
|
216
|
+
// The background worker
|
|
217
|
+
// ---------------------------------------------------------------------------
|
|
218
|
+
/** Takes the update lock (exclusive create); breaks a lock left by a worker that died. */
|
|
219
|
+
export function acquireUpdateLock(lockPath, now = Date.now()) {
|
|
220
|
+
try {
|
|
221
|
+
mkdirSync(posix.dirname(lockPath.replace(/\\/g, "/")), { recursive: true, mode: 0o700 });
|
|
222
|
+
}
|
|
223
|
+
catch {
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
for (let attempt = 0; attempt < 2; attempt += 1) {
|
|
227
|
+
try {
|
|
228
|
+
closeSync(openSync(lockPath, "wx", 0o600));
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
catch (error) {
|
|
232
|
+
if (error.code !== "EEXIST")
|
|
233
|
+
return false;
|
|
234
|
+
try {
|
|
235
|
+
if (now - statSync(lockPath).mtimeMs < LOCK_STALE_MS)
|
|
236
|
+
return false;
|
|
237
|
+
unlinkSync(lockPath);
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
return false;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
export function releaseUpdateLock(lockPath) {
|
|
247
|
+
try {
|
|
248
|
+
unlinkSync(lockPath);
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
// already gone
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
export function updateLockHeld(lockPath, now = Date.now()) {
|
|
255
|
+
try {
|
|
256
|
+
return now - statSync(lockPath).mtimeMs < LOCK_STALE_MS;
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
function defaultCliPath() {
|
|
263
|
+
try {
|
|
264
|
+
return fileURLToPath(new URL("./bin.js", import.meta.url));
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
return undefined;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Starts `car-image update --worker` detached, so the command that
|
|
272
|
+
* noticed a stale check never waits for the registry or an install. False
|
|
273
|
+
* when there is nothing to run (tests run the TypeScript sources).
|
|
274
|
+
*/
|
|
275
|
+
export function spawnBackgroundUpdate(env = process.env, cliPath = defaultCliPath()) {
|
|
276
|
+
if (!cliPath || !existsSync(cliPath))
|
|
277
|
+
return false;
|
|
278
|
+
try {
|
|
279
|
+
const child = spawn(process.execPath, [cliPath, "update", "--worker"], { detached: true, stdio: "ignore", env: env, windowsHide: true });
|
|
280
|
+
child.on("error", () => undefined);
|
|
281
|
+
child.unref();
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/** True when the last automatic attempt at `version` is recent enough that it should not be repeated yet. */
|
|
289
|
+
function attemptedRecently(cache, version, now) {
|
|
290
|
+
const install = cache?.install;
|
|
291
|
+
return Boolean(install && install.version === version && now - install.at < INSTALL_RETRY_MS);
|
|
292
|
+
}
|
|
293
|
+
async function installLogged(target, logPath) {
|
|
294
|
+
let fd;
|
|
295
|
+
try {
|
|
296
|
+
fd = openSync(logPath, "w", 0o600);
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
return runInstall(target, "ignore");
|
|
300
|
+
}
|
|
301
|
+
try {
|
|
302
|
+
writeSync(fd, `${new Date().toISOString()} car-image ${CLI_VERSION}: ${target.display}\n`);
|
|
303
|
+
return await runInstall(target, fd);
|
|
304
|
+
}
|
|
305
|
+
finally {
|
|
306
|
+
closeSync(fd);
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* What `car-image update --worker` does: ask the registry and, in
|
|
311
|
+
* `always` mode, install a newer version with the package manager that
|
|
312
|
+
* installed this one. The next command runs the new version. One worker at
|
|
313
|
+
* a time; a failed version is retried after `INSTALL_RETRY_MS`.
|
|
314
|
+
*/
|
|
315
|
+
export async function runBackgroundUpdate(options) {
|
|
316
|
+
const now = options.now ?? Date.now();
|
|
317
|
+
if (!acquireUpdateLock(options.lockPath, now))
|
|
318
|
+
return null;
|
|
319
|
+
try {
|
|
320
|
+
const { latest, cache, fromCache } = await checkForUpdate({ cachePath: options.cachePath, now, force: true, fetchImpl: options.fetchImpl, timeoutMs: 10_000, registry: options.registry });
|
|
321
|
+
// Only a version the registry just named is installed: offline, the next interval asks again.
|
|
322
|
+
if (fromCache || !isNewer(latest, CLI_VERSION) || options.autoUpdate !== "always" || attemptedRecently(cache, latest, now))
|
|
323
|
+
return cache;
|
|
324
|
+
const target = options.target ?? detectInstall({ version: latest });
|
|
325
|
+
if (!target.command || target.blocked)
|
|
326
|
+
return cache;
|
|
327
|
+
const outcome = await (options.install ?? installLogged)(target, options.logPath);
|
|
328
|
+
const install = { version: latest, from: CLI_VERSION, at: now, ok: outcome.code === 0, ...(outcome.error ? { error: outcome.error } : {}) };
|
|
329
|
+
const next = { ...((await readUpdateCache(options.cachePath)) ?? cache), install };
|
|
330
|
+
await writeJsonFile(options.cachePath, next, 0o600).catch(() => undefined);
|
|
331
|
+
return next;
|
|
332
|
+
}
|
|
333
|
+
finally {
|
|
334
|
+
releaseUpdateLock(options.lockPath);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Decides, from the cache alone (no network), whether a command should start
|
|
339
|
+
* the background worker and what, if anything, to tell a person at a terminal:
|
|
340
|
+
* that a background update landed, or that a newer version needs them (an
|
|
341
|
+
* npx or project copy, `never`, a directory they cannot write, an install that
|
|
342
|
+
* failed). `ask` prompts before the command.
|
|
343
|
+
*/
|
|
344
|
+
export function planUpdate(input) {
|
|
345
|
+
const { cache, current, autoUpdate, target, now } = input;
|
|
346
|
+
const latest = cache?.latest ?? null;
|
|
347
|
+
const stale = !cache || now - cache.checkedAt >= UPDATE_CHECK_TTL_MS;
|
|
348
|
+
const installable = Boolean(target.command) && !target.blocked;
|
|
349
|
+
const newer = isNewer(latest, current);
|
|
350
|
+
// A fresh answer that names a newer version still needs a worker when nothing has tried to install it yet.
|
|
351
|
+
const pending = newer && autoUpdate === "always" && installable && !attemptedRecently(cache, latest, now);
|
|
352
|
+
const spawnWorker = stale || pending;
|
|
353
|
+
const install = cache?.install;
|
|
354
|
+
if (install?.ok && !install.announced && compareVersions(install.version, current) === 0) {
|
|
355
|
+
return { spawn: spawnWorker, plan: { action: "announce", from: install.from, version: install.version } };
|
|
356
|
+
}
|
|
357
|
+
// A source build is a developer's checkout: they update it with git.
|
|
358
|
+
if (!newer || target.method === "source")
|
|
359
|
+
return { spawn: spawnWorker, plan: { action: "none" } };
|
|
360
|
+
if (cache?.lastNoticeAt !== undefined && now - cache.lastNoticeAt < NOTICE_INTERVAL_MS)
|
|
361
|
+
return { spawn: spawnWorker, plan: { action: "none" } };
|
|
362
|
+
const head = `Update available: car-image ${current} → ${latest}.`;
|
|
363
|
+
if (target.method === "npx")
|
|
364
|
+
return { spawn: spawnWorker, plan: { action: "notice", latest, message: `${head} \`npx ${PACKAGE_NAME}@latest\` runs it.` } };
|
|
365
|
+
if (!target.command)
|
|
366
|
+
return { spawn: spawnWorker, plan: { action: "notice", latest, message: `${head} Update it with: ${target.display}.` } };
|
|
367
|
+
if (target.blocked)
|
|
368
|
+
return { spawn: spawnWorker, plan: { action: "notice", latest, message: `${head} It cannot install itself (${target.blocked}); run: ${target.display}` } };
|
|
369
|
+
if (autoUpdate === "ask")
|
|
370
|
+
return { spawn: spawnWorker, plan: { action: "ask", latest } };
|
|
371
|
+
if (autoUpdate === "never")
|
|
372
|
+
return { spawn: spawnWorker, plan: { action: "notice", latest, message: `${head} Run \`car-image update\` (automatic updates are off: \`car-image config set autoUpdate always\`).` } };
|
|
373
|
+
if (install && !install.ok && install.version === latest) {
|
|
374
|
+
return { spawn: spawnWorker, plan: { action: "notice", latest, message: `${head} The automatic update failed (${install.error ?? "see update.log"}); run \`car-image update\`.` } };
|
|
375
|
+
}
|
|
376
|
+
// `always`, and a worker is installing it or will: nothing to say yet.
|
|
377
|
+
return { spawn: spawnWorker, plan: { action: "none" } };
|
|
378
|
+
}
|
|
379
|
+
/** Records an install `car-image update` ran in the foreground; the person saw it, so it is not announced again. */
|
|
380
|
+
export async function recordInstall(cachePath, install) {
|
|
381
|
+
const cache = (await readUpdateCache(cachePath)) ?? { checkedAt: install.at, latest: install.version };
|
|
382
|
+
await writeJsonFile(cachePath, { ...cache, install: { ...install, announced: true } }, 0o600).catch(() => undefined);
|
|
383
|
+
}
|
|
384
|
+
export async function markAnnounced(cachePath) {
|
|
385
|
+
const cache = await readUpdateCache(cachePath);
|
|
386
|
+
if (!cache?.install)
|
|
387
|
+
return;
|
|
388
|
+
await writeJsonFile(cachePath, { ...cache, install: { ...cache.install, announced: true } }, 0o600).catch(() => undefined);
|
|
389
|
+
}
|
|
142
390
|
//# sourceMappingURL=update.js.map
|
package/dist/update.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC7H,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,4BAA4B,CAAC;AAC7D,+FAA+F;AAC/F,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAClD,yGAAyG;AACzG,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACtD,oGAAoG;AACpG,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACpD,4DAA4D;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC5C,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AAsBhD,SAAS,YAAY,CAAC,OAAe;IACnC,MAAM,KAAK,GAAG,8CAA8C,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAClF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AAClG,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,IAAI,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7B,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IAC9B,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG;QAAE,OAAO,CAAC,CAAC;IACrC,IAAI,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1F,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAiC,EAAE,OAAe;IACxE,OAAO,OAAO,MAAM,KAAK,QAAQ,IAAI,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,MAAM,CAAC,KAAyB;IACvC,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE,KAAK,OAAO,CAAC;AACjG,CAAC;AAED,+JAA+J;AAC/J,MAAM,UAAU,oBAAoB,CAAC,GAAG,GAAQ,OAAO,CAAC,GAAG;IACzD,OAAO,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACnG,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,WAAW,CAAC,GAAG,GAAQ,OAAO,CAAC,GAAG;IAChD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE,IAAI,gBAAgB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACtF,CAAC;AAMD,8EAA8E;AAC9E,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAS,GAAqB,KAAK,EAAE,SAAS,GAAG,IAAI,EAAE,QAAQ,GAAG,gBAAgB;IACzH,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,QAAQ,IAAI,YAAY,SAAS,EAAE;YACrE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC;YACtC,OAAO,EAAE,EAAE,MAAM,EAAE,uDAAuD,EAAE;SAC7E,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAC9B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA0B,CAAC;QAC9D,OAAO,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB;IACrD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAuB,SAAS,CAAC,CAAC;IAChE,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3D,MAAM,KAAK,GAAgB,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpH,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ;QAAE,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,YAAY,CAAC;IAChF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,IAAI,OAAO,IAAI,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC5J,KAAK,CAAC,OAAO,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;QACjG,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ;YAAE,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC3E,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI;YAAE,KAAK,CAAC,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IACjE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAYD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA8B;IACjE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,IAAI,mBAAmB,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,MAAM,IAAI,GAAG,GAAG,MAAM,CAAC,SAAS,GAAG,GAAG,EAAE,CAAC;QAC7D,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACnE,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,OAAO,IAAI,MAAM,EAAE,MAAM,IAAI,IAAI,CAAC;IACjD,MAAM,KAAK,GAAgB,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IACjE,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5E,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,SAAiB,EAAE,KAAkB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC3F,0FAA0F;IAC1F,MAAM,OAAO,GAAG,CAAC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC;IAC5D,MAAM,aAAa,CAAC,SAAS,EAAE,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAClG,CAAC;AA8BD,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,CAAC;QACH,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,yHAAyH;AACzH,SAAS,UAAU,CAAC,QAAgB,EAAE,QAAyB,EAAE,MAAiC;IAChG,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;IACxD,MAAM,SAAS,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,kCAAkC,CAAC,CAAC,CAAC,GAAG,GAAG,yCAAyC,CAAC;IACpI,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,OAAO,GAAyB,EAAE;IAC9D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAC;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC;IAChD,MAAM,IAAI,GAAG,GAAG,YAAY,IAAI,OAAO,CAAC,OAAO,IAAI,QAAQ,EAAE,CAAC;IAC9D,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,IAAI,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC1E,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,iBAAiB,YAAY,GAAG,CAAC,CAAC;IAC9D,IAAI,EAAE,GAAG,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC;IAC3E,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;QAC/F,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,IAAI,EAAE,EAAE,CAAC;IACnD,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,+BAA+B,CAAC,CAAC;IAC3G,MAAM,OAAO,GAAG,CAAC,MAAqB,EAAE,OAAe,EAAE,IAAc,EAAiB,EAAE;QACxF,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC3C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IAC3G,CAAC,CAAC;IACF,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IACnF,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IACjI,IAAI,IAAI,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAAE,OAAO,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;IACpG,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;QAAE,OAAO,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;IAE5F,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/G,MAAM,GAAG,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,QAAQ,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,QAAQ,QAAQ,EAAE,CAAC;IACtH,IAAI,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,eAAe,IAAI,oCAAoC,EAAE,CAAC;IACjG,CAAC;IACD,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC/D,MAAM,OAAO,GAAG,kBAAkB,IAAI,EAAE,CAAC;IACzC,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAChF,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClF,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC/H,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,uFAAuF;AACvF,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AAC7E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,MAAqB,EAAE,KAAoC,EAAE,SAAS,GAAG,kBAAkB;IACpH,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IACjC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI;QAAE,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,0CAA0C,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC9H,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,yGAAyG;QACzG,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC;QAC3E,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,CAAC,MAAwC,EAAE,EAAE;YAC1D,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QACrK,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,OAAO,qBAAqB,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrG,CAAC,EAAE,SAAS,CAAC,CAAC;QACd,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,mBAAmB,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QACzG,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACnL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,wBAAwB;AACxB,8EAA8E;AAE9E,0FAA0F;AAC1F,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAClE,IAAI,CAAC;QACH,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3F,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,CAAC;YACH,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;YAC3C,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YACrE,IAAI,CAAC;gBACH,IAAI,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,aAAa;oBAAE,OAAO,KAAK,CAAC;gBACnE,UAAU,CAAC,QAAQ,CAAC,CAAC;YACvB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,UAAU,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACP,eAAe;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC/D,IAAI,CAAC;QACH,OAAO,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,OAAO,GAAG,aAAa,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,IAAI,CAAC;QACH,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,UAAU,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAG,GAAQ,OAAO,CAAC,GAAG,EAAE,OAAO,GAAuB,cAAc,EAAE;IAC1G,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAwB,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9J,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACnC,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,6GAA6G;AAC7G,SAAS,iBAAiB,CAAC,KAAyB,EAAE,OAAe,EAAE,GAAW;IAChF,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,CAAC;IAC/B,OAAO,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,IAAI,GAAG,GAAG,OAAO,CAAC,EAAE,GAAG,gBAAgB,CAAC,CAAC;AAChG,CAAC;AAeD,KAAK,UAAU,aAAa,CAAC,MAAqB,EAAE,OAAe;IACjE,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACH,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,CAAC;QACH,SAAS,CAAC,EAAE,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,cAAc,WAAW,KAAK,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;QAC3F,OAAO,MAAM,UAAU,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtC,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAgC;IACxE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,cAAc,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC3L,8FAA8F;QAC9F,IAAI,SAAS,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,IAAI,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QACzI,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO;YAAE,OAAO,KAAK,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,aAAa,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAClF,MAAM,OAAO,GAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC3J,MAAM,IAAI,GAAgB,EAAE,GAAG,CAAC,CAAC,MAAM,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC;QAChG,MAAM,aAAa,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QAC3E,OAAO,IAAI,CAAC;IACd,CAAC;YAAS,CAAC;QACT,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAqBD;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,KAAsB;IAC/C,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IAC1D,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,IAAI,CAAC;IACrC,MAAM,KAAK,GAAG,CAAC,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,SAAS,IAAI,mBAAmB,CAAC;IACrE,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC/D,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,2GAA2G;IAC3G,MAAM,OAAO,GAAG,KAAK,IAAI,UAAU,KAAK,QAAQ,IAAI,WAAW,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1G,MAAM,WAAW,GAAG,KAAK,IAAI,OAAO,CAAC;IAErC,MAAM,OAAO,GAAG,KAAK,EAAE,OAAO,CAAC;IAC/B,IAAI,OAAO,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;IAC5G,CAAC;IACD,qEAAqE;IACrE,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAClG,IAAI,KAAK,EAAE,YAAY,KAAK,SAAS,IAAI,GAAG,GAAG,KAAK,CAAC,YAAY,GAAG,kBAAkB;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;IAEhJ,MAAM,IAAI,GAAG,+BAA+B,OAAO,MAAM,MAAM,GAAG,CAAC;IACnE,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,UAAU,YAAY,oBAAoB,EAAE,EAAE,CAAC;IAC3J,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,oBAAoB,MAAM,CAAC,OAAO,GAAG,EAAE,EAAE,CAAC;IAC9I,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,8BAA8B,MAAM,CAAC,OAAO,WAAW,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC;IAC/K,IAAI,UAAU,KAAK,KAAK;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC;IACzF,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,oGAAoG,EAAE,EAAE,CAAC;IACpN,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;QACzD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,iCAAiC,OAAO,CAAC,KAAK,IAAI,gBAAgB,8BAA8B,EAAE,EAAE,CAAC;IACtL,CAAC;IACD,uEAAuE;IACvE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC;AAC1D,CAAC;AAED,oHAAoH;AACpH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB,EAAE,OAAyC;IAC9F,MAAM,KAAK,GAAG,CAAC,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IACvG,MAAM,aAAa,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AACvH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,SAAS,CAAC,CAAC;IAC/C,IAAI,CAAC,KAAK,EAAE,OAAO;QAAE,OAAO;IAC5B,MAAM,aAAa,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;AAC7H,CAAC"}
|
package/dist/version.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Kept in sync with package.json by `src/version.test.ts`. */
|
|
2
|
-
export const CLI_VERSION = "1.
|
|
2
|
+
export const CLI_VERSION = "1.14.1";
|
|
3
3
|
export const PACKAGE_NAME = "@meterapp/car-image";
|
|
4
4
|
export const BIN_NAME = "car-image";
|
|
5
5
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@meterapp/car-image",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.1",
|
|
4
4
|
"description": "CLI and MCP server for the Car Image API by Meter: studio-quality, transparent-background vehicle renders for agents, apps and browsers. Login, fetch images in any paint color and make logos, mint signed URLs, decode VINs, build 3D models, request missing vehicles, run diagnostics, configure agents.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Meter <support@carimage.dev> (https://meterapp.co)",
|
|
@@ -44,13 +44,14 @@
|
|
|
44
44
|
},
|
|
45
45
|
"dependencies": {
|
|
46
46
|
"@meterapp/car-image-sdk": "^1.20.0",
|
|
47
|
-
"@modelcontextprotocol/server": "^2.
|
|
48
|
-
"zod": "^4.5
|
|
47
|
+
"@modelcontextprotocol/server": "^2.2.0",
|
|
48
|
+
"zod": "^4.6.5"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
|
-
"@types/node": "^
|
|
52
|
-
"typescript": "
|
|
53
|
-
"
|
|
51
|
+
"@types/node": "^26.6.4",
|
|
52
|
+
"@typescript/native": "npm:typescript@^7.0.2",
|
|
53
|
+
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
54
|
+
"vitest": "^5.0.3"
|
|
54
55
|
},
|
|
55
56
|
"publishConfig": {
|
|
56
57
|
"access": "public"
|