@burmese/install-pet 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 OpenPets
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=check-install-pet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-install-pet.d.ts","sourceRoot":"","sources":["../src/check-install-pet.ts"],"names":[],"mappings":""}
@@ -0,0 +1,32 @@
1
+ import assert from "node:assert/strict";
2
+ import { join } from "node:path";
3
+ import { getOpenPetsUserDataPath, parseArgs, validateCatalog, validatePetId } from "./index.js";
4
+ assert.deepEqual(parseArgs(["pixel-cat"]), { petId: "pixel-cat", help: false });
5
+ assert.equal(parseArgs(["--help"]).help, true);
6
+ assert.equal(validatePetId("pixel-cat"), "pixel-cat");
7
+ assert.throws(() => validatePetId("../bad"));
8
+ assert.throws(() => validatePetId("builtin"));
9
+ assert.equal(getOpenPetsUserDataPath("darwin", {}), join(process.env.HOME || "", "Library", "Application Support", "OpenPets"));
10
+ assert.equal(getOpenPetsUserDataPath("linux", { XDG_CONFIG_HOME: "/tmp/config" }), join("/tmp/config", "OpenPets"));
11
+ assert.equal(getOpenPetsUserDataPath("win32", { APPDATA: "C:\\Users\\me\\AppData\\Roaming" }), join("C:\\Users\\me\\AppData\\Roaming", "OpenPets"));
12
+ assert.equal(getOpenPetsUserDataPath("linux", { OPENPETS_USER_DATA: "/tmp/openpets-test" }), "/tmp/openpets-test");
13
+ assert.deepEqual(validateCatalog({
14
+ version: 2,
15
+ generatedAt: new Date().toISOString(),
16
+ pets: [{
17
+ id: "pixel-cat",
18
+ displayName: "Pixel Cat",
19
+ description: "A JSON avatar pet.",
20
+ preview: "https://openpets.dev/pets/pixel-cat/preview.webp",
21
+ zip: "https://zip.openpets.dev/pets/pixel-cat.zip",
22
+ }],
23
+ }), [{
24
+ id: "pixel-cat",
25
+ displayName: "Pixel Cat",
26
+ description: "A JSON avatar pet.",
27
+ preview: "https://openpets.dev/pets/pixel-cat/preview.webp",
28
+ zip: "https://zip.openpets.dev/pets/pixel-cat.zip",
29
+ }]);
30
+ assert.throws(() => validateCatalog({ version: 2, pets: [{ id: "bad/pet" }] }));
31
+ console.log("install-pet validation passed.");
32
+ //# sourceMappingURL=check-install-pet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-install-pet.js","sourceRoot":"","sources":["../src/check-install-pet.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EAAE,uBAAuB,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhG,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAChF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC/C,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC,CAAC;AACtD,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;AAE9C,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC,CAAC;AAChI,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,OAAO,EAAE,EAAE,eAAe,EAAE,aAAa,EAAE,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC;AACpH,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,iCAAiC,EAAE,CAAC,EAAE,IAAI,CAAC,iCAAiC,EAAE,UAAU,CAAC,CAAC,CAAC;AACpJ,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAAC,OAAO,EAAE,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAC,EAAE,oBAAoB,CAAC,CAAC;AAEnH,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC;IAC/B,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;IACrC,IAAI,EAAE,CAAC;YACL,EAAE,EAAE,WAAW;YACf,WAAW,EAAE,WAAW;YACxB,WAAW,EAAE,oBAAoB;YACjC,OAAO,EAAE,kDAAkD;YAC3D,GAAG,EAAE,6CAA6C;SACnD,CAAC;CACH,CAAC,EAAE,CAAC;QACH,EAAE,EAAE,WAAW;QACf,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE,oBAAoB;QACjC,OAAO,EAAE,kDAAkD;QAC3D,GAAG,EAAE,6CAA6C;KACnD,CAAC,CAAC,CAAC;AACJ,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEhF,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC"}
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env node
2
+ export interface CatalogPet {
3
+ readonly id: string;
4
+ readonly displayName: string;
5
+ readonly description: string;
6
+ readonly preview: string;
7
+ readonly zip: string;
8
+ }
9
+ export interface InstallPetOptions {
10
+ readonly petId: string;
11
+ readonly preferRunningApp?: boolean;
12
+ }
13
+ export interface InstallPetResult {
14
+ readonly petId: string;
15
+ readonly displayName: string;
16
+ readonly via: "app" | "direct";
17
+ }
18
+ export declare function installPet(options: InstallPetOptions): Promise<InstallPetResult>;
19
+ export declare function parseArgs(args: readonly string[]): {
20
+ readonly petId: string;
21
+ readonly help: boolean;
22
+ };
23
+ export declare function getOpenPetsUserDataPath(platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): string;
24
+ export declare function validatePetId(value: string): string;
25
+ export declare function validateCatalog(value: unknown): readonly CatalogPet[];
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AA2CA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,KAAK,GAAG,QAAQ,CAAC;CAChC;AAyCD,wBAAsB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAStF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAIrG;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,kBAAmB,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAKjH;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAKnD;AAkID,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS,UAAU,EAAE,CAIrE"}
package/dist/index.js ADDED
@@ -0,0 +1,661 @@
1
+ #!/usr/bin/env node
2
+ import { createWriteStream, existsSync, readFileSync, realpathSync } from "node:fs";
3
+ import { mkdir, mkdtemp, readFile, readdir, rename, rm, stat, writeFile } from "node:fs/promises";
4
+ import { homedir } from "node:os";
5
+ import { dirname, join, resolve, sep } from "node:path";
6
+ import { pipeline } from "node:stream/promises";
7
+ import { Transform } from "node:stream";
8
+ import { fileURLToPath } from "node:url";
9
+ import { createOpenPetsClient, OpenPetsClientError } from "@burmese/client";
10
+ import { maxJsonAvatarActionBytes, maxJsonAvatarBytes, normalizeJsonAvatarActionFileName, validateJsonAvatarActionCount, validateJsonAvatarActionDefinition, validateJsonAvatarDefinition, } from "@burmese/pet-format";
11
+ import yauzl from "yauzl";
12
+ const catalogUrl = "https://openpets.dev/pets/catalog.v2.json";
13
+ const zipHost = "zip.openpets.dev";
14
+ const maxCatalogBytes = 1_000_000;
15
+ const maxZipDownloadBytes = 50 * 1024 * 1024;
16
+ const maxExtractedTotalBytes = 200 * 1024 * 1024;
17
+ const maxFiles = 500;
18
+ const maxIndividualFileBytes = 100 * 1024 * 1024;
19
+ const maxSvgRenderedPixels = 340;
20
+ const fetchTimeoutMs = 30_000;
21
+ const directInstallLockName = ".install-pet.lock";
22
+ const directInstallLockStaleMs = 10 * 60 * 1000;
23
+ const appUnavailableErrorCodes = new Set(["unavailable", "connect_timeout", "connection_closed"]);
24
+ const appTooOldErrorCodes = new Set(["unknown_method", "invalid_version"]);
25
+ const builtInPet = {
26
+ id: "builtin",
27
+ displayName: "Built-in Pet",
28
+ builtIn: true,
29
+ protected: true,
30
+ installed: true,
31
+ };
32
+ export async function installPet(options) {
33
+ const petId = validatePetId(options.petId);
34
+ if (options.preferRunningApp !== false) {
35
+ const appInstall = await tryInstallThroughRunningApp(petId);
36
+ if (appInstall)
37
+ return appInstall;
38
+ }
39
+ return installPetDirectly(petId);
40
+ }
41
+ export function parseArgs(args) {
42
+ if (args.length === 0 || args.includes("--help") || args.includes("-h"))
43
+ return { petId: "", help: true };
44
+ if (args.length !== 1)
45
+ throw new Error("Usage: install-pet <pet-id>");
46
+ return { petId: validatePetId(args[0] ?? ""), help: false };
47
+ }
48
+ export function getOpenPetsUserDataPath(platform = process.platform, env = process.env) {
49
+ if (env.OPENPETS_USER_DATA)
50
+ return env.OPENPETS_USER_DATA;
51
+ if (platform === "darwin")
52
+ return join(homedir(), "Library", "Application Support", "OpenPets");
53
+ if (platform === "win32")
54
+ return join(env.APPDATA || join(homedir(), "AppData", "Roaming"), "OpenPets");
55
+ return join(env.XDG_CONFIG_HOME || join(homedir(), ".config"), "OpenPets");
56
+ }
57
+ export function validatePetId(value) {
58
+ if (!/^[a-z0-9][a-z0-9_-]{0,63}$/.test(value) || value === builtInPet.id) {
59
+ throw new Error(`Invalid OpenPets pet id: ${value}`);
60
+ }
61
+ return value;
62
+ }
63
+ async function main() {
64
+ const parsed = parseArgs(process.argv.slice(2));
65
+ if (parsed.help) {
66
+ printUsage();
67
+ return;
68
+ }
69
+ const result = await installPet({ petId: parsed.petId });
70
+ process.stdout.write(`Installed OpenPets pet: ${result.displayName} (${result.petId})\n`);
71
+ if (result.via === "direct") {
72
+ process.stdout.write("Open or restart OpenPets to use the installed pet.\n");
73
+ }
74
+ }
75
+ async function tryInstallThroughRunningApp(petId) {
76
+ try {
77
+ const result = await createOpenPetsClient({ responseTimeoutMs: 60_000 }).installPet(petId);
78
+ return { petId: result.petId, displayName: result.displayName, via: "app" };
79
+ }
80
+ catch (error) {
81
+ if (error instanceof OpenPetsClientError && appUnavailableErrorCodes.has(error.code))
82
+ return null;
83
+ if (error instanceof OpenPetsClientError && appTooOldErrorCodes.has(error.code)) {
84
+ throw new Error("Your running OpenPets app is too old for CLI pet installs. Quit OpenPets and retry, or update OpenPets.");
85
+ }
86
+ throw error;
87
+ }
88
+ }
89
+ async function installPetDirectly(petId) {
90
+ const userData = getOpenPetsUserDataPath();
91
+ await mkdir(userData, { recursive: true, mode: 0o700 });
92
+ const releaseLock = await acquireDirectInstallLock(userData);
93
+ try {
94
+ const catalogPet = await getCatalogPet(petId);
95
+ const initialState = await readCurrentState(userData);
96
+ if (initialState.pets.installed.some((pet) => pet.id === catalogPet.id))
97
+ throw new Error(`Pet is already installed: ${catalogPet.id}`);
98
+ const zip = await downloadPetZip(catalogPet.zip);
99
+ const petsRoot = join(userData, "pets");
100
+ await mkdir(petsRoot, { recursive: true, mode: 0o700 });
101
+ const finalDir = getInstalledPetDir(petsRoot, petId);
102
+ const tempDir = await mkdtemp(join(petsRoot, `.install-${petId}-`));
103
+ try {
104
+ assertInsideRoot(petsRoot, tempDir);
105
+ await extractPetZip(zip, tempDir);
106
+ await validateExtractedPet(tempDir, catalogPet.id);
107
+ await rm(finalDir, { recursive: true, force: true });
108
+ await rename(tempDir, finalDir);
109
+ }
110
+ catch (error) {
111
+ await rm(tempDir, { recursive: true, force: true });
112
+ throw error;
113
+ }
114
+ await writeInstalledPetState(userData, catalogPet);
115
+ return { petId: catalogPet.id, displayName: catalogPet.displayName, via: "direct" };
116
+ }
117
+ finally {
118
+ await releaseLock();
119
+ }
120
+ }
121
+ async function acquireDirectInstallLock(userData) {
122
+ const lockPath = join(userData, directInstallLockName);
123
+ for (let attempt = 0; attempt < 2; attempt += 1) {
124
+ try {
125
+ await mkdir(lockPath, { mode: 0o700 });
126
+ await writeFile(join(lockPath, "owner.json"), `${JSON.stringify({ pid: process.pid, createdAt: Date.now(), command: "install-pet" })}\n`, "utf8");
127
+ return async () => {
128
+ await rm(lockPath, { recursive: true, force: true }).catch(() => undefined);
129
+ };
130
+ }
131
+ catch (error) {
132
+ const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
133
+ if (code !== "EEXIST")
134
+ throw error;
135
+ if (await isStaleInstallLock(lockPath)) {
136
+ await rm(lockPath, { recursive: true, force: true });
137
+ continue;
138
+ }
139
+ throw new Error("Another OpenPets pet install or startup is already in progress.");
140
+ }
141
+ }
142
+ throw new Error("Could not acquire OpenPets install lock.");
143
+ }
144
+ async function isStaleInstallLock(lockPath) {
145
+ try {
146
+ const owner = JSON.parse(await readFile(join(lockPath, "owner.json"), "utf8"));
147
+ if (typeof owner.createdAt === "number" && Date.now() - owner.createdAt > directInstallLockStaleMs)
148
+ return true;
149
+ if (typeof owner.pid === "number" && owner.pid > 0)
150
+ return !isProcessAlive(owner.pid);
151
+ }
152
+ catch {
153
+ // Fall back to mtime for old/partial locks.
154
+ }
155
+ try {
156
+ return Date.now() - (await stat(lockPath)).mtimeMs > directInstallLockStaleMs;
157
+ }
158
+ catch {
159
+ return true;
160
+ }
161
+ }
162
+ function isProcessAlive(pid) {
163
+ try {
164
+ process.kill(pid, 0);
165
+ return true;
166
+ }
167
+ catch (error) {
168
+ const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
169
+ return code === "EPERM";
170
+ }
171
+ }
172
+ async function getCatalogPet(petId) {
173
+ const catalog = await fetchCatalog();
174
+ const pet = catalog.find((candidate) => candidate.id === petId);
175
+ if (!pet)
176
+ throw new Error(`Pet is not available in the OpenPets catalog: ${petId}`);
177
+ return pet;
178
+ }
179
+ async function fetchCatalog() {
180
+ const controller = new AbortController();
181
+ const timeout = setTimeout(() => controller.abort(), fetchTimeoutMs);
182
+ try {
183
+ const response = await fetch(catalogUrl, { signal: controller.signal, redirect: "error", credentials: "omit" });
184
+ if (response.url !== catalogUrl)
185
+ throw new Error("Catalog final URL is not allowed.");
186
+ if (!response.ok)
187
+ throw new Error(`Catalog download failed with HTTP ${response.status}.`);
188
+ return validateCatalog(JSON.parse(await readLimitedTextResponse(response, maxCatalogBytes)));
189
+ }
190
+ finally {
191
+ clearTimeout(timeout);
192
+ }
193
+ }
194
+ export function validateCatalog(value) {
195
+ if (!isRecord(value) || value.version !== 2 || !Array.isArray(value.pets))
196
+ throw new Error("OpenPets catalog is invalid.");
197
+ const ids = new Set();
198
+ return value.pets.map((pet) => validateCatalogPet(pet, ids));
199
+ }
200
+ function validateCatalogPet(value, ids) {
201
+ if (!isRecord(value))
202
+ throw new Error("Catalog pet is invalid.");
203
+ const id = validatePetId(readString(value.id, "id", 64));
204
+ if (ids.has(id))
205
+ throw new Error(`Duplicate catalog pet id: ${id}`);
206
+ ids.add(id);
207
+ return {
208
+ id,
209
+ displayName: readString(value.displayName, "displayName", 120),
210
+ description: readString(value.description, "description", 500),
211
+ preview: validateCatalogUrl(value.preview, "preview"),
212
+ zip: validateCatalogUrl(value.zip, "zip"),
213
+ };
214
+ }
215
+ function validateCatalogUrl(value, field) {
216
+ const raw = readString(value, field, 2048);
217
+ const url = new URL(raw);
218
+ if (url.protocol !== "https:" || url.username || url.password || url.port)
219
+ throw new Error(`${field} URL is invalid.`);
220
+ if (field === "preview" && (url.hostname !== "openpets.dev" || !url.pathname.startsWith("/pets/")))
221
+ throw new Error("Preview URL host/path is not allowed.");
222
+ if (field === "zip" && (url.hostname !== zipHost || !url.pathname.startsWith("/pets/")))
223
+ throw new Error("Zip URL host/path is not allowed.");
224
+ return url.toString();
225
+ }
226
+ async function downloadPetZip(zipUrl) {
227
+ validateCatalogUrl(zipUrl, "zip");
228
+ const controller = new AbortController();
229
+ const timeout = setTimeout(() => controller.abort(), fetchTimeoutMs);
230
+ try {
231
+ const response = await fetch(zipUrl, { signal: controller.signal, redirect: "error", credentials: "omit" });
232
+ if (response.url !== zipUrl)
233
+ throw new Error("Zip download final URL changed.");
234
+ if (!response.ok)
235
+ throw new Error(`Zip download failed with HTTP ${response.status}.`);
236
+ const buffer = await readLimitedBinaryResponse(response, maxZipDownloadBytes);
237
+ if (!hasSupportedZipMagic(buffer))
238
+ throw new Error("Downloaded file has an unsupported zip signature.");
239
+ return buffer;
240
+ }
241
+ finally {
242
+ clearTimeout(timeout);
243
+ }
244
+ }
245
+ async function readLimitedTextResponse(response, maxBytes) {
246
+ return new TextDecoder().decode(await readLimitedBinaryResponse(response, maxBytes));
247
+ }
248
+ async function readLimitedBinaryResponse(response, maxBytes) {
249
+ const reader = response.body?.getReader();
250
+ if (!reader)
251
+ throw new Error("Response body is unavailable.");
252
+ const chunks = [];
253
+ let total = 0;
254
+ while (true) {
255
+ const { done, value } = await reader.read();
256
+ if (done)
257
+ break;
258
+ total += value.byteLength;
259
+ if (total > maxBytes)
260
+ throw new Error("Download is too large.");
261
+ chunks.push(value);
262
+ }
263
+ return Buffer.concat(chunks, total);
264
+ }
265
+ async function extractPetZip(zip, tempDir) {
266
+ const zipFile = await openZipFromBuffer(zip);
267
+ const seen = new Set();
268
+ const pathTracker = new ZipEntryPathTracker();
269
+ let fileCount = 0;
270
+ let extractedTotal = 0;
271
+ try {
272
+ await new Promise((resolvePromise, rejectPromise) => {
273
+ let settled = false;
274
+ const reject = (error) => {
275
+ if (settled)
276
+ return;
277
+ settled = true;
278
+ zipFile.close();
279
+ rejectPromise(error instanceof Error ? error : new Error("Zip extraction failed."));
280
+ };
281
+ zipFile.on("error", reject);
282
+ zipFile.on("end", () => {
283
+ if (settled)
284
+ return;
285
+ settled = true;
286
+ resolvePromise();
287
+ });
288
+ zipFile.on("entry", (entry) => {
289
+ void processEntry(entry).then(() => {
290
+ if (!settled)
291
+ zipFile.readEntry();
292
+ }).catch(reject);
293
+ });
294
+ const processEntry = async (entry) => {
295
+ validateEntryMetadata(entry);
296
+ const safePath = pathTracker.accept(entry.fileName);
297
+ if (safePath.isDirectory)
298
+ return;
299
+ if (!safePath.relativeOutputPath)
300
+ throw new Error("Zip file entry is missing an output path.");
301
+ fileCount += 1;
302
+ if (fileCount > maxFiles)
303
+ throw new Error("Zip contains too many files.");
304
+ extractedTotal += entry.uncompressedSize;
305
+ if (extractedTotal > maxExtractedTotalBytes)
306
+ throw new Error("Zip extracted total is too large.");
307
+ const outputPath = resolve(tempDir, safePath.relativeOutputPath);
308
+ assertOutputPathInside(tempDir, outputPath);
309
+ seen.add(safePath.relativeOutputPath);
310
+ await mkdir(dirname(outputPath), { recursive: true, mode: 0o700 });
311
+ await writeEntry(entry, zipFile, outputPath, entry.uncompressedSize);
312
+ };
313
+ zipFile.readEntry();
314
+ });
315
+ }
316
+ finally {
317
+ zipFile.close();
318
+ }
319
+ if (!seen.has("pet.json"))
320
+ throw new Error("Zip must contain pet.json.");
321
+ }
322
+ function openZipFromBuffer(buffer) {
323
+ return new Promise((resolvePromise, rejectPromise) => {
324
+ yauzl.fromBuffer(buffer, { lazyEntries: true, validateEntrySizes: true, strictFileNames: true }, (error, zipFile) => {
325
+ if (error)
326
+ rejectPromise(error);
327
+ else if (!zipFile)
328
+ rejectPromise(new Error("Zip file could not be opened."));
329
+ else
330
+ resolvePromise(zipFile);
331
+ });
332
+ });
333
+ }
334
+ function validateEntryMetadata(entry) {
335
+ if (entry.isEncrypted())
336
+ throw new Error("Encrypted zip entries are not supported.");
337
+ if (entry.compressionMethod !== 0 && entry.compressionMethod !== 8)
338
+ throw new Error("Unsupported zip entry compression method.");
339
+ if (entry.compressedSize > maxZipDownloadBytes)
340
+ throw new Error("Zip entry compressed size is too large.");
341
+ if (entry.uncompressedSize > maxIndividualFileBytes)
342
+ throw new Error("Zip entry uncompressed size is too large.");
343
+ const unixMode = (entry.versionMadeBy >> 8) === 3 ? (entry.externalFileAttributes >> 16) & 0o177777 : null;
344
+ if (unixMode === null)
345
+ return;
346
+ const type = unixMode & 0o170000;
347
+ if (type !== 0 && type !== 0o100000 && type !== 0o040000)
348
+ throw new Error("Zip entry special files are not supported.");
349
+ }
350
+ function writeEntry(entry, zipFile, outputPath, expectedBytes) {
351
+ return new Promise((resolvePromise, rejectPromise) => {
352
+ zipFile.openReadStream(entry, (error, readStream) => {
353
+ if (error) {
354
+ rejectPromise(error);
355
+ return;
356
+ }
357
+ if (!readStream) {
358
+ rejectPromise(new Error("Zip entry stream could not be opened."));
359
+ return;
360
+ }
361
+ let actualBytes = 0;
362
+ const counter = new Transform({
363
+ transform(chunk, _encoding, callback) {
364
+ actualBytes += chunk.byteLength;
365
+ if (actualBytes > maxIndividualFileBytes)
366
+ callback(new Error("Zip entry exceeded individual size limit."));
367
+ else
368
+ callback(null, chunk);
369
+ },
370
+ });
371
+ pipeline(readStream, counter, createWriteStream(outputPath, { mode: 0o600 }))
372
+ .then(() => {
373
+ if (actualBytes !== expectedBytes)
374
+ rejectPromise(new Error("Zip entry extracted size did not match metadata."));
375
+ else
376
+ resolvePromise();
377
+ })
378
+ .catch(rejectPromise);
379
+ });
380
+ });
381
+ }
382
+ async function validateExtractedPet(tempDir, expectedPetId) {
383
+ const petJsonPath = join(tempDir, "pet.json");
384
+ assertOutputPathInside(tempDir, petJsonPath);
385
+ const metadata = JSON.parse(await readFile(petJsonPath, "utf8"));
386
+ validatePetPackageMetadata(metadata, expectedPetId);
387
+ if (isJsonAvatarPetMetadata(metadata)) {
388
+ await validateJsonAvatarPetFiles(tempDir, metadata);
389
+ return;
390
+ }
391
+ if (isSvgPetMetadata(metadata)) {
392
+ await validateSvgPetFiles(tempDir, metadata);
393
+ return;
394
+ }
395
+ }
396
+ function validatePetPackageMetadata(value, expectedPetId) {
397
+ if (!isRecord(value))
398
+ throw new Error("pet.json must be an object.");
399
+ if (value.id !== expectedPetId || typeof value.id !== "string")
400
+ throw new Error("Pet package id does not match the requested pet.");
401
+ validatePetId(value.id);
402
+ if (value.renderer === "json-avatar")
403
+ return;
404
+ if (value.renderer === "svg") {
405
+ normalizePetAssetPath(value.svgPath ?? "svg", "svgPath", false);
406
+ validateSvgDimension(value.width, "width");
407
+ validateSvgDimension(value.height, "height");
408
+ return;
409
+ }
410
+ throw new Error("Pet package renderer must be json-avatar or svg.");
411
+ }
412
+ function validateSvgDimension(value, label) {
413
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 1 || value > maxSvgRenderedPixels) {
414
+ throw new Error(`Pet package ${label} must be an integer between 1 and ${maxSvgRenderedPixels}.`);
415
+ }
416
+ }
417
+ async function readCurrentState(userData) {
418
+ const statePath = join(userData, "openpets-state.json");
419
+ return normalizeState(existsSync(statePath) ? JSON.parse(await readFile(statePath, "utf8")) : undefined, userData);
420
+ }
421
+ async function writeInstalledPetState(userData, catalogPet) {
422
+ const statePath = join(userData, "openpets-state.json");
423
+ const current = await readCurrentState(userData);
424
+ if (current.pets.installed.some((pet) => pet.id === catalogPet.id))
425
+ throw new Error(`Pet is already installed: ${catalogPet.id}`);
426
+ const next = {
427
+ ...current,
428
+ pets: {
429
+ installed: [
430
+ ...current.pets.installed,
431
+ {
432
+ id: catalogPet.id,
433
+ displayName: catalogPet.displayName,
434
+ description: catalogPet.description,
435
+ builtIn: false,
436
+ protected: false,
437
+ installed: true,
438
+ source: { kind: "catalog", catalogVersion: 2, zip: catalogPet.zip, preview: catalogPet.preview },
439
+ },
440
+ ],
441
+ },
442
+ };
443
+ await mkdir(dirname(statePath), { recursive: true, mode: 0o700 });
444
+ const tempPath = `${statePath}.${process.pid}.tmp`;
445
+ await writeFile(tempPath, `${JSON.stringify(next, null, 2)}\n`, "utf8");
446
+ await rename(tempPath, statePath);
447
+ }
448
+ function normalizeState(value, userData) {
449
+ const record = isRecord(value) ? value : {};
450
+ const preferences = isRecord(record.preferences) ? record.preferences : {};
451
+ const petsRecord = isRecord(record.pets) ? record.pets : {};
452
+ const installed = Array.isArray(petsRecord.installed)
453
+ ? petsRecord.installed.map((pet) => normalizeInstalledPet(pet, userData)).filter((pet) => Boolean(pet && pet.id !== builtInPet.id))
454
+ : [];
455
+ const defaultPetId = typeof preferences.defaultPetId === "string" && [builtInPet, ...installed].some((pet) => pet.id === preferences.defaultPetId) ? preferences.defaultPetId : builtInPet.id;
456
+ return {
457
+ version: 1,
458
+ preferences: {
459
+ defaultPetId,
460
+ openDefaultPetOnLaunch: typeof preferences.openDefaultPetOnLaunch === "boolean" ? preferences.openDefaultPetOnLaunch : true,
461
+ speechBubblesEnabled: true,
462
+ petScale: typeof preferences.petScale === "number" ? preferences.petScale : 1,
463
+ onboardingCompleted: typeof preferences.onboardingCompleted === "boolean" ? preferences.onboardingCompleted : false,
464
+ claudeCommandPath: typeof preferences.claudeCommandPath === "string" ? preferences.claudeCommandPath : undefined,
465
+ opencodeCommandPath: typeof preferences.opencodeCommandPath === "string" ? preferences.opencodeCommandPath : undefined,
466
+ },
467
+ pets: { installed: [builtInPet, ...installed] },
468
+ defaultPet: isRecord(record.defaultPet) ? record.defaultPet : {},
469
+ };
470
+ }
471
+ function normalizeInstalledPet(value, userData) {
472
+ if (!isRecord(value) || typeof value.id !== "string" || typeof value.displayName !== "string")
473
+ return null;
474
+ try {
475
+ validatePetId(value.id);
476
+ }
477
+ catch {
478
+ return null;
479
+ }
480
+ const petDir = getInstalledPetDir(join(userData, "pets"), value.id);
481
+ const missingFiles = installedPetFilesMissing(petDir);
482
+ return {
483
+ id: value.id,
484
+ displayName: value.displayName,
485
+ description: typeof value.description === "string" ? value.description : undefined,
486
+ builtIn: false,
487
+ protected: false,
488
+ installed: true,
489
+ source: isRecord(value.source) && value.source.catalogVersion === 2 && typeof value.source.zip === "string" && typeof value.source.preview === "string"
490
+ ? { kind: "catalog", catalogVersion: 2, zip: value.source.zip, preview: value.source.preview }
491
+ : undefined,
492
+ broken: missingFiles ? true : typeof value.broken === "boolean" ? value.broken : undefined,
493
+ brokenReason: missingFiles ? "Installed pet files are missing." : typeof value.brokenReason === "string" ? value.brokenReason : undefined,
494
+ };
495
+ }
496
+ function installedPetFilesMissing(petDir) {
497
+ const petJsonPath = join(petDir, "pet.json");
498
+ if (!existsSync(petJsonPath))
499
+ return true;
500
+ try {
501
+ const metadata = JSON.parse(readFileSync(petJsonPath, "utf8"));
502
+ if (isJsonAvatarPetMetadata(metadata)) {
503
+ const avatarPath = join(petDir, normalizePetAssetPath(metadata.avatarPath, "avatarPath", true));
504
+ const actionsPath = join(petDir, normalizePetAssetPath(metadata.actionsPath ?? "actions", "actionsPath", false));
505
+ return !existsSync(avatarPath) || !existsSync(actionsPath);
506
+ }
507
+ if (isSvgPetMetadata(metadata)) {
508
+ const svgDir = join(petDir, normalizePetAssetPath(metadata.svgPath ?? "svg", "svgPath", false));
509
+ return !existsSync(svgDir) || !existsSync(join(svgDir, "idle.svg"));
510
+ }
511
+ }
512
+ catch {
513
+ return true;
514
+ }
515
+ return true;
516
+ }
517
+ function isJsonAvatarPetMetadata(value) {
518
+ return isRecord(value) && value.renderer === "json-avatar";
519
+ }
520
+ function isSvgPetMetadata(value) {
521
+ return isRecord(value) && value.renderer === "svg";
522
+ }
523
+ async function validateJsonAvatarPetFiles(tempDir, metadata) {
524
+ const avatarRelativePath = normalizePetAssetPath(metadata.avatarPath, "avatarPath", true);
525
+ const actionsRelativePath = normalizePetAssetPath(metadata.actionsPath ?? "actions", "actionsPath", false);
526
+ const avatarPath = join(tempDir, avatarRelativePath);
527
+ const actionsPath = join(tempDir, actionsRelativePath);
528
+ assertOutputPathInside(tempDir, avatarPath);
529
+ assertOutputPathInside(tempDir, actionsPath);
530
+ const avatar = await stat(avatarPath);
531
+ if (!avatar.isFile())
532
+ throw new Error("avatar.json must be a file.");
533
+ if (avatar.size <= 0)
534
+ throw new Error("avatar.json is empty.");
535
+ if (avatar.size > maxJsonAvatarBytes)
536
+ throw new Error("avatar.json is too large.");
537
+ validateJsonAvatarDefinition(JSON.parse(await readFile(avatarPath, "utf8")));
538
+ const actions = await stat(actionsPath);
539
+ if (!actions.isDirectory())
540
+ throw new Error("JSON avatar actionsPath must be a directory.");
541
+ const actionFileNames = (await readdir(actionsPath, { withFileTypes: true }))
542
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".json"))
543
+ .map((entry) => normalizeJsonAvatarActionFileName(entry.name))
544
+ .sort((left, right) => left.localeCompare(right));
545
+ validateJsonAvatarActionCount(actionFileNames.length);
546
+ for (const actionFileName of actionFileNames) {
547
+ const actionPath = join(actionsPath, actionFileName);
548
+ assertOutputPathInside(tempDir, actionPath);
549
+ const action = await stat(actionPath);
550
+ if (!action.isFile())
551
+ throw new Error("JSON avatar action must be a file.");
552
+ if (action.size <= 0)
553
+ throw new Error("JSON avatar action is empty.");
554
+ if (action.size > maxJsonAvatarActionBytes)
555
+ throw new Error("JSON avatar action is too large.");
556
+ validateJsonAvatarActionDefinition(JSON.parse(await readFile(actionPath, "utf8")), actionFileName.replace(/\.json$/, ""));
557
+ }
558
+ }
559
+ async function validateSvgPetFiles(tempDir, metadata) {
560
+ const svgRelativePath = normalizePetAssetPath(metadata.svgPath ?? "svg", "svgPath", false);
561
+ const svgDir = join(tempDir, svgRelativePath);
562
+ assertOutputPathInside(tempDir, svgDir);
563
+ const dir = await stat(svgDir);
564
+ if (!dir.isDirectory())
565
+ throw new Error("SVG svgPath must be a directory.");
566
+ const svgFileNames = (await readdir(svgDir, { withFileTypes: true }))
567
+ .filter((entry) => entry.isFile() && entry.name.endsWith(".svg"))
568
+ .map((entry) => entry.name);
569
+ if (!svgFileNames.includes("idle.svg"))
570
+ throw new Error("SVG avatar must include svg/idle.svg.");
571
+ for (const svgFileName of svgFileNames) {
572
+ const svgFilePath = join(svgDir, svgFileName);
573
+ assertOutputPathInside(tempDir, svgFilePath);
574
+ const file = await stat(svgFilePath);
575
+ if (!file.isFile())
576
+ throw new Error("SVG avatar file must be a file.");
577
+ if (file.size <= 0)
578
+ throw new Error("SVG avatar file is empty.");
579
+ if (file.size > maxIndividualFileBytes)
580
+ throw new Error("SVG avatar file is too large.");
581
+ }
582
+ }
583
+ function normalizePetAssetPath(value, label, file) {
584
+ if (typeof value !== "string" || value.length === 0 || value.length > 180)
585
+ throw new Error(`${label} is invalid.`);
586
+ if (value.includes("\0") || value.includes("\\") || value.startsWith("/") || value.startsWith("//") || value.includes("//") || /^[a-zA-Z]:\//.test(value))
587
+ throw new Error(`${label} must be a safe relative path.`);
588
+ const parts = value.split("/");
589
+ if (parts.some((part) => !part || part === "." || part === ".." || part.startsWith(".") || !/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/.test(part)))
590
+ throw new Error(`${label} contains an unsafe path segment.`);
591
+ if (file && !value.endsWith(".json"))
592
+ throw new Error(`${label} must end with .json.`);
593
+ if (file && parts.join("/") === "pet.json")
594
+ throw new Error(`${label} cannot be pet.json.`);
595
+ if (!file && (value.endsWith(".json") || value.endsWith(".webp")))
596
+ throw new Error(`${label} must be a directory path.`);
597
+ return parts.join("/");
598
+ }
599
+ class ZipEntryPathTracker {
600
+ seen = new Set();
601
+ accept(rawPath) {
602
+ const normalized = rawPath.replaceAll("\\", "/").replace(/^\/+/, "");
603
+ if (!normalized || normalized.includes("../") || normalized === ".." || /^[a-zA-Z]:/.test(normalized))
604
+ throw new Error(`Unsafe zip path: ${rawPath}`);
605
+ const isDirectory = normalized.endsWith("/");
606
+ const outputPath = isDirectory ? normalized.slice(0, -1) : normalized;
607
+ if (!outputPath || outputPath.split("/").some((part) => !part || part === "." || part === ".."))
608
+ throw new Error(`Unsafe zip path: ${rawPath}`);
609
+ const key = outputPath.toLowerCase();
610
+ if (this.seen.has(key))
611
+ throw new Error(`Duplicate zip entry path: ${outputPath}`);
612
+ this.seen.add(key);
613
+ return isDirectory ? { isDirectory } : { isDirectory, relativeOutputPath: outputPath };
614
+ }
615
+ }
616
+ function getInstalledPetDir(petsRoot, petId) {
617
+ validatePetId(petId);
618
+ const target = resolve(petsRoot, petId);
619
+ assertInsideRoot(petsRoot, target);
620
+ return target;
621
+ }
622
+ function assertInsideRoot(root, target) {
623
+ const resolvedRoot = resolve(root);
624
+ const resolvedTarget = resolve(target);
625
+ if (resolvedTarget !== resolvedRoot && !resolvedTarget.startsWith(`${resolvedRoot}${sep}`))
626
+ throw new Error("Resolved path escapes OpenPets directory.");
627
+ }
628
+ function assertOutputPathInside(root, target) {
629
+ assertInsideRoot(root, target);
630
+ }
631
+ function hasSupportedZipMagic(buffer) {
632
+ return buffer.length >= 4 && buffer[0] === 0x50 && buffer[1] === 0x4b && (buffer[2] === 0x03 || buffer[2] === 0x05 || buffer[2] === 0x07) && (buffer[3] === 0x04 || buffer[3] === 0x06 || buffer[3] === 0x08);
633
+ }
634
+ function readString(value, field, maxLength) {
635
+ if (typeof value !== "string" || value.length < 1 || value.length > maxLength)
636
+ throw new Error(`Catalog pet ${field} is invalid.`);
637
+ return value;
638
+ }
639
+ function isRecord(value) {
640
+ return typeof value === "object" && value !== null;
641
+ }
642
+ function printUsage() {
643
+ process.stdout.write("Usage:\n install-pet <pet-id>\n\nInstalls a pet from the OpenPets gallery into your local OpenPets app data.\nExample:\n npx -y install-pet pixel-cat\n");
644
+ }
645
+ if (isMainModule()) {
646
+ main().catch((error) => {
647
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
648
+ process.exitCode = 1;
649
+ });
650
+ }
651
+ function isMainModule() {
652
+ if (!process.argv[1])
653
+ return false;
654
+ try {
655
+ return realpathSync(resolve(process.argv[1])) === realpathSync(fileURLToPath(import.meta.url));
656
+ }
657
+ catch {
658
+ return resolve(process.argv[1]) === fileURLToPath(import.meta.url);
659
+ }
660
+ }
661
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@burmese/install-pet",
3
+ "version": "3.1.0",
4
+ "license": "MIT",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/wannabeepolymath/pet-assistant.git",
8
+ "directory": "packages/install-pet"
9
+ },
10
+ "type": "module",
11
+ "main": "dist/index.js",
12
+ "types": "dist/index.d.ts",
13
+ "bin": {
14
+ "install-pet": "dist/index.js"
15
+ },
16
+ "files": [
17
+ "dist"
18
+ ],
19
+ "publishConfig": {
20
+ "access": "public"
21
+ },
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "default": "./dist/index.js"
26
+ }
27
+ },
28
+ "dependencies": {
29
+ "yauzl": "3.3.0",
30
+ "@burmese/client": "3.1.0",
31
+ "@burmese/pet-format": "3.1.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/node": "^25.6.2",
35
+ "@types/yauzl": "2.10.3",
36
+ "typescript": "^6.0.3"
37
+ },
38
+ "scripts": {
39
+ "test": "node dist/check-install-pet.js",
40
+ "check": "pnpm typecheck && pnpm build && pnpm test",
41
+ "build:deps": "pnpm --filter \"install-pet^...\" build",
42
+ "typecheck": "pnpm build:deps && tsc --noEmit",
43
+ "build": "pnpm build:deps && tsc"
44
+ }
45
+ }