@howaboua/pi-pet 0.1.3 → 0.1.5

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/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @howaboua/pi-pet
2
2
 
3
+ ## 0.1.5
4
+
5
+ - Pi Pet desktop now requires Node 22.12 or newer.
6
+
7
+ ## 0.1.4
8
+
9
+ - Remove obsolete test-only helper exports without changing tool behavior.
10
+
3
11
  ## 0.1.3
4
12
 
5
13
  - Expose Pi Pet's extension from the package root so aggregate extension packages can load it.
package/README.md CHANGED
@@ -41,7 +41,7 @@ For another device, give it an SSH alias and confirm key-based access once outsi
41
41
  ssh desktop true
42
42
  ```
43
43
 
44
- The remote device needs npm and Node 22 or newer; runtime extraction uses PowerShell on Windows and standard `unzip` on macOS/Linux. Attach it from Pi:
44
+ The remote device needs npm and Node 22.12 or newer; runtime extraction uses PowerShell on Windows and standard `unzip` on macOS/Linux. Attach it from Pi:
45
45
 
46
46
  ```text
47
47
  /pet attach desktop
@@ -6,181 +6,52 @@
6
6
  "": {
7
7
  "name": "@howaboua/pi-pet-desktop-source",
8
8
  "devDependencies": {
9
- "electron": "41.0.2",
9
+ "electron": "41.10.7",
10
10
  "typescript": "^6.0.3"
11
11
  },
12
12
  "engines": {
13
- "node": ">=22"
13
+ "node": ">=22.12.0"
14
+ }
15
+ },
16
+ "node_modules/@electron-internal/extract-zip": {
17
+ "version": "1.0.5",
18
+ "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.5.tgz",
19
+ "integrity": "sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==",
20
+ "dev": true,
21
+ "license": "BSD-2-Clause",
22
+ "engines": {
23
+ "node": ">=22.12.0"
14
24
  }
15
25
  },
16
26
  "node_modules/@electron/get": {
17
- "version": "2.0.3",
18
- "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz",
19
- "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==",
27
+ "version": "5.1.0",
28
+ "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.1.0.tgz",
29
+ "integrity": "sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==",
20
30
  "dev": true,
21
31
  "license": "MIT",
22
32
  "dependencies": {
23
33
  "debug": "^4.1.1",
24
- "env-paths": "^2.2.0",
25
- "fs-extra": "^8.1.0",
26
- "got": "^11.8.5",
34
+ "env-paths": "^3.0.0",
35
+ "graceful-fs": "^4.2.11",
27
36
  "progress": "^2.0.3",
28
- "semver": "^6.2.0",
37
+ "semver": "^7.6.3",
29
38
  "sumchecker": "^3.0.1"
30
39
  },
31
40
  "engines": {
32
- "node": ">=12"
41
+ "node": ">=22.12.0"
33
42
  },
34
43
  "optionalDependencies": {
35
- "global-agent": "^3.0.0"
36
- }
37
- },
38
- "node_modules/@sindresorhus/is": {
39
- "version": "4.6.0",
40
- "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
41
- "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
42
- "dev": true,
43
- "license": "MIT",
44
- "engines": {
45
- "node": ">=10"
46
- },
47
- "funding": {
48
- "url": "https://github.com/sindresorhus/is?sponsor=1"
49
- }
50
- },
51
- "node_modules/@szmarczak/http-timer": {
52
- "version": "4.0.6",
53
- "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
54
- "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
55
- "dev": true,
56
- "license": "MIT",
57
- "dependencies": {
58
- "defer-to-connect": "^2.0.0"
59
- },
60
- "engines": {
61
- "node": ">=10"
62
- }
63
- },
64
- "node_modules/@types/cacheable-request": {
65
- "version": "6.0.3",
66
- "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
67
- "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
68
- "dev": true,
69
- "license": "MIT",
70
- "dependencies": {
71
- "@types/http-cache-semantics": "*",
72
- "@types/keyv": "^3.1.4",
73
- "@types/node": "*",
74
- "@types/responselike": "^1.0.0"
75
- }
76
- },
77
- "node_modules/@types/http-cache-semantics": {
78
- "version": "4.2.0",
79
- "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
80
- "integrity": "sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==",
81
- "dev": true,
82
- "license": "MIT"
83
- },
84
- "node_modules/@types/keyv": {
85
- "version": "3.1.4",
86
- "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
87
- "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
88
- "dev": true,
89
- "license": "MIT",
90
- "dependencies": {
91
- "@types/node": "*"
44
+ "undici": "^7.24.4"
92
45
  }
93
46
  },
94
47
  "node_modules/@types/node": {
95
- "version": "24.13.3",
96
- "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz",
97
- "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==",
98
- "dev": true,
99
- "license": "MIT",
100
- "dependencies": {
101
- "undici-types": "~7.18.0"
102
- }
103
- },
104
- "node_modules/@types/responselike": {
105
- "version": "1.0.3",
106
- "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
107
- "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
108
- "dev": true,
109
- "license": "MIT",
110
- "dependencies": {
111
- "@types/node": "*"
112
- }
113
- },
114
- "node_modules/@types/yauzl": {
115
- "version": "2.10.3",
116
- "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
117
- "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
48
+ "version": "24.19.2",
49
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-24.19.2.tgz",
50
+ "integrity": "sha512-93d49wCWJkCyN87MxLpNN6KXPCwFw7bVUg79mGUV1OS40JGWwVCr8n61DXCSqz7CV6/VfPkb7xec7uP2M+QHWQ==",
118
51
  "dev": true,
119
52
  "license": "MIT",
120
- "optional": true,
121
53
  "dependencies": {
122
- "@types/node": "*"
123
- }
124
- },
125
- "node_modules/boolean": {
126
- "version": "3.2.0",
127
- "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz",
128
- "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==",
129
- "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.",
130
- "dev": true,
131
- "license": "MIT",
132
- "optional": true
133
- },
134
- "node_modules/buffer-crc32": {
135
- "version": "0.2.13",
136
- "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
137
- "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
138
- "dev": true,
139
- "license": "MIT",
140
- "engines": {
141
- "node": "*"
142
- }
143
- },
144
- "node_modules/cacheable-lookup": {
145
- "version": "5.0.4",
146
- "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
147
- "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
148
- "dev": true,
149
- "license": "MIT",
150
- "engines": {
151
- "node": ">=10.6.0"
152
- }
153
- },
154
- "node_modules/cacheable-request": {
155
- "version": "7.0.4",
156
- "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
157
- "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
158
- "dev": true,
159
- "license": "MIT",
160
- "dependencies": {
161
- "clone-response": "^1.0.2",
162
- "get-stream": "^5.1.0",
163
- "http-cache-semantics": "^4.0.0",
164
- "keyv": "^4.0.0",
165
- "lowercase-keys": "^2.0.0",
166
- "normalize-url": "^6.0.1",
167
- "responselike": "^2.0.0"
168
- },
169
- "engines": {
170
- "node": ">=8"
171
- }
172
- },
173
- "node_modules/clone-response": {
174
- "version": "1.0.3",
175
- "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
176
- "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
177
- "dev": true,
178
- "license": "MIT",
179
- "dependencies": {
180
- "mimic-response": "^1.0.0"
181
- },
182
- "funding": {
183
- "url": "https://github.com/sponsors/sindresorhus"
54
+ "undici-types": ">=7.24.0 <7.24.7"
184
55
  }
185
56
  },
186
57
  "node_modules/debug": {
@@ -201,325 +72,36 @@
201
72
  }
202
73
  }
203
74
  },
204
- "node_modules/decompress-response": {
205
- "version": "6.0.0",
206
- "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
207
- "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
208
- "dev": true,
209
- "license": "MIT",
210
- "dependencies": {
211
- "mimic-response": "^3.1.0"
212
- },
213
- "engines": {
214
- "node": ">=10"
215
- },
216
- "funding": {
217
- "url": "https://github.com/sponsors/sindresorhus"
218
- }
219
- },
220
- "node_modules/decompress-response/node_modules/mimic-response": {
221
- "version": "3.1.0",
222
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
223
- "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
224
- "dev": true,
225
- "license": "MIT",
226
- "engines": {
227
- "node": ">=10"
228
- },
229
- "funding": {
230
- "url": "https://github.com/sponsors/sindresorhus"
231
- }
232
- },
233
- "node_modules/defer-to-connect": {
234
- "version": "2.0.1",
235
- "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
236
- "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
237
- "dev": true,
238
- "license": "MIT",
239
- "engines": {
240
- "node": ">=10"
241
- }
242
- },
243
- "node_modules/define-data-property": {
244
- "version": "1.1.4",
245
- "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
246
- "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
247
- "dev": true,
248
- "license": "MIT",
249
- "optional": true,
250
- "dependencies": {
251
- "es-define-property": "^1.0.0",
252
- "es-errors": "^1.3.0",
253
- "gopd": "^1.0.1"
254
- },
255
- "engines": {
256
- "node": ">= 0.4"
257
- },
258
- "funding": {
259
- "url": "https://github.com/sponsors/ljharb"
260
- }
261
- },
262
- "node_modules/define-properties": {
263
- "version": "1.2.1",
264
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
265
- "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
266
- "dev": true,
267
- "license": "MIT",
268
- "optional": true,
269
- "dependencies": {
270
- "define-data-property": "^1.0.1",
271
- "has-property-descriptors": "^1.0.0",
272
- "object-keys": "^1.1.1"
273
- },
274
- "engines": {
275
- "node": ">= 0.4"
276
- },
277
- "funding": {
278
- "url": "https://github.com/sponsors/ljharb"
279
- }
280
- },
281
- "node_modules/detect-node": {
282
- "version": "2.1.0",
283
- "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
284
- "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
285
- "dev": true,
286
- "license": "MIT",
287
- "optional": true
288
- },
289
75
  "node_modules/electron": {
290
- "version": "41.0.2",
291
- "resolved": "https://registry.npmjs.org/electron/-/electron-41.0.2.tgz",
292
- "integrity": "sha512-raotm/aO8kOs1jD8SI8ssJ7EKciQOY295AOOprl1TxW7B0At8m5Ae7qNU1xdMxofiHMR8cNEGi9PKD3U+yT/mA==",
76
+ "version": "41.10.7",
77
+ "resolved": "https://registry.npmjs.org/electron/-/electron-41.10.7.tgz",
78
+ "integrity": "sha512-AqIiefddlf5i+HYCGatr8VlBuEbWJpad4/yloBFYcMB2r57j7xhW1ogiJ+BfA5kxQyfmSs5yjwy54Me+wJn1jw==",
293
79
  "dev": true,
294
80
  "hasInstallScript": true,
295
81
  "license": "MIT",
296
82
  "dependencies": {
297
- "@electron/get": "^2.0.0",
298
- "@types/node": "^24.9.0",
299
- "extract-zip": "^2.0.1"
83
+ "@electron-internal/extract-zip": "^1.0.1",
84
+ "@electron/get": "^5.0.0",
85
+ "@types/node": "^24.9.0"
300
86
  },
301
87
  "bin": {
302
88
  "electron": "cli.js"
303
89
  },
304
90
  "engines": {
305
- "node": ">= 12.20.55"
306
- }
307
- },
308
- "node_modules/end-of-stream": {
309
- "version": "1.4.5",
310
- "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz",
311
- "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==",
312
- "dev": true,
313
- "license": "MIT",
314
- "dependencies": {
315
- "once": "^1.4.0"
91
+ "node": ">= 22.12.0"
316
92
  }
317
93
  },
318
94
  "node_modules/env-paths": {
319
- "version": "2.2.1",
320
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
321
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
322
- "dev": true,
323
- "license": "MIT",
324
- "engines": {
325
- "node": ">=6"
326
- }
327
- },
328
- "node_modules/es-define-property": {
329
- "version": "1.0.1",
330
- "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
331
- "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
332
- "dev": true,
333
- "license": "MIT",
334
- "optional": true,
335
- "engines": {
336
- "node": ">= 0.4"
337
- }
338
- },
339
- "node_modules/es-errors": {
340
- "version": "1.3.0",
341
- "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
342
- "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
343
- "dev": true,
344
- "license": "MIT",
345
- "optional": true,
346
- "engines": {
347
- "node": ">= 0.4"
348
- }
349
- },
350
- "node_modules/es6-error": {
351
- "version": "4.1.1",
352
- "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
353
- "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
354
- "dev": true,
355
- "license": "MIT",
356
- "optional": true
357
- },
358
- "node_modules/escape-string-regexp": {
359
- "version": "4.0.0",
360
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
361
- "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
362
- "dev": true,
363
- "license": "MIT",
364
- "optional": true,
365
- "engines": {
366
- "node": ">=10"
367
- },
368
- "funding": {
369
- "url": "https://github.com/sponsors/sindresorhus"
370
- }
371
- },
372
- "node_modules/extract-zip": {
373
- "version": "2.0.1",
374
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
375
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
376
- "dev": true,
377
- "license": "BSD-2-Clause",
378
- "dependencies": {
379
- "debug": "^4.1.1",
380
- "get-stream": "^5.1.0",
381
- "yauzl": "^2.10.0"
382
- },
383
- "bin": {
384
- "extract-zip": "cli.js"
385
- },
386
- "engines": {
387
- "node": ">= 10.17.0"
388
- },
389
- "optionalDependencies": {
390
- "@types/yauzl": "^2.9.1"
391
- }
392
- },
393
- "node_modules/fd-slicer": {
394
- "version": "1.1.0",
395
- "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
396
- "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
397
- "dev": true,
398
- "license": "MIT",
399
- "dependencies": {
400
- "pend": "~1.2.0"
401
- }
402
- },
403
- "node_modules/fs-extra": {
404
- "version": "8.1.0",
405
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
406
- "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
407
- "dev": true,
408
- "license": "MIT",
409
- "dependencies": {
410
- "graceful-fs": "^4.2.0",
411
- "jsonfile": "^4.0.0",
412
- "universalify": "^0.1.0"
413
- },
414
- "engines": {
415
- "node": ">=6 <7 || >=8"
416
- }
417
- },
418
- "node_modules/get-stream": {
419
- "version": "5.2.0",
420
- "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
421
- "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
422
- "dev": true,
423
- "license": "MIT",
424
- "dependencies": {
425
- "pump": "^3.0.0"
426
- },
427
- "engines": {
428
- "node": ">=8"
429
- },
430
- "funding": {
431
- "url": "https://github.com/sponsors/sindresorhus"
432
- }
433
- },
434
- "node_modules/global-agent": {
435
95
  "version": "3.0.0",
436
- "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz",
437
- "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==",
438
- "dev": true,
439
- "license": "BSD-3-Clause",
440
- "optional": true,
441
- "dependencies": {
442
- "boolean": "^3.0.1",
443
- "es6-error": "^4.1.1",
444
- "matcher": "^3.0.0",
445
- "roarr": "^2.15.3",
446
- "semver": "^7.3.2",
447
- "serialize-error": "^7.0.1"
448
- },
449
- "engines": {
450
- "node": ">=10.0"
451
- }
452
- },
453
- "node_modules/global-agent/node_modules/semver": {
454
- "version": "7.8.5",
455
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
456
- "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
457
- "dev": true,
458
- "license": "ISC",
459
- "optional": true,
460
- "bin": {
461
- "semver": "bin/semver.js"
462
- },
463
- "engines": {
464
- "node": ">=10"
465
- }
466
- },
467
- "node_modules/globalthis": {
468
- "version": "1.0.4",
469
- "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
470
- "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
96
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz",
97
+ "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==",
471
98
  "dev": true,
472
99
  "license": "MIT",
473
- "optional": true,
474
- "dependencies": {
475
- "define-properties": "^1.2.1",
476
- "gopd": "^1.0.1"
477
- },
478
100
  "engines": {
479
- "node": ">= 0.4"
101
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
480
102
  },
481
103
  "funding": {
482
- "url": "https://github.com/sponsors/ljharb"
483
- }
484
- },
485
- "node_modules/gopd": {
486
- "version": "1.2.0",
487
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
488
- "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
489
- "dev": true,
490
- "license": "MIT",
491
- "optional": true,
492
- "engines": {
493
- "node": ">= 0.4"
494
- },
495
- "funding": {
496
- "url": "https://github.com/sponsors/ljharb"
497
- }
498
- },
499
- "node_modules/got": {
500
- "version": "11.8.6",
501
- "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
502
- "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
503
- "dev": true,
504
- "license": "MIT",
505
- "dependencies": {
506
- "@sindresorhus/is": "^4.0.0",
507
- "@szmarczak/http-timer": "^4.0.5",
508
- "@types/cacheable-request": "^6.0.1",
509
- "@types/responselike": "^1.0.0",
510
- "cacheable-lookup": "^5.0.3",
511
- "cacheable-request": "^7.0.2",
512
- "decompress-response": "^6.0.0",
513
- "http2-wrapper": "^1.0.0-beta.5.2",
514
- "lowercase-keys": "^2.0.0",
515
- "p-cancelable": "^2.0.0",
516
- "responselike": "^2.0.0"
517
- },
518
- "engines": {
519
- "node": ">=10.19.0"
520
- },
521
- "funding": {
522
- "url": "https://github.com/sindresorhus/got?sponsor=1"
104
+ "url": "https://github.com/sponsors/sindresorhus"
523
105
  }
524
106
  },
525
107
  "node_modules/graceful-fs": {
@@ -529,110 +111,6 @@
529
111
  "dev": true,
530
112
  "license": "ISC"
531
113
  },
532
- "node_modules/has-property-descriptors": {
533
- "version": "1.0.2",
534
- "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
535
- "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
536
- "dev": true,
537
- "license": "MIT",
538
- "optional": true,
539
- "dependencies": {
540
- "es-define-property": "^1.0.0"
541
- },
542
- "funding": {
543
- "url": "https://github.com/sponsors/ljharb"
544
- }
545
- },
546
- "node_modules/http-cache-semantics": {
547
- "version": "4.2.0",
548
- "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz",
549
- "integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
550
- "dev": true,
551
- "license": "BSD-2-Clause"
552
- },
553
- "node_modules/http2-wrapper": {
554
- "version": "1.0.3",
555
- "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
556
- "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
557
- "dev": true,
558
- "license": "MIT",
559
- "dependencies": {
560
- "quick-lru": "^5.1.1",
561
- "resolve-alpn": "^1.0.0"
562
- },
563
- "engines": {
564
- "node": ">=10.19.0"
565
- }
566
- },
567
- "node_modules/json-buffer": {
568
- "version": "3.0.1",
569
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
570
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
571
- "dev": true,
572
- "license": "MIT"
573
- },
574
- "node_modules/json-stringify-safe": {
575
- "version": "5.0.1",
576
- "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
577
- "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==",
578
- "dev": true,
579
- "license": "ISC",
580
- "optional": true
581
- },
582
- "node_modules/jsonfile": {
583
- "version": "4.0.0",
584
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
585
- "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==",
586
- "dev": true,
587
- "license": "MIT",
588
- "optionalDependencies": {
589
- "graceful-fs": "^4.1.6"
590
- }
591
- },
592
- "node_modules/keyv": {
593
- "version": "4.5.4",
594
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
595
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
596
- "dev": true,
597
- "license": "MIT",
598
- "dependencies": {
599
- "json-buffer": "3.0.1"
600
- }
601
- },
602
- "node_modules/lowercase-keys": {
603
- "version": "2.0.0",
604
- "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
605
- "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
606
- "dev": true,
607
- "license": "MIT",
608
- "engines": {
609
- "node": ">=8"
610
- }
611
- },
612
- "node_modules/matcher": {
613
- "version": "3.0.0",
614
- "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz",
615
- "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==",
616
- "dev": true,
617
- "license": "MIT",
618
- "optional": true,
619
- "dependencies": {
620
- "escape-string-regexp": "^4.0.0"
621
- },
622
- "engines": {
623
- "node": ">=10"
624
- }
625
- },
626
- "node_modules/mimic-response": {
627
- "version": "1.0.1",
628
- "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
629
- "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
630
- "dev": true,
631
- "license": "MIT",
632
- "engines": {
633
- "node": ">=4"
634
- }
635
- },
636
114
  "node_modules/ms": {
637
115
  "version": "2.1.3",
638
116
  "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -640,57 +118,6 @@
640
118
  "dev": true,
641
119
  "license": "MIT"
642
120
  },
643
- "node_modules/normalize-url": {
644
- "version": "6.1.0",
645
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
646
- "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
647
- "dev": true,
648
- "license": "MIT",
649
- "engines": {
650
- "node": ">=10"
651
- },
652
- "funding": {
653
- "url": "https://github.com/sponsors/sindresorhus"
654
- }
655
- },
656
- "node_modules/object-keys": {
657
- "version": "1.1.1",
658
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
659
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
660
- "dev": true,
661
- "license": "MIT",
662
- "optional": true,
663
- "engines": {
664
- "node": ">= 0.4"
665
- }
666
- },
667
- "node_modules/once": {
668
- "version": "1.4.0",
669
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
670
- "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
671
- "dev": true,
672
- "license": "ISC",
673
- "dependencies": {
674
- "wrappy": "1"
675
- }
676
- },
677
- "node_modules/p-cancelable": {
678
- "version": "2.1.1",
679
- "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
680
- "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
681
- "dev": true,
682
- "license": "MIT",
683
- "engines": {
684
- "node": ">=8"
685
- }
686
- },
687
- "node_modules/pend": {
688
- "version": "1.2.0",
689
- "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
690
- "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
691
- "dev": true,
692
- "license": "MIT"
693
- },
694
121
  "node_modules/progress": {
695
122
  "version": "2.0.3",
696
123
  "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
@@ -701,112 +128,19 @@
701
128
  "node": ">=0.4.0"
702
129
  }
703
130
  },
704
- "node_modules/pump": {
705
- "version": "3.0.4",
706
- "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz",
707
- "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==",
708
- "dev": true,
709
- "license": "MIT",
710
- "dependencies": {
711
- "end-of-stream": "^1.1.0",
712
- "once": "^1.3.1"
713
- }
714
- },
715
- "node_modules/quick-lru": {
716
- "version": "5.1.1",
717
- "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
718
- "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
719
- "dev": true,
720
- "license": "MIT",
721
- "engines": {
722
- "node": ">=10"
723
- },
724
- "funding": {
725
- "url": "https://github.com/sponsors/sindresorhus"
726
- }
727
- },
728
- "node_modules/resolve-alpn": {
729
- "version": "1.2.1",
730
- "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
731
- "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
732
- "dev": true,
733
- "license": "MIT"
734
- },
735
- "node_modules/responselike": {
736
- "version": "2.0.1",
737
- "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
738
- "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
739
- "dev": true,
740
- "license": "MIT",
741
- "dependencies": {
742
- "lowercase-keys": "^2.0.0"
743
- },
744
- "funding": {
745
- "url": "https://github.com/sponsors/sindresorhus"
746
- }
747
- },
748
- "node_modules/roarr": {
749
- "version": "2.15.4",
750
- "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz",
751
- "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==",
752
- "dev": true,
753
- "license": "BSD-3-Clause",
754
- "optional": true,
755
- "dependencies": {
756
- "boolean": "^3.0.1",
757
- "detect-node": "^2.0.4",
758
- "globalthis": "^1.0.1",
759
- "json-stringify-safe": "^5.0.1",
760
- "semver-compare": "^1.0.0",
761
- "sprintf-js": "^1.1.2"
762
- },
763
- "engines": {
764
- "node": ">=8.0"
765
- }
766
- },
767
131
  "node_modules/semver": {
768
- "version": "6.3.1",
769
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
770
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
132
+ "version": "7.8.5",
133
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
134
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
771
135
  "dev": true,
772
136
  "license": "ISC",
773
137
  "bin": {
774
138
  "semver": "bin/semver.js"
775
- }
776
- },
777
- "node_modules/semver-compare": {
778
- "version": "1.0.0",
779
- "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
780
- "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
781
- "dev": true,
782
- "license": "MIT",
783
- "optional": true
784
- },
785
- "node_modules/serialize-error": {
786
- "version": "7.0.1",
787
- "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz",
788
- "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==",
789
- "dev": true,
790
- "license": "MIT",
791
- "optional": true,
792
- "dependencies": {
793
- "type-fest": "^0.13.1"
794
139
  },
795
140
  "engines": {
796
141
  "node": ">=10"
797
- },
798
- "funding": {
799
- "url": "https://github.com/sponsors/sindresorhus"
800
142
  }
801
143
  },
802
- "node_modules/sprintf-js": {
803
- "version": "1.1.3",
804
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
805
- "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==",
806
- "dev": true,
807
- "license": "BSD-3-Clause",
808
- "optional": true
809
- },
810
144
  "node_modules/sumchecker": {
811
145
  "version": "3.0.1",
812
146
  "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz",
@@ -820,20 +154,6 @@
820
154
  "node": ">= 8.0"
821
155
  }
822
156
  },
823
- "node_modules/type-fest": {
824
- "version": "0.13.1",
825
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz",
826
- "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==",
827
- "dev": true,
828
- "license": "(MIT OR CC0-1.0)",
829
- "optional": true,
830
- "engines": {
831
- "node": ">=10"
832
- },
833
- "funding": {
834
- "url": "https://github.com/sponsors/sindresorhus"
835
- }
836
- },
837
157
  "node_modules/typescript": {
838
158
  "version": "6.0.3",
839
159
  "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
@@ -848,40 +168,23 @@
848
168
  "node": ">=14.17"
849
169
  }
850
170
  },
851
- "node_modules/undici-types": {
852
- "version": "7.18.2",
853
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
854
- "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
855
- "dev": true,
856
- "license": "MIT"
857
- },
858
- "node_modules/universalify": {
859
- "version": "0.1.2",
860
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
861
- "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
171
+ "node_modules/undici": {
172
+ "version": "7.30.0",
173
+ "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.0.tgz",
174
+ "integrity": "sha512-dkrQXeHSaoamnItlYbmzG0wFYrM0ZwDxCIg0A7aKjTyyhh9svRzCNFEzV+Vm05/yehjCzjDZ31KXfGEjYSztDQ==",
862
175
  "dev": true,
863
176
  "license": "MIT",
177
+ "optional": true,
864
178
  "engines": {
865
- "node": ">= 4.0.0"
179
+ "node": ">=20.18.1"
866
180
  }
867
181
  },
868
- "node_modules/wrappy": {
869
- "version": "1.0.2",
870
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
871
- "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
872
- "dev": true,
873
- "license": "ISC"
874
- },
875
- "node_modules/yauzl": {
876
- "version": "2.10.0",
877
- "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
878
- "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
182
+ "node_modules/undici-types": {
183
+ "version": "7.24.6",
184
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz",
185
+ "integrity": "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==",
879
186
  "dev": true,
880
- "license": "MIT",
881
- "dependencies": {
882
- "buffer-crc32": "~0.2.3",
883
- "fd-slicer": "~1.1.0"
884
- }
187
+ "license": "MIT"
885
188
  }
886
189
  }
887
190
  }
@@ -7,10 +7,10 @@
7
7
  "start": "electron dist/app"
8
8
  },
9
9
  "devDependencies": {
10
- "electron": "41.0.2",
10
+ "electron": "41.10.7",
11
11
  "typescript": "^6.0.3"
12
12
  },
13
13
  "engines": {
14
- "node": ">=22"
14
+ "node": ">=22.12.0"
15
15
  }
16
16
  }
@@ -1,3 +1,3 @@
1
- import{join as Ee}from"node:path";import{fileURLToPath as be}from"node:url";import{randomUUID as ce}from"node:crypto";import{copyFileSync as Ue,lstatSync as fe,mkdirSync as Le,readFileSync as Fe,statSync as Ve}from"node:fs";import{cp as ue,mkdir as de,readFile as pe,rename as we,rm as me,stat as ge,writeFile as Je}from"node:fs/promises";import{homedir as _}from"node:os";import{dirname as he,join as m}from"node:path";import{readFile as G,realpath as P,stat as v}from"node:fs/promises";import{join as y,resolve as W,sep as A}from"node:path";import{readFile as T}from"node:fs/promises";function D(e,t,n){if(n<10)return;return{format:"webp",width:1+e.readUIntLE(t+4,3),height:1+e.readUIntLE(t+7,3)}}function U(e,t,n){if(n<10||e[t+3]!==157||e[t+4]!==1||e[t+5]!==42)return;return{format:"webp",width:e.readUInt16LE(t+6)&16383,height:e.readUInt16LE(t+8)&16383}}function L(e,t,n){if(n<5||e[t]!==47)return;let r=e[t+1]??0,o=e[t+2]??0,a=e[t+3]??0,s=e[t+4]??0;return{format:"webp",width:1+((r|o<<8)&16383),height:1+((o>>6|a<<2|s<<10)&16383)}}function F(e,t,n,r){if(t==="VP8X")return D(e,n,r);if(t==="VP8 ")return U(e,n,r);if(t==="VP8L")return L(e,n,r);return}function V(e){if(e.length<30||e.toString("ascii",0,4)!=="RIFF"||e.toString("ascii",8,12)!=="WEBP")return;let t=12;while(t+8<=e.length){let n=e.toString("ascii",t,t+4),r=e.readUInt32LE(t+4),o=t+8;if(o+r>e.length)throw Error("Truncated WebP chunk.");let a=F(e,n,o,r);if(a)return a;t=o+r+r%2}throw Error("WebP dimensions were not found.")}function z(e){if(e.length>=24&&e.subarray(0,8).toString("hex")==="89504e470d0a1a0a")return{format:"png",width:e.readUInt32BE(16),height:e.readUInt32BE(20)};let n=V(e);if(n)return n;throw Error("Asset must be a PNG or WebP image.")}async function N(e){return z(await T(e))}var J=/^[a-z0-9][a-z0-9._-]{0,63}$/,B=new Set(["__proto__","constructor"]),u=Object.freeze({actionName:64,noteText:280,manifestBytes:131072,catalogBytes:262144,assetBytes:16777216,frameCount:64,decodedPixels:16000000});class i extends Error{name="ContractError"}function M(e,t,n){if(typeof e!=="string")throw new i(`${t} must be a string.`);let r=e.trim();if(!r)throw new i(`${t} cannot be empty.`);if(r.length>n)throw new i(`${t} exceeds ${n} characters.`);return r}function d(e,t="action"){let n=M(e,t,u.actionName);if(n==="list")throw new i(`${t} cannot use the reserved pet_show discovery name list.`);if(B.has(n))throw new i(`${t} cannot use a reserved object property name.`);if(!J.test(n))throw new i(`${t} must use lowercase letters, numbers, dots, underscores, or hyphens.`);return n}function b(e){if(!e||e.includes("\x00")||e.includes("\\")||e.startsWith("/"))return!1;return e.split("/").every((n)=>n!==""&&n!=="."&&n!=="..")}var p={width:192,height:208},H=[["idle",0,[280,110,110,140,140,320]],["running-right",1,[120,120,120,120,120,120,120,220]],["running-left",2,[120,120,120,120,120,120,120,220]],["waving",3,[140,140,140,280]],["jumping",4,[140,140,140,140,280]],["failed",5,[140,140,140,140,140,140,140,240]],["waiting",6,[150,150,150,150,150,260]],["running",7,[120,120,120,120,120,220]],["review",8,[150,150,150,150,150,280]]],X=Object.freeze({active:"running",error:"failed",hello:"waving",settled:"review",success:"jumping",thinking:"running",working:"running"});function w(e,t){if(!e||typeof e!=="object"||Array.isArray(e))throw new i(`${t} must be an object.`);return e}function h(e,t,n,r){if(!Number.isInteger(e)||e<n||e>r)throw new i(`${t} must be an integer from ${n} to ${r}.`);return e}async function O(e,t){let n=await v(e);if(!n.isFile()||n.size>t)throw new i(`${e} is not a bounded regular file.`);return JSON.parse(await G(e,"utf8"))}function Y(e,t){return t.map((n,r)=>({x:r*p.width,y:e*p.height,width:p.width,height:p.height,durationMs:n}))}function q(e){let t=w(e,"pet.json"),n=new Set(["id","displayName","description","spriteVersionNumber","spritesheetPath"]);for(let s of Object.keys(t))if(!n.has(s))throw new i(`pet.json has unknown field: ${s}.`);let r=d(t.id,"pet id");if(typeof t.displayName!=="string"||!t.displayName.trim()||t.displayName.length>80)throw new i("pet.json displayName must contain 1-80 characters.");if(typeof t.description!=="string"||!t.description.trim()||t.description.length>280)throw new i("pet.json description must contain 1-280 characters.");if(t.spriteVersionNumber!==2)throw new i("Only Codex spriteVersionNumber 2 is supported.");if(typeof t.spritesheetPath!=="string"||!b(t.spritesheetPath))throw new i("pet.json spritesheetPath must be a safe relative path.");let o={},a={};for(let[s,f,c]of H)o[s]={name:s,asset:t.spritesheetPath,frames:Y(f,c),loop:!0};for(let s=0;s<16;s+=1){let f=s*22.5,c=`look-${String(f).padStart(3,"0").replace(".5","_5")}`,E=s<8?9:10,l=s%8;a[c]={name:c,asset:t.spritesheetPath,frames:[{x:l*p.width,y:E*p.height,...p,durationMs:1000}],loop:!0}}return{schemaVersion:1,id:r,displayName:t.displayName.trim(),description:t.description.trim(),defaultAction:"idle",canvas:{...p},actions:o,aliases:{...X},directions:a}}function K(e,t){let n=w(t,`action ${e}`),r=new Set(["asset","frames","loop","next"]);for(let s of Object.keys(n))if(!r.has(s))throw new i(`action ${e} has unknown field: ${s}.`);if(typeof n.asset!=="string"||!b(n.asset))throw new i(`action ${e} asset must be a safe relative path.`);if(!Array.isArray(n.frames)||n.frames.length===0||n.frames.length>u.frameCount)throw new i(`action ${e} must have 1-${u.frameCount} frames.`);let o=n.frames.map((s,f)=>{let c=w(s,`action ${e} frame ${f}`),E=new Set(["x","y","width","height","durationMs"]);for(let k of Object.keys(c))if(!E.has(k))throw new i(`action ${e} frame ${f} has unknown field: ${k}.`);let l=h(c.width,"frame width",1,4096),x=h(c.height,"frame height",1,4096);if(l*x>u.decodedPixels)throw new i(`action ${e} frame ${f} is too large.`);return{x:h(c.x,"frame x",0,32768),y:h(c.y,"frame y",0,32768),width:l,height:x,durationMs:h(c.durationMs,"frame durationMs",16,60000)}});if(typeof n.loop!=="boolean")throw new i(`action ${e} loop must be a boolean.`);let a={name:e,asset:n.asset,frames:o,loop:n.loop};if(n.next!==void 0)a.next=d(n.next,`action ${e} next`);return a}async function Z(e){let t=y(e,"pet.pi.json");try{return w(await O(t,u.manifestBytes),"pet.pi.json")}catch(n){if(n.code==="ENOENT")return;throw n}}function Q(e){let t=new Set(["schemaVersion","defaultAction","actions","aliases"]);for(let n of Object.keys(e))if(!t.has(n))throw new i(`pet.pi.json has unknown field: ${n}.`);if(e.schemaVersion!==1)throw new i("pet.pi.json schemaVersion must be 1.")}function ee(e,t){if(e===void 0)return;for(let[n,r]of Object.entries(w(e,"pet.pi.json actions"))){let o=d(n,"action name");t.actions[o]=K(o,r),delete t.aliases[o]}}function te(e,t){if(e===void 0)return;for(let[n,r]of Object.entries(w(e,"pet.pi.json aliases"))){let o=d(n,"alias name");if(t.actions[o])throw new i(`Alias ${o} conflicts with an action of the same name.`);t.aliases[o]=d(r,`alias ${o} target`)}}function ne(e){if(!e.actions[e.defaultAction])throw new i(`Unknown defaultAction: ${e.defaultAction}.`);for(let t of Object.values(e.actions))if(t.next!==void 0&&!e.actions[t.next])throw new i(`Action ${t.name} has unknown next action: ${t.next}.`);for(let[t,n]of Object.entries(e.aliases))if(!e.actions[n])throw new i(`Alias ${t} has unknown target action: ${n}.`)}function re(e){if(Buffer.byteLength(JSON.stringify(e))>u.catalogBytes)throw new i(`Generated pet catalog exceeds ${u.catalogBytes} bytes.`)}async function oe(e,t){let n=await Z(e);if(!n)return;if(Q(n),ee(n.actions,t),te(n.aliases,t),n.defaultAction!==void 0)t.defaultAction=d(n.defaultAction,"defaultAction");ne(t)}async function ie(e,t){let n=await P(y(e,t));if(n!==e&&!n.startsWith(`${e}${A}`))throw new i(`Asset escapes pet directory: ${t}.`);let r=await v(n);if(!r.isFile()||r.size===0||r.size>u.assetBytes)throw new i(`Asset is not a bounded regular file: ${t}.`);let o=await N(n);if(o.width*o.height>u.decodedPixels)throw new i(`Asset has too many decoded pixels: ${t}.`);return o}function se(e,t,n,r){for(let o of t)for(let a of o.frames)if(a.x+a.width>n||a.y+a.height>r)throw new i(`Action ${o.name} has a frame outside ${e}.`)}async function ae(e,t,n){let r=await P(e),o=[...Object.values(t.actions),...Object.values(t.directions)],a=new Set(o.map((s)=>s.asset));for(let s of a){let f=await ie(r,s);if(s===n&&(f.width!==1536||f.height!==2288))throw new i(`Codex v2 spritesheet must be 1536x2288; got ${f.width}x${f.height}.`);se(s,o.filter((c)=>c.asset===s),f.width,f.height)}}async function S(e,t){let n=d(t,"active pet"),r=await P(W(e)),o=await P(y(r,n));if(o!==r&&!o.startsWith(`${r}${A}`))throw new i("Active pet escapes the pets directory.");let a=await O(y(o,"pet.json"),u.manifestBytes),s=q(a);if(s.id!==n)throw new i(`Active pet directory ${n} does not match manifest id ${s.id}.`);await oe(o,s),re(s);let f=w(a,"pet.json").spritesheetPath;return await ae(o,s,f),{directory:o,catalog:s}}var le=16384;function Pe(e=process.env,t=_()){return e.PI_CODING_AGENT_DIR?.trim()||m(t,".pi","agent")}function g(e=process.env,t=_()){return m(Pe(e,t),"pi-pet")}function ye(e){if(!e||typeof e!=="object"||Array.isArray(e))throw Error("Pi Pet config must be an object.");let t=e,n=Object.keys(t).find((r)=>!["schemaVersion","activePet"].includes(r));if(n)throw Error(`Pi Pet config has unknown field: ${n}.`);if(t.schemaVersion!==1)throw Error("Unsupported Pi Pet config schemaVersion.");return{schemaVersion:1,activePet:d(t.activePet,"active pet")}}async function C(e=g()){try{let t=m(e,"config.json"),n=await ge(t);if(!n.isFile()||n.size>le)throw Error(`Pi Pet config must be a bounded regular file: ${t}`);return ye(JSON.parse(await pe(t,"utf8")))}catch(t){if(t.code==="ENOENT")return;throw t}}async function R(e,t,n=g()){let r=d(t,"pet id"),o=m(e,"pets",r),a=m(n,"pets",r),s=!0;try{let c=fe(a);if(!c.isDirectory()||c.isSymbolicLink())throw Error(`User pet path is not a directory: ${a}`)}catch(c){if(c.code!=="ENOENT")throw c;s=!1}if(s)return await S(m(n,"pets"),r),a;await de(he(a),{recursive:!0,mode:448});let f=`${a}.${process.pid}.${ce()}.tmp`;try{return await ue(o,f,{recursive:!0,errorOnExist:!0,force:!1}),await we(f,a),a}catch(c){throw await me(f,{recursive:!0,force:!0}),c}}async function I(e=g()){return(await C(e))?.activePet||"clawa"}var Se=be(new URL("../../",import.meta.url)),j=process.argv[2]||await I(),$e=await R(Se,j);process.stdout.write(`Pet: ${$e}
1
+ import{join as Ee}from"node:path";import{fileURLToPath as be}from"node:url";import{randomUUID as ce}from"node:crypto";import{copyFileSync as Ue,lstatSync as fe,mkdirSync as Le,readFileSync as Fe,statSync as Ve}from"node:fs";import{cp as ue,mkdir as de,readFile as pe,rename as we,rm as me,stat as ge,writeFile as Je}from"node:fs/promises";import{homedir as _}from"node:os";import{dirname as he,join as m}from"node:path";import{readFile as G,realpath as P,stat as v}from"node:fs/promises";import{join as y,resolve as W,sep as A}from"node:path";import{readFile as T}from"node:fs/promises";function D(e,t,n){if(n<10)return;return{format:"webp",width:1+e.readUIntLE(t+4,3),height:1+e.readUIntLE(t+7,3)}}function U(e,t,n){if(n<10||e[t+3]!==157||e[t+4]!==1||e[t+5]!==42)return;return{format:"webp",width:e.readUInt16LE(t+6)&16383,height:e.readUInt16LE(t+8)&16383}}function L(e,t,n){if(n<5||e[t]!==47)return;let r=e[t+1]??0,o=e[t+2]??0,a=e[t+3]??0,s=e[t+4]??0;return{format:"webp",width:1+((r|o<<8)&16383),height:1+((o>>6|a<<2|s<<10)&16383)}}function F(e,t,n,r){if(t==="VP8X")return D(e,n,r);if(t==="VP8 ")return U(e,n,r);if(t==="VP8L")return L(e,n,r);return}function V(e){if(e.length<30||e.toString("ascii",0,4)!=="RIFF"||e.toString("ascii",8,12)!=="WEBP")return;let t=12;while(t+8<=e.length){let n=e.toString("ascii",t,t+4),r=e.readUInt32LE(t+4),o=t+8;if(o+r>e.length)throw Error("Truncated WebP chunk.");let a=F(e,n,o,r);if(a)return a;t=o+r+r%2}throw Error("WebP dimensions were not found.")}function z(e){if(e.length>=24&&e.subarray(0,8).toString("hex")==="89504e470d0a1a0a")return{format:"png",width:e.readUInt32BE(16),height:e.readUInt32BE(20)};let n=V(e);if(n)return n;throw Error("Asset must be a PNG or WebP image.")}async function N(e){return z(await T(e))}var J=/^[a-z0-9][a-z0-9._-]{0,63}$/,B=new Set(["__proto__","constructor"]),u=Object.freeze({actionName:64,noteText:280,manifestBytes:131072,catalogBytes:262144,assetBytes:16777216,frameCount:64,decodedPixels:16000000});class i extends Error{name="ContractError"}function M(e,t,n){if(typeof e!=="string")throw new i(`${t} must be a string.`);let r=e.trim();if(!r)throw new i(`${t} cannot be empty.`);if(r.length>n)throw new i(`${t} exceeds ${n} characters.`);return r}function d(e,t="action"){let n=M(e,t,u.actionName);if(n==="list")throw new i(`${t} cannot use the reserved pet_show discovery name list.`);if(B.has(n))throw new i(`${t} cannot use a reserved object property name.`);if(!J.test(n))throw new i(`${t} must use lowercase letters, numbers, dots, underscores, or hyphens.`);return n}function b(e){if(!e||e.includes("\x00")||e.includes("\\")||e.startsWith("/"))return!1;return e.split("/").every((n)=>n!==""&&n!=="."&&n!=="..")}var p={width:192,height:208},H=[["idle",0,[280,110,110,140,140,320]],["running-right",1,[120,120,120,120,120,120,120,220]],["running-left",2,[120,120,120,120,120,120,120,220]],["waving",3,[140,140,140,280]],["jumping",4,[140,140,140,140,280]],["failed",5,[140,140,140,140,140,140,140,240]],["waiting",6,[150,150,150,150,150,260]],["running",7,[120,120,120,120,120,220]],["review",8,[150,150,150,150,150,280]]],X=Object.freeze({active:"running",error:"failed",hello:"waving",settled:"review",success:"jumping",thinking:"running",working:"running"});function w(e,t){if(!e||typeof e!=="object"||Array.isArray(e))throw new i(`${t} must be an object.`);return e}function h(e,t,n,r){if(!Number.isInteger(e)||e<n||e>r)throw new i(`${t} must be an integer from ${n} to ${r}.`);return e}async function O(e,t){let n=await v(e);if(!n.isFile()||n.size>t)throw new i(`${e} is not a bounded regular file.`);return JSON.parse(await G(e,"utf8"))}function Y(e,t){return t.map((n,r)=>({x:r*p.width,y:e*p.height,width:p.width,height:p.height,durationMs:n}))}function q(e){let t=w(e,"pet.json"),n=new Set(["id","displayName","description","spriteVersionNumber","spritesheetPath"]);for(let s of Object.keys(t))if(!n.has(s))throw new i(`pet.json has unknown field: ${s}.`);let r=d(t.id,"pet id");if(typeof t.displayName!=="string"||!t.displayName.trim()||t.displayName.length>80)throw new i("pet.json displayName must contain 1-80 characters.");if(typeof t.description!=="string"||!t.description.trim()||t.description.length>280)throw new i("pet.json description must contain 1-280 characters.");if(t.spriteVersionNumber!==2)throw new i("Only Codex spriteVersionNumber 2 is supported.");if(typeof t.spritesheetPath!=="string"||!b(t.spritesheetPath))throw new i("pet.json spritesheetPath must be a safe relative path.");let o={},a={};for(let[s,f,c]of H)o[s]={name:s,asset:t.spritesheetPath,frames:Y(f,c),loop:!0};for(let s=0;s<16;s+=1){let f=s*22.5,c=`look-${String(f).padStart(3,"0").replace(".5","_5")}`,E=s<8?9:10,l=s%8;a[c]={name:c,asset:t.spritesheetPath,frames:[{x:l*p.width,y:E*p.height,...p,durationMs:1000}],loop:!0}}return{schemaVersion:1,id:r,displayName:t.displayName.trim(),description:t.description.trim(),defaultAction:"idle",canvas:{...p},actions:o,aliases:{...X},directions:a}}function K(e,t){let n=w(t,`action ${e}`),r=new Set(["asset","frames","loop","next"]);for(let s of Object.keys(n))if(!r.has(s))throw new i(`action ${e} has unknown field: ${s}.`);if(typeof n.asset!=="string"||!b(n.asset))throw new i(`action ${e} asset must be a safe relative path.`);if(!Array.isArray(n.frames)||n.frames.length===0||n.frames.length>u.frameCount)throw new i(`action ${e} must have 1-${u.frameCount} frames.`);let o=n.frames.map((s,f)=>{let c=w(s,`action ${e} frame ${f}`),E=new Set(["x","y","width","height","durationMs"]);for(let x of Object.keys(c))if(!E.has(x))throw new i(`action ${e} frame ${f} has unknown field: ${x}.`);let l=h(c.width,"frame width",1,4096),k=h(c.height,"frame height",1,4096);if(l*k>u.decodedPixels)throw new i(`action ${e} frame ${f} is too large.`);return{x:h(c.x,"frame x",0,32768),y:h(c.y,"frame y",0,32768),width:l,height:k,durationMs:h(c.durationMs,"frame durationMs",16,60000)}});if(typeof n.loop!=="boolean")throw new i(`action ${e} loop must be a boolean.`);let a={name:e,asset:n.asset,frames:o,loop:n.loop};if(n.next!==void 0)a.next=d(n.next,`action ${e} next`);return a}async function Z(e){let t=y(e,"pet.pi.json");try{return w(await O(t,u.manifestBytes),"pet.pi.json")}catch(n){if(n.code==="ENOENT")return;throw n}}function Q(e){let t=new Set(["schemaVersion","defaultAction","actions","aliases"]);for(let n of Object.keys(e))if(!t.has(n))throw new i(`pet.pi.json has unknown field: ${n}.`);if(e.schemaVersion!==1)throw new i("pet.pi.json schemaVersion must be 1.")}function ee(e,t){if(e===void 0)return;for(let[n,r]of Object.entries(w(e,"pet.pi.json actions"))){let o=d(n,"action name");t.actions[o]=K(o,r),delete t.aliases[o]}}function te(e,t){if(e===void 0)return;for(let[n,r]of Object.entries(w(e,"pet.pi.json aliases"))){let o=d(n,"alias name");if(t.actions[o])throw new i(`Alias ${o} conflicts with an action of the same name.`);t.aliases[o]=d(r,`alias ${o} target`)}}function ne(e){if(!e.actions[e.defaultAction])throw new i(`Unknown defaultAction: ${e.defaultAction}.`);for(let t of Object.values(e.actions))if(t.next!==void 0&&!e.actions[t.next])throw new i(`Action ${t.name} has unknown next action: ${t.next}.`);for(let[t,n]of Object.entries(e.aliases))if(!e.actions[n])throw new i(`Alias ${t} has unknown target action: ${n}.`)}function re(e){if(Buffer.byteLength(JSON.stringify(e))>u.catalogBytes)throw new i(`Generated pet catalog exceeds ${u.catalogBytes} bytes.`)}async function oe(e,t){let n=await Z(e);if(!n)return;if(Q(n),ee(n.actions,t),te(n.aliases,t),n.defaultAction!==void 0)t.defaultAction=d(n.defaultAction,"defaultAction");ne(t)}async function ie(e,t){let n=await P(y(e,t));if(n!==e&&!n.startsWith(`${e}${A}`))throw new i(`Asset escapes pet directory: ${t}.`);let r=await v(n);if(!r.isFile()||r.size===0||r.size>u.assetBytes)throw new i(`Asset is not a bounded regular file: ${t}.`);let o=await N(n);if(o.width*o.height>u.decodedPixels)throw new i(`Asset has too many decoded pixels: ${t}.`);return o}function se(e,t,n,r){for(let o of t)for(let a of o.frames)if(a.x+a.width>n||a.y+a.height>r)throw new i(`Action ${o.name} has a frame outside ${e}.`)}async function ae(e,t,n){let r=await P(e),o=[...Object.values(t.actions),...Object.values(t.directions)],a=new Set(o.map((s)=>s.asset));for(let s of a){let f=await ie(r,s);if(s===n&&(f.width!==1536||f.height!==2288))throw new i(`Codex v2 spritesheet must be 1536x2288; got ${f.width}x${f.height}.`);se(s,o.filter((c)=>c.asset===s),f.width,f.height)}}async function S(e,t){let n=d(t,"active pet"),r=await P(W(e)),o=await P(y(r,n));if(o!==r&&!o.startsWith(`${r}${A}`))throw new i("Active pet escapes the pets directory.");let a=await O(y(o,"pet.json"),u.manifestBytes),s=q(a);if(s.id!==n)throw new i(`Active pet directory ${n} does not match manifest id ${s.id}.`);await oe(o,s),re(s);let f=w(a,"pet.json").spritesheetPath;return await ae(o,s,f),{directory:o,catalog:s}}var le=16384;function Pe(e=process.env,t=_()){return e.PI_CODING_AGENT_DIR?.trim()||m(t,".pi","agent")}function g(e=process.env,t=_()){return m(Pe(e,t),"pi-pet")}function ye(e){if(!e||typeof e!=="object"||Array.isArray(e))throw Error("Pi Pet config must be an object.");let t=e,n=Object.keys(t).find((r)=>!["schemaVersion","activePet"].includes(r));if(n)throw Error(`Pi Pet config has unknown field: ${n}.`);if(t.schemaVersion!==1)throw Error("Unsupported Pi Pet config schemaVersion.");return{schemaVersion:1,activePet:d(t.activePet,"active pet")}}async function C(e=g()){try{let t=m(e,"config.json"),n=await ge(t);if(!n.isFile()||n.size>le)throw Error(`Pi Pet config must be a bounded regular file: ${t}`);return ye(JSON.parse(await pe(t,"utf8")))}catch(t){if(t.code==="ENOENT")return;throw t}}async function R(e,t,n=g()){let r=d(t,"pet id"),o=m(e,"pets",r),a=m(n,"pets",r),s=!0;try{let c=fe(a);if(!c.isDirectory()||c.isSymbolicLink())throw Error(`User pet path is not a directory: ${a}`)}catch(c){if(c.code!=="ENOENT")throw c;s=!1}if(s)return await S(m(n,"pets"),r),a;await de(he(a),{recursive:!0,mode:448});let f=`${a}.${process.pid}.${ce()}.tmp`;try{return await ue(o,f,{recursive:!0,errorOnExist:!0,force:!1}),await we(f,a),a}catch(c){throw await me(f,{recursive:!0,force:!0}),c}}async function I(e=g()){return(await C(e))?.activePet||"clawa"}var Se=be(new URL("../../",import.meta.url)),j=process.argv[2]||await I(),$e=await R(Se,j);process.stdout.write(`Pet: ${$e}
2
2
  Runs: ${Ee(g(),"runs",j)}
3
3
  `);
@@ -1,2 +1,2 @@
1
- import{basename as we,dirname as me,join as ge,resolve as he}from"node:path";import{readFile as G,realpath as l,stat as v}from"node:fs/promises";import{join as P,resolve as W,sep as A}from"node:path";import{readFile as T}from"node:fs/promises";function D(e,t,n){if(n<10)return;return{format:"webp",width:1+e.readUIntLE(t+4,3),height:1+e.readUIntLE(t+7,3)}}function L(e,t,n){if(n<10||e[t+3]!==157||e[t+4]!==1||e[t+5]!==42)return;return{format:"webp",width:e.readUInt16LE(t+6)&16383,height:e.readUInt16LE(t+8)&16383}}function U(e,t,n){if(n<5||e[t]!==47)return;let r=e[t+1]??0,o=e[t+2]??0,a=e[t+3]??0,s=e[t+4]??0;return{format:"webp",width:1+((r|o<<8)&16383),height:1+((o>>6|a<<2|s<<10)&16383)}}function F(e,t,n,r){if(t==="VP8X")return D(e,n,r);if(t==="VP8 ")return L(e,n,r);if(t==="VP8L")return U(e,n,r);return}function V(e){if(e.length<30||e.toString("ascii",0,4)!=="RIFF"||e.toString("ascii",8,12)!=="WEBP")return;let t=12;while(t+8<=e.length){let n=e.toString("ascii",t,t+4),r=e.readUInt32LE(t+4),o=t+8;if(o+r>e.length)throw Error("Truncated WebP chunk.");let a=F(e,n,o,r);if(a)return a;t=o+r+r%2}throw Error("WebP dimensions were not found.")}function z(e){if(e.length>=24&&e.subarray(0,8).toString("hex")==="89504e470d0a1a0a")return{format:"png",width:e.readUInt32BE(16),height:e.readUInt32BE(20)};let n=V(e);if(n)return n;throw Error("Asset must be a PNG or WebP image.")}async function N(e){return z(await T(e))}var J=/^[a-z0-9][a-z0-9._-]{0,63}$/,B=new Set(["__proto__","constructor"]),d=Object.freeze({actionName:64,noteText:280,manifestBytes:131072,catalogBytes:262144,assetBytes:16777216,frameCount:64,decodedPixels:16000000});class i extends Error{name="ContractError"}function M(e,t,n){if(typeof e!=="string")throw new i(`${t} must be a string.`);let r=e.trim();if(!r)throw new i(`${t} cannot be empty.`);if(r.length>n)throw new i(`${t} exceeds ${n} characters.`);return r}function u(e,t="action"){let n=M(e,t,d.actionName);if(n==="list")throw new i(`${t} cannot use the reserved pet_show discovery name list.`);if(B.has(n))throw new i(`${t} cannot use a reserved object property name.`);if(!J.test(n))throw new i(`${t} must use lowercase letters, numbers, dots, underscores, or hyphens.`);return n}function b(e){if(!e||e.includes("\x00")||e.includes("\\")||e.startsWith("/"))return!1;return e.split("/").every((n)=>n!==""&&n!=="."&&n!=="..")}var p={width:192,height:208},H=[["idle",0,[280,110,110,140,140,320]],["running-right",1,[120,120,120,120,120,120,120,220]],["running-left",2,[120,120,120,120,120,120,120,220]],["waving",3,[140,140,140,280]],["jumping",4,[140,140,140,140,280]],["failed",5,[140,140,140,140,140,140,140,240]],["waiting",6,[150,150,150,150,150,260]],["running",7,[120,120,120,120,120,220]],["review",8,[150,150,150,150,150,280]]],X=Object.freeze({active:"running",error:"failed",hello:"waving",settled:"review",success:"jumping",thinking:"running",working:"running"});function w(e,t){if(!e||typeof e!=="object"||Array.isArray(e))throw new i(`${t} must be an object.`);return e}function m(e,t,n,r){if(!Number.isInteger(e)||e<n||e>r)throw new i(`${t} must be an integer from ${n} to ${r}.`);return e}async function O(e,t){let n=await v(e);if(!n.isFile()||n.size>t)throw new i(`${e} is not a bounded regular file.`);return JSON.parse(await G(e,"utf8"))}function Y(e,t){return t.map((n,r)=>({x:r*p.width,y:e*p.height,width:p.width,height:p.height,durationMs:n}))}function q(e){let t=w(e,"pet.json"),n=new Set(["id","displayName","description","spriteVersionNumber","spritesheetPath"]);for(let s of Object.keys(t))if(!n.has(s))throw new i(`pet.json has unknown field: ${s}.`);let r=u(t.id,"pet id");if(typeof t.displayName!=="string"||!t.displayName.trim()||t.displayName.length>80)throw new i("pet.json displayName must contain 1-80 characters.");if(typeof t.description!=="string"||!t.description.trim()||t.description.length>280)throw new i("pet.json description must contain 1-280 characters.");if(t.spriteVersionNumber!==2)throw new i("Only Codex spriteVersionNumber 2 is supported.");if(typeof t.spritesheetPath!=="string"||!b(t.spritesheetPath))throw new i("pet.json spritesheetPath must be a safe relative path.");let o={},a={};for(let[s,c,f]of H)o[s]={name:s,asset:t.spritesheetPath,frames:Y(c,f),loop:!0};for(let s=0;s<16;s+=1){let c=s*22.5,f=`look-${String(c).padStart(3,"0").replace(".5","_5")}`,E=s<8?9:10,h=s%8;a[f]={name:f,asset:t.spritesheetPath,frames:[{x:h*p.width,y:E*p.height,...p,durationMs:1000}],loop:!0}}return{schemaVersion:1,id:r,displayName:t.displayName.trim(),description:t.description.trim(),defaultAction:"idle",canvas:{...p},actions:o,aliases:{...X},directions:a}}function K(e,t){let n=w(t,`action ${e}`),r=new Set(["asset","frames","loop","next"]);for(let s of Object.keys(n))if(!r.has(s))throw new i(`action ${e} has unknown field: ${s}.`);if(typeof n.asset!=="string"||!b(n.asset))throw new i(`action ${e} asset must be a safe relative path.`);if(!Array.isArray(n.frames)||n.frames.length===0||n.frames.length>d.frameCount)throw new i(`action ${e} must have 1-${d.frameCount} frames.`);let o=n.frames.map((s,c)=>{let f=w(s,`action ${e} frame ${c}`),E=new Set(["x","y","width","height","durationMs"]);for(let k of Object.keys(f))if(!E.has(k))throw new i(`action ${e} frame ${c} has unknown field: ${k}.`);let h=m(f.width,"frame width",1,4096),x=m(f.height,"frame height",1,4096);if(h*x>d.decodedPixels)throw new i(`action ${e} frame ${c} is too large.`);return{x:m(f.x,"frame x",0,32768),y:m(f.y,"frame y",0,32768),width:h,height:x,durationMs:m(f.durationMs,"frame durationMs",16,60000)}});if(typeof n.loop!=="boolean")throw new i(`action ${e} loop must be a boolean.`);let a={name:e,asset:n.asset,frames:o,loop:n.loop};if(n.next!==void 0)a.next=u(n.next,`action ${e} next`);return a}async function Z(e){let t=P(e,"pet.pi.json");try{return w(await O(t,d.manifestBytes),"pet.pi.json")}catch(n){if(n.code==="ENOENT")return;throw n}}function Q(e){let t=new Set(["schemaVersion","defaultAction","actions","aliases"]);for(let n of Object.keys(e))if(!t.has(n))throw new i(`pet.pi.json has unknown field: ${n}.`);if(e.schemaVersion!==1)throw new i("pet.pi.json schemaVersion must be 1.")}function ee(e,t){if(e===void 0)return;for(let[n,r]of Object.entries(w(e,"pet.pi.json actions"))){let o=u(n,"action name");t.actions[o]=K(o,r),delete t.aliases[o]}}function te(e,t){if(e===void 0)return;for(let[n,r]of Object.entries(w(e,"pet.pi.json aliases"))){let o=u(n,"alias name");if(t.actions[o])throw new i(`Alias ${o} conflicts with an action of the same name.`);t.aliases[o]=u(r,`alias ${o} target`)}}function ne(e){if(!e.actions[e.defaultAction])throw new i(`Unknown defaultAction: ${e.defaultAction}.`);for(let t of Object.values(e.actions))if(t.next!==void 0&&!e.actions[t.next])throw new i(`Action ${t.name} has unknown next action: ${t.next}.`);for(let[t,n]of Object.entries(e.aliases))if(!e.actions[n])throw new i(`Alias ${t} has unknown target action: ${n}.`)}function re(e){if(Buffer.byteLength(JSON.stringify(e))>d.catalogBytes)throw new i(`Generated pet catalog exceeds ${d.catalogBytes} bytes.`)}async function oe(e,t){let n=await Z(e);if(!n)return;if(Q(n),ee(n.actions,t),te(n.aliases,t),n.defaultAction!==void 0)t.defaultAction=u(n.defaultAction,"defaultAction");ne(t)}async function ie(e,t){let n=await l(P(e,t));if(n!==e&&!n.startsWith(`${e}${A}`))throw new i(`Asset escapes pet directory: ${t}.`);let r=await v(n);if(!r.isFile()||r.size===0||r.size>d.assetBytes)throw new i(`Asset is not a bounded regular file: ${t}.`);let o=await N(n);if(o.width*o.height>d.decodedPixels)throw new i(`Asset has too many decoded pixels: ${t}.`);return o}function se(e,t,n,r){for(let o of t)for(let a of o.frames)if(a.x+a.width>n||a.y+a.height>r)throw new i(`Action ${o.name} has a frame outside ${e}.`)}async function ae(e,t,n){let r=await l(e),o=[...Object.values(t.actions),...Object.values(t.directions)],a=new Set(o.map((s)=>s.asset));for(let s of a){let c=await ie(r,s);if(s===n&&(c.width!==1536||c.height!==2288))throw new i(`Codex v2 spritesheet must be 1536x2288; got ${c.width}x${c.height}.`);se(s,o.filter((f)=>f.asset===s),c.width,c.height)}}async function y(e,t){let n=u(t,"active pet"),r=await l(W(e)),o=await l(P(r,n));if(o!==r&&!o.startsWith(`${r}${A}`))throw new i("Active pet escapes the pets directory.");let a=await O(P(o,"pet.json"),d.manifestBytes),s=q(a);if(s.id!==n)throw new i(`Active pet directory ${n} does not match manifest id ${s.id}.`);await oe(o,s),re(s);let c=w(a,"pet.json").spritesheetPath;return await ae(o,s,c),{directory:o,catalog:s}}import{cp as _e,mkdir as Ce,readFile as ce,rename as je,rm as Ie,stat as fe,writeFile as Re}from"node:fs/promises";import{homedir as _}from"node:os";import{dirname as Le,join as S}from"node:path";var de=16384;function ue(e=process.env,t=_()){return e.PI_CODING_AGENT_DIR?.trim()||S(t,".pi","agent")}function g(e=process.env,t=_()){return S(ue(e,t),"pi-pet")}function pe(e){if(!e||typeof e!=="object"||Array.isArray(e))throw Error("Pi Pet config must be an object.");let t=e,n=Object.keys(t).find((r)=>!["schemaVersion","activePet"].includes(r));if(n)throw Error(`Pi Pet config has unknown field: ${n}.`);if(t.schemaVersion!==1)throw Error("Unsupported Pi Pet config schemaVersion.");return{schemaVersion:1,activePet:u(t.activePet,"active pet")}}async function C(e=g()){try{let t=S(e,"config.json"),n=await fe(t);if(!n.isFile()||n.size>de)throw Error(`Pi Pet config must be a bounded regular file: ${t}`);return pe(JSON.parse(await ce(t,"utf8")))}catch(t){if(t.code==="ENOENT")return;throw t}}async function j(e=g()){return(await C(e))?.activePet||"clawa"}var le=await j(),I=he(process.argv[2]||ge(g(),"pets",le)),R=await y(me(I),we(I));process.stdout.write(`${R.catalog.displayName}: ${Object.keys(R.catalog.actions).length} actions valid
1
+ import{basename as we,dirname as me,join as ge,resolve as he}from"node:path";import{readFile as G,realpath as l,stat as v}from"node:fs/promises";import{join as P,resolve as W,sep as A}from"node:path";import{readFile as T}from"node:fs/promises";function D(e,t,n){if(n<10)return;return{format:"webp",width:1+e.readUIntLE(t+4,3),height:1+e.readUIntLE(t+7,3)}}function L(e,t,n){if(n<10||e[t+3]!==157||e[t+4]!==1||e[t+5]!==42)return;return{format:"webp",width:e.readUInt16LE(t+6)&16383,height:e.readUInt16LE(t+8)&16383}}function U(e,t,n){if(n<5||e[t]!==47)return;let r=e[t+1]??0,o=e[t+2]??0,a=e[t+3]??0,s=e[t+4]??0;return{format:"webp",width:1+((r|o<<8)&16383),height:1+((o>>6|a<<2|s<<10)&16383)}}function F(e,t,n,r){if(t==="VP8X")return D(e,n,r);if(t==="VP8 ")return L(e,n,r);if(t==="VP8L")return U(e,n,r);return}function V(e){if(e.length<30||e.toString("ascii",0,4)!=="RIFF"||e.toString("ascii",8,12)!=="WEBP")return;let t=12;while(t+8<=e.length){let n=e.toString("ascii",t,t+4),r=e.readUInt32LE(t+4),o=t+8;if(o+r>e.length)throw Error("Truncated WebP chunk.");let a=F(e,n,o,r);if(a)return a;t=o+r+r%2}throw Error("WebP dimensions were not found.")}function z(e){if(e.length>=24&&e.subarray(0,8).toString("hex")==="89504e470d0a1a0a")return{format:"png",width:e.readUInt32BE(16),height:e.readUInt32BE(20)};let n=V(e);if(n)return n;throw Error("Asset must be a PNG or WebP image.")}async function N(e){return z(await T(e))}var J=/^[a-z0-9][a-z0-9._-]{0,63}$/,B=new Set(["__proto__","constructor"]),d=Object.freeze({actionName:64,noteText:280,manifestBytes:131072,catalogBytes:262144,assetBytes:16777216,frameCount:64,decodedPixels:16000000});class i extends Error{name="ContractError"}function M(e,t,n){if(typeof e!=="string")throw new i(`${t} must be a string.`);let r=e.trim();if(!r)throw new i(`${t} cannot be empty.`);if(r.length>n)throw new i(`${t} exceeds ${n} characters.`);return r}function u(e,t="action"){let n=M(e,t,d.actionName);if(n==="list")throw new i(`${t} cannot use the reserved pet_show discovery name list.`);if(B.has(n))throw new i(`${t} cannot use a reserved object property name.`);if(!J.test(n))throw new i(`${t} must use lowercase letters, numbers, dots, underscores, or hyphens.`);return n}function b(e){if(!e||e.includes("\x00")||e.includes("\\")||e.startsWith("/"))return!1;return e.split("/").every((n)=>n!==""&&n!=="."&&n!=="..")}var p={width:192,height:208},H=[["idle",0,[280,110,110,140,140,320]],["running-right",1,[120,120,120,120,120,120,120,220]],["running-left",2,[120,120,120,120,120,120,120,220]],["waving",3,[140,140,140,280]],["jumping",4,[140,140,140,140,280]],["failed",5,[140,140,140,140,140,140,140,240]],["waiting",6,[150,150,150,150,150,260]],["running",7,[120,120,120,120,120,220]],["review",8,[150,150,150,150,150,280]]],X=Object.freeze({active:"running",error:"failed",hello:"waving",settled:"review",success:"jumping",thinking:"running",working:"running"});function w(e,t){if(!e||typeof e!=="object"||Array.isArray(e))throw new i(`${t} must be an object.`);return e}function m(e,t,n,r){if(!Number.isInteger(e)||e<n||e>r)throw new i(`${t} must be an integer from ${n} to ${r}.`);return e}async function O(e,t){let n=await v(e);if(!n.isFile()||n.size>t)throw new i(`${e} is not a bounded regular file.`);return JSON.parse(await G(e,"utf8"))}function Y(e,t){return t.map((n,r)=>({x:r*p.width,y:e*p.height,width:p.width,height:p.height,durationMs:n}))}function q(e){let t=w(e,"pet.json"),n=new Set(["id","displayName","description","spriteVersionNumber","spritesheetPath"]);for(let s of Object.keys(t))if(!n.has(s))throw new i(`pet.json has unknown field: ${s}.`);let r=u(t.id,"pet id");if(typeof t.displayName!=="string"||!t.displayName.trim()||t.displayName.length>80)throw new i("pet.json displayName must contain 1-80 characters.");if(typeof t.description!=="string"||!t.description.trim()||t.description.length>280)throw new i("pet.json description must contain 1-280 characters.");if(t.spriteVersionNumber!==2)throw new i("Only Codex spriteVersionNumber 2 is supported.");if(typeof t.spritesheetPath!=="string"||!b(t.spritesheetPath))throw new i("pet.json spritesheetPath must be a safe relative path.");let o={},a={};for(let[s,c,f]of H)o[s]={name:s,asset:t.spritesheetPath,frames:Y(c,f),loop:!0};for(let s=0;s<16;s+=1){let c=s*22.5,f=`look-${String(c).padStart(3,"0").replace(".5","_5")}`,E=s<8?9:10,h=s%8;a[f]={name:f,asset:t.spritesheetPath,frames:[{x:h*p.width,y:E*p.height,...p,durationMs:1000}],loop:!0}}return{schemaVersion:1,id:r,displayName:t.displayName.trim(),description:t.description.trim(),defaultAction:"idle",canvas:{...p},actions:o,aliases:{...X},directions:a}}function K(e,t){let n=w(t,`action ${e}`),r=new Set(["asset","frames","loop","next"]);for(let s of Object.keys(n))if(!r.has(s))throw new i(`action ${e} has unknown field: ${s}.`);if(typeof n.asset!=="string"||!b(n.asset))throw new i(`action ${e} asset must be a safe relative path.`);if(!Array.isArray(n.frames)||n.frames.length===0||n.frames.length>d.frameCount)throw new i(`action ${e} must have 1-${d.frameCount} frames.`);let o=n.frames.map((s,c)=>{let f=w(s,`action ${e} frame ${c}`),E=new Set(["x","y","width","height","durationMs"]);for(let x of Object.keys(f))if(!E.has(x))throw new i(`action ${e} frame ${c} has unknown field: ${x}.`);let h=m(f.width,"frame width",1,4096),k=m(f.height,"frame height",1,4096);if(h*k>d.decodedPixels)throw new i(`action ${e} frame ${c} is too large.`);return{x:m(f.x,"frame x",0,32768),y:m(f.y,"frame y",0,32768),width:h,height:k,durationMs:m(f.durationMs,"frame durationMs",16,60000)}});if(typeof n.loop!=="boolean")throw new i(`action ${e} loop must be a boolean.`);let a={name:e,asset:n.asset,frames:o,loop:n.loop};if(n.next!==void 0)a.next=u(n.next,`action ${e} next`);return a}async function Z(e){let t=P(e,"pet.pi.json");try{return w(await O(t,d.manifestBytes),"pet.pi.json")}catch(n){if(n.code==="ENOENT")return;throw n}}function Q(e){let t=new Set(["schemaVersion","defaultAction","actions","aliases"]);for(let n of Object.keys(e))if(!t.has(n))throw new i(`pet.pi.json has unknown field: ${n}.`);if(e.schemaVersion!==1)throw new i("pet.pi.json schemaVersion must be 1.")}function ee(e,t){if(e===void 0)return;for(let[n,r]of Object.entries(w(e,"pet.pi.json actions"))){let o=u(n,"action name");t.actions[o]=K(o,r),delete t.aliases[o]}}function te(e,t){if(e===void 0)return;for(let[n,r]of Object.entries(w(e,"pet.pi.json aliases"))){let o=u(n,"alias name");if(t.actions[o])throw new i(`Alias ${o} conflicts with an action of the same name.`);t.aliases[o]=u(r,`alias ${o} target`)}}function ne(e){if(!e.actions[e.defaultAction])throw new i(`Unknown defaultAction: ${e.defaultAction}.`);for(let t of Object.values(e.actions))if(t.next!==void 0&&!e.actions[t.next])throw new i(`Action ${t.name} has unknown next action: ${t.next}.`);for(let[t,n]of Object.entries(e.aliases))if(!e.actions[n])throw new i(`Alias ${t} has unknown target action: ${n}.`)}function re(e){if(Buffer.byteLength(JSON.stringify(e))>d.catalogBytes)throw new i(`Generated pet catalog exceeds ${d.catalogBytes} bytes.`)}async function oe(e,t){let n=await Z(e);if(!n)return;if(Q(n),ee(n.actions,t),te(n.aliases,t),n.defaultAction!==void 0)t.defaultAction=u(n.defaultAction,"defaultAction");ne(t)}async function ie(e,t){let n=await l(P(e,t));if(n!==e&&!n.startsWith(`${e}${A}`))throw new i(`Asset escapes pet directory: ${t}.`);let r=await v(n);if(!r.isFile()||r.size===0||r.size>d.assetBytes)throw new i(`Asset is not a bounded regular file: ${t}.`);let o=await N(n);if(o.width*o.height>d.decodedPixels)throw new i(`Asset has too many decoded pixels: ${t}.`);return o}function se(e,t,n,r){for(let o of t)for(let a of o.frames)if(a.x+a.width>n||a.y+a.height>r)throw new i(`Action ${o.name} has a frame outside ${e}.`)}async function ae(e,t,n){let r=await l(e),o=[...Object.values(t.actions),...Object.values(t.directions)],a=new Set(o.map((s)=>s.asset));for(let s of a){let c=await ie(r,s);if(s===n&&(c.width!==1536||c.height!==2288))throw new i(`Codex v2 spritesheet must be 1536x2288; got ${c.width}x${c.height}.`);se(s,o.filter((f)=>f.asset===s),c.width,c.height)}}async function y(e,t){let n=u(t,"active pet"),r=await l(W(e)),o=await l(P(r,n));if(o!==r&&!o.startsWith(`${r}${A}`))throw new i("Active pet escapes the pets directory.");let a=await O(P(o,"pet.json"),d.manifestBytes),s=q(a);if(s.id!==n)throw new i(`Active pet directory ${n} does not match manifest id ${s.id}.`);await oe(o,s),re(s);let c=w(a,"pet.json").spritesheetPath;return await ae(o,s,c),{directory:o,catalog:s}}import{cp as _e,mkdir as Ce,readFile as ce,rename as je,rm as Ie,stat as fe,writeFile as Re}from"node:fs/promises";import{homedir as _}from"node:os";import{dirname as Le,join as S}from"node:path";var de=16384;function ue(e=process.env,t=_()){return e.PI_CODING_AGENT_DIR?.trim()||S(t,".pi","agent")}function g(e=process.env,t=_()){return S(ue(e,t),"pi-pet")}function pe(e){if(!e||typeof e!=="object"||Array.isArray(e))throw Error("Pi Pet config must be an object.");let t=e,n=Object.keys(t).find((r)=>!["schemaVersion","activePet"].includes(r));if(n)throw Error(`Pi Pet config has unknown field: ${n}.`);if(t.schemaVersion!==1)throw Error("Unsupported Pi Pet config schemaVersion.");return{schemaVersion:1,activePet:u(t.activePet,"active pet")}}async function C(e=g()){try{let t=S(e,"config.json"),n=await fe(t);if(!n.isFile()||n.size>de)throw Error(`Pi Pet config must be a bounded regular file: ${t}`);return pe(JSON.parse(await ce(t,"utf8")))}catch(t){if(t.code==="ENOENT")return;throw t}}async function j(e=g()){return(await C(e))?.activePet||"clawa"}var le=await j(),I=he(process.argv[2]||ge(g(),"pets",le)),R=await y(me(I),we(I));process.stdout.write(`${R.catalog.displayName}: ${Object.keys(R.catalog.actions).length} actions valid
2
2
  `);
@@ -85,7 +85,7 @@ function parseLegacyRegistry(input: Record<string, unknown>): DeviceRegistryConf
85
85
  return { schemaVersion: 1, devices, defaultDevices: Object.keys(devices) };
86
86
  }
87
87
 
88
- export function parseDeviceRegistry(value: unknown): DeviceRegistryConfig {
88
+ function parseDeviceRegistry(value: unknown): DeviceRegistryConfig {
89
89
  if (!value || typeof value !== "object" || Array.isArray(value)) {
90
90
  throw new Error("Pi Pet device registry must be an object.");
91
91
  }
@@ -175,7 +175,7 @@ main()
175
175
  .finally(() => { clearInterval(heartbeat); clearTimeout(stopTimer); });
176
176
  `;
177
177
 
178
- export interface DesktopProcessSpec {
178
+ interface DesktopProcessSpec {
179
179
  program: string;
180
180
  args: string[];
181
181
  source: string;
@@ -197,11 +197,7 @@ function packagedDesktopSource(): { files: Record<string, string>; packageVersio
197
197
  return { files, packageVersion: manifest.version, sourceDigest: digest.digest("hex") };
198
198
  }
199
199
 
200
- export function remoteDesktopProcessSpec(
201
- target: string,
202
- gippityUrl: string,
203
- useSshSourceAddress = false,
204
- ): DesktopProcessSpec {
200
+ function remoteDesktopProcessSpec(target: string, gippityUrl: string, useSshSourceAddress = false): DesktopProcessSpec {
205
201
  const origin = parseDesktopConfig({ schemaVersion: 1, gippityUrl }).gippityUrl;
206
202
  const options = { ...packagedDesktopSource(), gippityUrl: origin, useSshSourceAddress };
207
203
  return {
@@ -211,7 +207,7 @@ export function remoteDesktopProcessSpec(
211
207
  };
212
208
  }
213
209
 
214
- export function localDesktopProcessSpec(gippityUrl: string): DesktopProcessSpec {
210
+ function localDesktopProcessSpec(gippityUrl: string): DesktopProcessSpec {
215
211
  const origin = parseDesktopConfig({ schemaVersion: 1, gippityUrl }).gippityUrl;
216
212
  const agentDirectory = process.env["PI_CODING_AGENT_DIR"]?.trim() || join(homedir(), ".pi", "agent");
217
213
  const options = {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@howaboua/pi-pet",
3
- "version": "0.1.3",
3
+ "version": "0.1.5",
4
4
  "description": "Animated companions for GipPity Remote.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -42,7 +42,6 @@
42
42
  "!**/__pycache__",
43
43
  "!**/*.pyc",
44
44
  "!**/.venv",
45
- "!authoring/hatch/tests",
46
45
  "changelog.ts",
47
46
  "CHANGELOG.md"
48
47
  ],
@@ -54,7 +53,6 @@
54
53
  "scripts": {
55
54
  "build": "bun scripts/build.mjs",
56
55
  "desktop:start": "npm --prefix desktop run build && npm --prefix desktop start",
57
- "pet:hatch:test": "uv run --isolated --project authoring/hatch --locked python -m unittest discover -s authoring/hatch/tests -p 'test_*.py' -v",
58
56
  "pet:prepare": "node dist/authoring/prepare.mjs",
59
57
  "pet:rebuild": "node dist/authoring/rebuild.mjs",
60
58
  "pet:validate": "node dist/authoring/validate.mjs",
@@ -74,11 +72,11 @@
74
72
  "engines": {
75
73
  "node": ">=22"
76
74
  },
77
- "packageManager": "bun@1.4.0",
75
+ "packageManager": "bun@1.4.2",
78
76
  "peerDependencies": {
79
- "@howaboua/pi-gippity-control": ">=0.0.17",
80
- "@earendil-works/pi-coding-agent": ">=0.84.3",
81
- "@earendil-works/pi-tui": ">=0.84.3",
77
+ "@howaboua/pi-gippity-control": ">=0.0.20",
78
+ "@earendil-works/pi-coding-agent": ">=1.0.0",
79
+ "@earendil-works/pi-tui": ">=1.0.0",
82
80
  "typebox": "*"
83
81
  },
84
82
  "peerDependenciesMeta": {
@@ -87,13 +85,13 @@
87
85
  }
88
86
  },
89
87
  "devDependencies": {
90
- "@biomejs/biome": "2.5.10",
91
- "@earendil-works/pi-coding-agent": "0.85.0",
92
- "@earendil-works/pi-tui": "0.85.0",
93
- "@types/node": "^26.2.0",
94
- "electron": "43.4.1",
95
- "knip": "^6.32.2",
96
- "typebox": "1.3.18",
88
+ "@biomejs/biome": "2.5.15",
89
+ "@earendil-works/pi-coding-agent": "1.1.0",
90
+ "@earendil-works/pi-tui": "1.1.0",
91
+ "@types/node": "^26.6.5",
92
+ "electron": "43.7.9",
93
+ "knip": "^6.41.0",
94
+ "typebox": "1.3.36",
97
95
  "@typescript/native-preview": "^7.0.0-dev.20260707.2",
98
96
  "typescript": "^7.0.2"
99
97
  },
@@ -28,7 +28,7 @@ function parsePetSize(value: unknown): PetSize {
28
28
  return petSize;
29
29
  }
30
30
 
31
- export function parseAttentionPreferences(value: unknown): AttentionPreferences {
31
+ function parseAttentionPreferences(value: unknown): AttentionPreferences {
32
32
  if (!value || typeof value !== "object" || Array.isArray(value)) {
33
33
  throw new Error("Desktop attention preferences must be an object.");
34
34
  }
@@ -14,7 +14,7 @@ export interface DesktopWindowBounds {
14
14
  height: number;
15
15
  }
16
16
 
17
- export function hyprlandCursorSocket(env: NodeJS.ProcessEnv): string | undefined {
17
+ function hyprlandCursorSocket(env: NodeJS.ProcessEnv): string | undefined {
18
18
  const runtime = env["XDG_RUNTIME_DIR"];
19
19
  const signature = env["HYPRLAND_INSTANCE_SIGNATURE"];
20
20
  if (!(runtime && signature && runtime.startsWith("/") && HYPRLAND_SIGNATURE_PATTERN.test(signature)))
@@ -22,7 +22,7 @@ export function hyprlandCursorSocket(env: NodeJS.ProcessEnv): string | undefined
22
22
  return join(runtime, "hypr", signature, ".socket.sock");
23
23
  }
24
24
 
25
- export function parseHyprlandCursorResponse(value: string): DesktopCursorPosition {
25
+ function parseHyprlandCursorResponse(value: string): DesktopCursorPosition {
26
26
  const position = parseDesktopCursorPosition(JSON.parse(value) as unknown);
27
27
  if (!position) throw new Error("Hyprland returned an empty cursor position.");
28
28
  return position;
@@ -42,7 +42,7 @@ function parseCoordinatePair(value: unknown, label: string): [number, number] {
42
42
  return [value[0], value[1]];
43
43
  }
44
44
 
45
- export function parseHyprlandClientBounds(value: string, pid: number): DesktopWindowBounds {
45
+ function parseHyprlandClientBounds(value: string, pid: number): DesktopWindowBounds {
46
46
  const clients = JSON.parse(value) as unknown;
47
47
  if (!Array.isArray(clients)) throw new Error("Hyprland clients response must be an array.");
48
48
  const client = clients.find(
@@ -111,7 +111,7 @@ async function readHyprlandCommand<T>(
111
111
  });
112
112
  }
113
113
 
114
- export async function readHyprlandCursor(path: string): Promise<DesktopCursorPosition> {
114
+ async function readHyprlandCursor(path: string): Promise<DesktopCursorPosition> {
115
115
  return await readHyprlandCommand(
116
116
  path,
117
117
  "j/cursorpos",
@@ -57,7 +57,7 @@ function webpSize(buffer: Buffer): ImageSize | undefined {
57
57
  throw new Error("WebP dimensions were not found.");
58
58
  }
59
59
 
60
- export function imageSize(buffer: Buffer): ImageSize {
60
+ function imageSize(buffer: Buffer): ImageSize {
61
61
  const pngSignature = "89504e470d0a1a0a";
62
62
  if (buffer.length >= 24 && buffer.subarray(0, 8).toString("hex") === pngSignature) {
63
63
  return { format: "png", width: buffer.readUInt32BE(16), height: buffer.readUInt32BE(20) };