picopilot 0.1.4 → 0.2.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/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +111 -16
- package/dist/cli.js.map +1 -1
- package/dist/commands/audio.d.ts +3 -3
- package/dist/commands/audio.d.ts.map +1 -1
- package/dist/commands/audio.js +61 -44
- package/dist/commands/audio.js.map +1 -1
- package/dist/commands/cart-includes.d.ts +11 -0
- package/dist/commands/cart-includes.d.ts.map +1 -0
- package/dist/commands/cart-includes.js +26 -0
- package/dist/commands/cart-includes.js.map +1 -0
- package/dist/commands/doctor.d.ts +22 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +222 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/export.d.ts +3 -4
- package/dist/commands/export.d.ts.map +1 -1
- package/dist/commands/export.js +66 -86
- package/dist/commands/export.js.map +1 -1
- package/dist/commands/gfx.d.ts +2 -2
- package/dist/commands/gfx.d.ts.map +1 -1
- package/dist/commands/gfx.js +3 -2
- package/dist/commands/gfx.js.map +1 -1
- package/dist/commands/label-cart.d.ts +72 -0
- package/dist/commands/label-cart.d.ts.map +1 -0
- package/dist/commands/label-cart.js +228 -0
- package/dist/commands/label-cart.js.map +1 -0
- package/dist/commands/lint.d.ts +2 -2
- package/dist/commands/lint.d.ts.map +1 -1
- package/dist/commands/lint.js +3 -2
- package/dist/commands/lint.js.map +1 -1
- package/dist/commands/minify.d.ts +2 -2
- package/dist/commands/minify.d.ts.map +1 -1
- package/dist/commands/minify.js +3 -2
- package/dist/commands/minify.js.map +1 -1
- package/dist/commands/pico8-env.d.ts +76 -0
- package/dist/commands/pico8-env.d.ts.map +1 -0
- package/dist/commands/pico8-env.js +71 -0
- package/dist/commands/pico8-env.js.map +1 -0
- package/dist/commands/playtest.d.ts +2 -2
- package/dist/commands/playtest.d.ts.map +1 -1
- package/dist/commands/playtest.js +6 -32
- package/dist/commands/playtest.js.map +1 -1
- package/dist/commands/run.d.ts +3 -4
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +46 -19
- package/dist/commands/run.js.map +1 -1
- package/dist/commands/serve.d.ts +2 -2
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +65 -19
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/shrinko-env.d.ts +22 -0
- package/dist/commands/shrinko-env.d.ts.map +1 -0
- package/dist/commands/shrinko-env.js +15 -0
- package/dist/commands/shrinko-env.js.map +1 -0
- package/dist/commands/tokens.d.ts +4 -4
- package/dist/commands/tokens.d.ts.map +1 -1
- package/dist/commands/tokens.js +3 -2
- package/dist/commands/tokens.js.map +1 -1
- package/dist/commands/verify.d.ts +2 -2
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +3 -2
- package/dist/commands/verify.js.map +1 -1
- package/dist/engine/child-env.d.ts +14 -0
- package/dist/engine/child-env.d.ts.map +1 -0
- package/dist/engine/child-env.js +21 -0
- package/dist/engine/child-env.js.map +1 -0
- package/dist/engine/gfx/label.d.ts +15 -9
- package/dist/engine/gfx/label.d.ts.map +1 -1
- package/dist/engine/gfx/label.js +130 -38
- package/dist/engine/gfx/label.js.map +1 -1
- package/dist/engine/pico8/adapter.d.ts +23 -3
- package/dist/engine/pico8/adapter.d.ts.map +1 -1
- package/dist/engine/pico8/adapter.js.map +1 -1
- package/dist/engine/pico8/cleanup.d.ts +16 -0
- package/dist/engine/pico8/cleanup.d.ts.map +1 -0
- package/dist/engine/pico8/cleanup.js +74 -0
- package/dist/engine/pico8/cleanup.js.map +1 -0
- package/dist/engine/pico8/display.d.ts +149 -0
- package/dist/engine/pico8/display.d.ts.map +1 -0
- package/dist/engine/pico8/display.js +311 -0
- package/dist/engine/pico8/display.js.map +1 -0
- package/dist/engine/pico8/drive.d.ts.map +1 -1
- package/dist/engine/pico8/drive.js +28 -2
- package/dist/engine/pico8/drive.js.map +1 -1
- package/dist/engine/pico8/harness.d.ts +8 -0
- package/dist/engine/pico8/harness.d.ts.map +1 -1
- package/dist/engine/pico8/harness.js +9 -1
- package/dist/engine/pico8/harness.js.map +1 -1
- package/dist/engine/pico8/index.d.ts +3 -0
- package/dist/engine/pico8/index.d.ts.map +1 -1
- package/dist/engine/pico8/index.js +3 -0
- package/dist/engine/pico8/index.js.map +1 -1
- package/dist/engine/pico8/session-daemon-entry.d.ts +1 -1
- package/dist/engine/pico8/session-daemon-entry.js +1 -1
- package/dist/engine/pico8/session-daemon-main.d.ts +1 -1
- package/dist/engine/pico8/session-daemon-main.js +1 -1
- package/dist/engine/pico8/session-daemon.d.ts +1 -1
- package/dist/engine/pico8/session-daemon.d.ts.map +1 -1
- package/dist/engine/pico8/session-daemon.js +19 -19
- package/dist/engine/pico8/session-daemon.js.map +1 -1
- package/dist/engine/pico8/session.d.ts +1 -1
- package/dist/engine/pico8/session.js +1 -1
- package/dist/engine/pico8/shell.d.ts +56 -3
- package/dist/engine/pico8/shell.d.ts.map +1 -1
- package/dist/engine/pico8/shell.js +188 -24
- package/dist/engine/pico8/shell.js.map +1 -1
- package/dist/engine/pico8/supervisor.d.ts +1 -1
- package/dist/engine/pico8/supervisor.js +1 -1
- package/dist/engine/shrinko/adapter.d.ts +1 -1
- package/dist/engine/shrinko/shell.d.ts +3 -3
- package/dist/engine/shrinko/shell.js +3 -3
- package/package.json +2 -1
- package/src/cli.test.ts +188 -0
- package/src/cli.ts +122 -16
- package/src/commands/audio.test.ts +76 -1
- package/src/commands/audio.ts +79 -57
- package/src/commands/cart-includes.ts +27 -0
- package/src/commands/doctor.test.ts +149 -0
- package/src/commands/doctor.ts +280 -0
- package/src/commands/export.test.ts +327 -3
- package/src/commands/export.ts +81 -99
- package/src/commands/gfx.ts +7 -6
- package/src/commands/label-cart.ts +304 -0
- package/src/commands/lint.test.ts +6 -0
- package/src/commands/lint.ts +7 -6
- package/src/commands/minify.test.ts +6 -0
- package/src/commands/minify.ts +7 -6
- package/src/commands/pico8-env.ts +124 -0
- package/src/commands/playtest.test.ts +3 -0
- package/src/commands/playtest.ts +10 -34
- package/src/commands/run.test.ts +116 -2
- package/src/commands/run.ts +62 -24
- package/src/commands/serve.test.ts +138 -2
- package/src/commands/serve.ts +80 -21
- package/src/commands/shrinko-env.test.ts +68 -0
- package/src/commands/shrinko-env.ts +40 -0
- package/src/commands/tokens.test.ts +19 -0
- package/src/commands/tokens.ts +9 -6
- package/src/commands/verify.test.ts +12 -0
- package/src/commands/verify.ts +7 -4
- package/src/engine/child-env.ts +22 -0
- package/src/engine/gfx/fixtures/pico8-screenshot-384.png +0 -0
- package/src/engine/gfx/label.test.ts +467 -1
- package/src/engine/gfx/label.ts +147 -41
- package/src/engine/pico8/adapter.ts +25 -3
- package/src/engine/pico8/cleanup.test.ts +28 -0
- package/src/engine/pico8/cleanup.ts +76 -0
- package/src/engine/pico8/display.test.ts +210 -0
- package/src/engine/pico8/display.ts +429 -0
- package/src/engine/pico8/drive.test.ts +20 -0
- package/src/engine/pico8/drive.ts +25 -2
- package/src/engine/pico8/fake-xvfb.test-support.ts +55 -0
- package/src/engine/pico8/harness.test.ts +26 -0
- package/src/engine/pico8/harness.ts +18 -2
- package/src/engine/pico8/index.ts +3 -0
- package/src/engine/pico8/session-daemon-entry.ts +1 -1
- package/src/engine/pico8/session-daemon-main.ts +1 -1
- package/src/engine/pico8/session-daemon.test.ts +32 -1
- package/src/engine/pico8/session-daemon.ts +25 -17
- package/src/engine/pico8/session.test.ts +1 -1
- package/src/engine/pico8/session.ts +1 -1
- package/src/engine/pico8/shell.test.ts +449 -10
- package/src/engine/pico8/shell.ts +255 -26
- package/src/engine/pico8/supervisor.ts +1 -1
- package/src/engine/pico8/virtual-display.process.test.ts +206 -0
- package/src/engine/shrinko/adapter.ts +1 -1
- package/src/engine/shrinko/shell.ts +3 -3
- package/src/engine/skills/skills.test.ts +10 -0
- package/src/skills/picopilot-audio/SKILL.md +4 -8
- package/src/skills/picopilot-debug/SKILL.md +18 -1
- package/src/skills/picopilot-overview/SKILL.md +9 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,SAAS,CAAC;AACnC,OAAO,EAAC,UAAU,EAAE,OAAO,EAAC,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAW,CAAC,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAEN,iBAAiB,
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/commands/tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Cli } from 'incur';
|
|
2
|
-
import { type
|
|
2
|
+
import { type ShrinkoAdapterFactory } from './shrinko-env.js';
|
|
3
3
|
/**
|
|
4
4
|
* The one-line self-scoping the `picopilot verify` envelope always carries, so
|
|
5
5
|
* the connotation of "verify" never misleads an agent into treating a green
|
|
@@ -16,7 +16,7 @@ export declare const VERIFY_SCOPE: "static gate: tokens + integrity; passing doe
|
|
|
16
16
|
*/
|
|
17
17
|
export declare const GATE_INCAPABLE_EXIT = 2;
|
|
18
18
|
/** See {@link ShrinkoAdapterFactory} in `tokens.ts` — verify reuses the same seam. */
|
|
19
|
-
export type ShrinkoAdapterFactory
|
|
19
|
+
export type { ShrinkoAdapterFactory } from './shrinko-env.js';
|
|
20
20
|
/**
|
|
21
21
|
* Registers `picopilot verify` (US #15, #18), the STATIC cart-acceptance gate an
|
|
22
22
|
* agent drives each iteration toward.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,KAAK,GAAG,EAAI,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAEA,OAAO,EAAC,KAAK,GAAG,EAAI,MAAM,OAAO,CAAC;AAOlC,OAAO,EAEN,KAAK,qBAAqB,EAC1B,MAAM,kBAAkB,CAAC;AAG1B;;;;;GAKG;AACH,eAAO,MAAM,YAAY,EACxB,sEAA+E,CAAC;AAEjF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,sFAAsF;AACtF,YAAY,EAAC,qBAAqB,EAAC,MAAM,kBAAkB,CAAC;AA2C5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,cAAc,CAC7B,GAAG,EAAE,GAAG,CAAC,GAAG,EACZ,cAAc,GAAE,qBAA6C,GAC3D,IAAI,CA8IN"}
|
package/dist/commands/verify.js
CHANGED
|
@@ -2,7 +2,8 @@ import { existsSync, readFileSync } from 'node:fs';
|
|
|
2
2
|
import { isAbsolute, resolve } from 'node:path';
|
|
3
3
|
import { z } from 'incur';
|
|
4
4
|
import { Cart, CartParseError } from '../engine/cart/index.js';
|
|
5
|
-
import { ShrinkoParseError,
|
|
5
|
+
import { ShrinkoParseError, } from '../engine/shrinko/index.js';
|
|
6
|
+
import { createShellShrinkoFactory, } from './shrinko-env.js';
|
|
6
7
|
import { TOKEN_BUDGET } from './tokens.js';
|
|
7
8
|
/**
|
|
8
9
|
* The one-line self-scoping the `picopilot verify` envelope always carries, so
|
|
@@ -19,7 +20,7 @@ export const VERIFY_SCOPE = 'static gate: tokens + integrity; passing does NOT m
|
|
|
19
20
|
* important check, so it gets its own nonzero code an agent can branch on.
|
|
20
21
|
*/
|
|
21
22
|
export const GATE_INCAPABLE_EXIT = 2;
|
|
22
|
-
const defaultAdapterFactory = (
|
|
23
|
+
const defaultAdapterFactory = createShellShrinkoFactory();
|
|
23
24
|
/**
|
|
24
25
|
* Runs the STATIC cart-integrity check against `text`: the cart must parse into
|
|
25
26
|
* the cart model and round-trip cleanly (`Cart.parse(text).serialize() ===
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAE,YAAY,EAAC,MAAM,SAAS,CAAC;AACjD,OAAO,EAAC,UAAU,EAAE,OAAO,EAAC,MAAM,WAAW,CAAC;AAC9C,OAAO,EAAW,CAAC,EAAC,MAAM,OAAO,CAAC;AAElC,OAAO,EAAC,IAAI,EAAE,cAAc,EAAC,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAEN,iBAAiB,
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/commands/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The environment an external tool (PICO-8, shrinko8) is spawned with: the
|
|
3
|
+
* PARENT environment overlaid with the values a command RESOLVED (incur parses
|
|
4
|
+
* only the keys a command declares, e.g. PICO8_PATH / PATH). Handing the child
|
|
5
|
+
* just that parsed subset strips everything else it needs: DISPLAY, HOME,
|
|
6
|
+
* XDG_RUNTIME_DIR and SDL_* for PICO-8 (ADR-0017), HOME / PYTHONUSERBASE for a
|
|
7
|
+
* `pip install --user` shrinko8. An `undefined` resolved value never erases a
|
|
8
|
+
* parent value.
|
|
9
|
+
*
|
|
10
|
+
* `parent` is a parameter (the command layer defaults it to `process.env`; it is
|
|
11
|
+
* never read here) so tests inject a controlled environment.
|
|
12
|
+
*/
|
|
13
|
+
export declare function overlayEnv(resolved: Readonly<Record<string, string | undefined>>, parent: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
14
|
+
//# sourceMappingURL=child-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child-env.d.ts","sourceRoot":"","sources":["../../src/engine/child-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CACzB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,EACtD,MAAM,EAAE,MAAM,CAAC,UAAU,GACvB,MAAM,CAAC,UAAU,CAMnB"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The environment an external tool (PICO-8, shrinko8) is spawned with: the
|
|
3
|
+
* PARENT environment overlaid with the values a command RESOLVED (incur parses
|
|
4
|
+
* only the keys a command declares, e.g. PICO8_PATH / PATH). Handing the child
|
|
5
|
+
* just that parsed subset strips everything else it needs: DISPLAY, HOME,
|
|
6
|
+
* XDG_RUNTIME_DIR and SDL_* for PICO-8 (ADR-0017), HOME / PYTHONUSERBASE for a
|
|
7
|
+
* `pip install --user` shrinko8. An `undefined` resolved value never erases a
|
|
8
|
+
* parent value.
|
|
9
|
+
*
|
|
10
|
+
* `parent` is a parameter (the command layer defaults it to `process.env`; it is
|
|
11
|
+
* never read here) so tests inject a controlled environment.
|
|
12
|
+
*/
|
|
13
|
+
export function overlayEnv(resolved, parent) {
|
|
14
|
+
const env = { ...parent };
|
|
15
|
+
for (const [key, value] of Object.entries(resolved)) {
|
|
16
|
+
if (value !== undefined)
|
|
17
|
+
env[key] = value;
|
|
18
|
+
}
|
|
19
|
+
return env;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=child-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child-env.js","sourceRoot":"","sources":["../../src/engine/child-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CACzB,QAAsD,EACtD,MAAyB;IAEzB,MAAM,GAAG,GAAsB,EAAC,GAAG,MAAM,EAAC,CAAC;IAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The `__label__` builder: turn a 128x128 image
|
|
2
|
+
* The `__label__` builder: turn a 128x128 image (or a PICO-8 screenshot, an
|
|
3
|
+
* integer upscale of one) into the hex a `.p8` cart's
|
|
3
4
|
* label section holds, so `picopilot export --label <png>` can give a labelless
|
|
4
5
|
* cart a loading splash WITHOUT an interactive PICO-8 (F7) capture.
|
|
5
6
|
*
|
|
@@ -9,10 +10,13 @@
|
|
|
9
10
|
* palette colour, and emits that hex. It is the inverse direction of the
|
|
10
11
|
* palette-accurate PNG RENDER in `render.ts`/`png.ts` (which goes indices -> RGB).
|
|
11
12
|
*
|
|
12
|
-
* It
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* It accepts what a caller realistically hands it: a PICO-8 screenshot exactly as
|
|
14
|
+
* `picopilot run`/`playtest` captured it (384x384 8-bit RGB by default; any
|
|
15
|
+
* square integer multiple of 128 is sampled back down), or a 128x128 image from
|
|
16
|
+
* any tool, including palette-indexed (1/2/4/8-bit, the form image tools write
|
|
17
|
+
* when shrinking a screenshot) and greyscale PNGs. Interlaced PNGs, sizes that
|
|
18
|
+
* are not a square multiple of 128, and malformed files are rejected, loud, with
|
|
19
|
+
* a structured {@link LabelError}.
|
|
16
20
|
*/
|
|
17
21
|
/** The fixed PICO-8 label dimensions: a 128x128 image. */
|
|
18
22
|
export declare const LABEL_SIZE = 128;
|
|
@@ -25,10 +29,12 @@ export declare class LabelError extends Error {
|
|
|
25
29
|
export declare function nearestPaletteIndex(r: number, g: number, b: number): number;
|
|
26
30
|
/**
|
|
27
31
|
* Builds the `__label__` hex body (128 rows of 128 nibbles, newline-joined, with
|
|
28
|
-
* a trailing newline) from a
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
+
* a trailing newline) from a PNG. Each pixel is mapped to its nearest PICO-8
|
|
33
|
+
* palette colour. The PNG must be 128x128 ({@link LABEL_SIZE}) or an exact square
|
|
34
|
+
* integer multiple of it (256x256, 384x384, ...: a PICO-8 screenshot), which is
|
|
35
|
+
* downscaled by nearest-neighbour sampling (the centre of each `k x k` block).
|
|
36
|
+
* Any other size is a {@link LabelError} (`wrong-size`) so a mis-sized image
|
|
37
|
+
* fails loud instead of being silently cropped or stretched.
|
|
32
38
|
*/
|
|
33
39
|
export declare function labelHexFromPng(pngBytes: Uint8Array): string;
|
|
34
40
|
//# sourceMappingURL=label.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../src/engine/gfx/label.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"label.d.ts","sourceRoot":"","sources":["../../../src/engine/gfx/label.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,0DAA0D;AAC1D,eAAO,MAAM,UAAU,MAAM,CAAC;AAE9B,kFAAkF;AAClF,qBAAa,UAAW,SAAQ,KAAK;IAEnC,QAAQ,CAAC,IAAI,EACZ,WAAW,GAAG,iBAAiB,GAAG,YAAY,GAAG,eAAe;gBADxD,IAAI,EACZ,WAAW,GAAG,iBAAiB,GAAG,YAAY,GAAG,eAAe,EACjE,OAAO,EAAE,MAAM;CAKhB;AAwOD,oFAAoF;AACpF,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAe3E;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,UAAU,GAAG,MAAM,CAsB5D"}
|
package/dist/engine/gfx/label.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The `__label__` builder: turn a 128x128 image
|
|
2
|
+
* The `__label__` builder: turn a 128x128 image (or a PICO-8 screenshot, an
|
|
3
|
+
* integer upscale of one) into the hex a `.p8` cart's
|
|
3
4
|
* label section holds, so `picopilot export --label <png>` can give a labelless
|
|
4
5
|
* cart a loading splash WITHOUT an interactive PICO-8 (F7) capture.
|
|
5
6
|
*
|
|
@@ -9,10 +10,13 @@
|
|
|
9
10
|
* palette colour, and emits that hex. It is the inverse direction of the
|
|
10
11
|
* palette-accurate PNG RENDER in `render.ts`/`png.ts` (which goes indices -> RGB).
|
|
11
12
|
*
|
|
12
|
-
* It
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
13
|
+
* It accepts what a caller realistically hands it: a PICO-8 screenshot exactly as
|
|
14
|
+
* `picopilot run`/`playtest` captured it (384x384 8-bit RGB by default; any
|
|
15
|
+
* square integer multiple of 128 is sampled back down), or a 128x128 image from
|
|
16
|
+
* any tool, including palette-indexed (1/2/4/8-bit, the form image tools write
|
|
17
|
+
* when shrinking a screenshot) and greyscale PNGs. Interlaced PNGs, sizes that
|
|
18
|
+
* are not a square multiple of 128, and malformed files are rejected, loud, with
|
|
19
|
+
* a structured {@link LabelError}.
|
|
16
20
|
*/
|
|
17
21
|
import { inflateSync } from 'node:zlib';
|
|
18
22
|
import { PICO8_PALETTE } from './palette.js';
|
|
@@ -28,12 +32,32 @@ export class LabelError extends Error {
|
|
|
28
32
|
}
|
|
29
33
|
}
|
|
30
34
|
const PNG_SIGNATURE = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a];
|
|
35
|
+
/** Samples per pixel for each PNG colour type we decode. */
|
|
36
|
+
const CHANNELS = {
|
|
37
|
+
0: 1, // greyscale
|
|
38
|
+
2: 3, // RGB
|
|
39
|
+
3: 1, // palette index
|
|
40
|
+
4: 2, // greyscale + alpha
|
|
41
|
+
6: 4, // RGBA
|
|
42
|
+
};
|
|
43
|
+
/** The bit depths the PNG spec allows per colour type. */
|
|
44
|
+
const ALLOWED_DEPTHS = {
|
|
45
|
+
0: [1, 2, 4, 8, 16],
|
|
46
|
+
2: [8, 16],
|
|
47
|
+
3: [1, 2, 4, 8],
|
|
48
|
+
4: [8, 16],
|
|
49
|
+
6: [8, 16],
|
|
50
|
+
};
|
|
31
51
|
/**
|
|
32
|
-
* Decodes
|
|
52
|
+
* Decodes a non-interlaced PNG of any standard colour type and bit depth to
|
|
53
|
+
* RGBA: truecolour (2) and truecolour+alpha (6) at 8/16 bits, palette-indexed (3)
|
|
54
|
+
* at 1/2/4/8 bits via its PLTE chunk, and greyscale (0) / greyscale+alpha (4).
|
|
33
55
|
* Uses `node:zlib` inflate for the IDAT stream and applies the five PNG scanline
|
|
34
|
-
* filters.
|
|
56
|
+
* filters. `checkSize` runs on the IHDR dimensions before any pixel work. 16-bit samples keep their high byte (a label is quantised to 16
|
|
57
|
+
* colours anyway). Interlaced (Adam7) PNGs are rejected: PICO-8 never writes them.
|
|
58
|
+
* Throws {@link LabelError} for anything outside this set.
|
|
35
59
|
*/
|
|
36
|
-
function decodePng(bytes) {
|
|
60
|
+
function decodePng(bytes, checkSize = () => { }) {
|
|
37
61
|
for (let i = 0; i < PNG_SIGNATURE.length; i++) {
|
|
38
62
|
if (bytes[i] !== PNG_SIGNATURE[i]) {
|
|
39
63
|
throw new LabelError('not-a-png', 'not a PNG file (bad signature)');
|
|
@@ -45,6 +69,7 @@ function decodePng(bytes) {
|
|
|
45
69
|
let bitDepth = 0;
|
|
46
70
|
let colourType = 0;
|
|
47
71
|
let interlace = 0;
|
|
72
|
+
let palette;
|
|
48
73
|
const idat = [];
|
|
49
74
|
const readU32 = (p) => ((bytes[p] << 24) |
|
|
50
75
|
(bytes[p + 1] << 16) |
|
|
@@ -66,6 +91,9 @@ function decodePng(bytes) {
|
|
|
66
91
|
colourType = bytes[dataStart + 9];
|
|
67
92
|
interlace = bytes[dataStart + 12];
|
|
68
93
|
}
|
|
94
|
+
else if (type === 'PLTE') {
|
|
95
|
+
palette = bytes.subarray(dataStart, dataEnd);
|
|
96
|
+
}
|
|
69
97
|
else if (type === 'IDAT') {
|
|
70
98
|
idat.push(bytes.subarray(dataStart, dataEnd));
|
|
71
99
|
}
|
|
@@ -74,12 +102,18 @@ function decodePng(bytes) {
|
|
|
74
102
|
}
|
|
75
103
|
off = dataEnd + 4; // skip the 4-byte CRC
|
|
76
104
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
(
|
|
80
|
-
|
|
105
|
+
const channels = CHANNELS[colourType];
|
|
106
|
+
if (channels === undefined ||
|
|
107
|
+
!ALLOWED_DEPTHS[colourType].includes(bitDepth) ||
|
|
108
|
+
interlace !== 0) {
|
|
109
|
+
throw new LabelError('unsupported-png', `unsupported PNG: need a non-interlaced greyscale, RGB, RGBA or palette-indexed image (got bitDepth=${bitDepth}, colourType=${colourType}, interlace=${interlace})`);
|
|
110
|
+
}
|
|
111
|
+
if (colourType === 3 && (palette === undefined || palette.length < 3)) {
|
|
112
|
+
throw new LabelError('unsupported-png', 'palette-indexed PNG has no PLTE chunk');
|
|
81
113
|
}
|
|
82
|
-
|
|
114
|
+
// Reject a wrong-sized image from its header alone, before inflating and
|
|
115
|
+
// decoding pixels we would throw away.
|
|
116
|
+
checkSize(width, height);
|
|
83
117
|
const compressed = Buffer.concat(idat.map((c) => Buffer.from(c)));
|
|
84
118
|
let raw;
|
|
85
119
|
try {
|
|
@@ -88,49 +122,88 @@ function decodePng(bytes) {
|
|
|
88
122
|
catch (e) {
|
|
89
123
|
throw new LabelError('truncated-png', `could not inflate PNG image data: ${e.message}`);
|
|
90
124
|
}
|
|
91
|
-
const
|
|
125
|
+
const bitsPerPixel = channels * bitDepth;
|
|
126
|
+
const stride = Math.ceil((width * bitsPerPixel) / 8);
|
|
127
|
+
// Filter byte distance: bytes per complete pixel, at least 1 (sub-byte depths).
|
|
128
|
+
const bpp = Math.max(1, bitsPerPixel >> 3);
|
|
129
|
+
if (raw.length < height * (stride + 1)) {
|
|
130
|
+
throw new LabelError('truncated-png', `PNG image data too short for ${width}x${height}`);
|
|
131
|
+
}
|
|
132
|
+
// Reads sample `i` (0-based within the scanline) scaled to 0..255.
|
|
133
|
+
const maxSample = (1 << Math.min(bitDepth, 8)) - 1;
|
|
134
|
+
const sampleAt = (line, i) => {
|
|
135
|
+
if (bitDepth === 16)
|
|
136
|
+
return line[i * 2];
|
|
137
|
+
if (bitDepth === 8)
|
|
138
|
+
return line[i];
|
|
139
|
+
const bit = i * bitDepth;
|
|
140
|
+
const v = (line[bit >> 3] >> (8 - bitDepth - (bit & 7))) & maxSample;
|
|
141
|
+
return v;
|
|
142
|
+
};
|
|
143
|
+
// Palette indices must stay raw; greyscale samples are scaled to 0..255.
|
|
144
|
+
const scaleGrey = (v) => bitDepth >= 8 ? v : Math.round((v * 255) / maxSample);
|
|
92
145
|
const rgba = new Uint8Array(width * height * 4);
|
|
93
|
-
|
|
146
|
+
let prev = new Uint8Array(stride);
|
|
147
|
+
let line = new Uint8Array(stride);
|
|
94
148
|
let src = 0;
|
|
95
149
|
for (let y = 0; y < height; y++) {
|
|
96
150
|
const filter = raw[src++];
|
|
97
|
-
const line = new Uint8Array(stride);
|
|
98
151
|
for (let x = 0; x < stride; x++) {
|
|
99
152
|
const rawByte = raw[src++];
|
|
100
|
-
const a = x >=
|
|
153
|
+
const a = x >= bpp ? line[x - bpp] : 0; // left
|
|
101
154
|
const b = prev[x]; // up
|
|
102
|
-
const c = x >=
|
|
103
|
-
let val
|
|
155
|
+
const c = x >= bpp ? prev[x - bpp] : 0; // up-left
|
|
156
|
+
let val;
|
|
104
157
|
switch (filter) {
|
|
105
158
|
case 0:
|
|
159
|
+
val = rawByte;
|
|
106
160
|
break; // None
|
|
107
161
|
case 1:
|
|
108
|
-
val =
|
|
162
|
+
val = rawByte + a;
|
|
109
163
|
break; // Sub
|
|
110
164
|
case 2:
|
|
111
|
-
val =
|
|
165
|
+
val = rawByte + b;
|
|
112
166
|
break; // Up
|
|
113
167
|
case 3:
|
|
114
|
-
val =
|
|
168
|
+
val = rawByte + ((a + b) >> 1);
|
|
115
169
|
break; // Average
|
|
116
170
|
case 4:
|
|
117
|
-
val =
|
|
171
|
+
val = rawByte + paeth(a, b, c);
|
|
118
172
|
break; // Paeth
|
|
119
173
|
default:
|
|
120
174
|
throw new LabelError('unsupported-png', `unsupported PNG scanline filter ${filter}`);
|
|
121
175
|
}
|
|
122
|
-
line[x] = val;
|
|
176
|
+
line[x] = val & 0xff;
|
|
123
177
|
}
|
|
124
178
|
// Expand this decoded scanline into RGBA.
|
|
125
179
|
for (let x = 0; x < width; x++) {
|
|
126
180
|
const s = x * channels;
|
|
127
181
|
const d = (y * width + x) * 4;
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
182
|
+
if (colourType === 3) {
|
|
183
|
+
const p = sampleAt(line, s) * 3;
|
|
184
|
+
if (p + 2 >= palette.length) {
|
|
185
|
+
throw new LabelError('unsupported-png', `palette index ${p / 3} is outside the PLTE chunk`);
|
|
186
|
+
}
|
|
187
|
+
rgba[d] = palette[p];
|
|
188
|
+
rgba[d + 1] = palette[p + 1];
|
|
189
|
+
rgba[d + 2] = palette[p + 2];
|
|
190
|
+
rgba[d + 3] = 255;
|
|
191
|
+
}
|
|
192
|
+
else if (colourType === 0 || colourType === 4) {
|
|
193
|
+
const g = scaleGrey(sampleAt(line, s));
|
|
194
|
+
rgba[d] = g;
|
|
195
|
+
rgba[d + 1] = g;
|
|
196
|
+
rgba[d + 2] = g;
|
|
197
|
+
rgba[d + 3] = colourType === 4 ? sampleAt(line, s + 1) : 255;
|
|
198
|
+
}
|
|
199
|
+
else {
|
|
200
|
+
rgba[d] = sampleAt(line, s);
|
|
201
|
+
rgba[d + 1] = sampleAt(line, s + 1);
|
|
202
|
+
rgba[d + 2] = sampleAt(line, s + 2);
|
|
203
|
+
rgba[d + 3] = colourType === 6 ? sampleAt(line, s + 3) : 255;
|
|
204
|
+
}
|
|
132
205
|
}
|
|
133
|
-
prev
|
|
206
|
+
[prev, line] = [line, prev];
|
|
134
207
|
}
|
|
135
208
|
return { width, height, rgba };
|
|
136
209
|
}
|
|
@@ -164,23 +237,42 @@ export function nearestPaletteIndex(r, g, b) {
|
|
|
164
237
|
return best;
|
|
165
238
|
}
|
|
166
239
|
const HEX = '0123456789abcdef';
|
|
240
|
+
/**
|
|
241
|
+
* The integer scale of a PICO-8-shaped screenshot: `k` when the image is exactly
|
|
242
|
+
* `(128*k)x(128*k)` (128x128 is `k = 1`), else `undefined`. PICO-8's
|
|
243
|
+
* `extcmd("screen")` writes a pixel-exact upscale (3x by default, 384x384; the
|
|
244
|
+
* factor follows its `screenshot_scale` config), so any square integer multiple
|
|
245
|
+
* is a screenshot we can sample straight back down.
|
|
246
|
+
*/
|
|
247
|
+
function labelScale(width, height) {
|
|
248
|
+
if (width !== height || width < LABEL_SIZE || width % LABEL_SIZE !== 0) {
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
return width / LABEL_SIZE;
|
|
252
|
+
}
|
|
167
253
|
/**
|
|
168
254
|
* Builds the `__label__` hex body (128 rows of 128 nibbles, newline-joined, with
|
|
169
|
-
* a trailing newline) from a
|
|
170
|
-
*
|
|
171
|
-
*
|
|
172
|
-
*
|
|
255
|
+
* a trailing newline) from a PNG. Each pixel is mapped to its nearest PICO-8
|
|
256
|
+
* palette colour. The PNG must be 128x128 ({@link LABEL_SIZE}) or an exact square
|
|
257
|
+
* integer multiple of it (256x256, 384x384, ...: a PICO-8 screenshot), which is
|
|
258
|
+
* downscaled by nearest-neighbour sampling (the centre of each `k x k` block).
|
|
259
|
+
* Any other size is a {@link LabelError} (`wrong-size`) so a mis-sized image
|
|
260
|
+
* fails loud instead of being silently cropped or stretched.
|
|
173
261
|
*/
|
|
174
262
|
export function labelHexFromPng(pngBytes) {
|
|
175
|
-
const { width, height, rgba } = decodePng(pngBytes)
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
263
|
+
const { width, height, rgba } = decodePng(pngBytes, (w, h) => {
|
|
264
|
+
if (labelScale(w, h) === undefined) {
|
|
265
|
+
throw new LabelError('wrong-size', `label image must be ${LABEL_SIZE}x${LABEL_SIZE} or an exact multiple of it (256x256, 384x384, 512x512, ...), got ${w}x${h}`);
|
|
266
|
+
}
|
|
267
|
+
});
|
|
268
|
+
const scale = labelScale(width, height);
|
|
269
|
+
const centre = scale >> 1;
|
|
179
270
|
const rows = [];
|
|
180
271
|
for (let y = 0; y < LABEL_SIZE; y++) {
|
|
181
272
|
let row = '';
|
|
273
|
+
const sy = y * scale + centre;
|
|
182
274
|
for (let x = 0; x < LABEL_SIZE; x++) {
|
|
183
|
-
const d = (
|
|
275
|
+
const d = (sy * width + x * scale + centre) * 4;
|
|
184
276
|
row += HEX[nearestPaletteIndex(rgba[d], rgba[d + 1], rgba[d + 2])];
|
|
185
277
|
}
|
|
186
278
|
rows.push(row);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../../src/engine/gfx/label.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"label.js","sourceRoot":"","sources":["../../../src/engine/gfx/label.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* PICO-8 is a licensed, paid binary with no pip/npm install path, so absence is
|
|
12
12
|
* a normal, well-signposted boundary (US #14, #19), mirroring shrinko-not-found.
|
|
13
13
|
*/
|
|
14
|
+
import type { DisplayUnavailable, VirtualDisplayBackend } from './display.js';
|
|
14
15
|
/** The remedy string in a pico8-not-found result: how the user makes `run` work. */
|
|
15
16
|
export declare const PICO8_REMEDY: "set PICO8_PATH or install PICO-8";
|
|
16
17
|
/** What `run` needs: the PICO-8 binary (a paid, licensed download; no package manager). */
|
|
@@ -66,6 +67,23 @@ export interface RecordReport {
|
|
|
66
67
|
readonly wavPath: string | undefined;
|
|
67
68
|
readonly printh: string;
|
|
68
69
|
readonly exitReason: ExitReason;
|
|
70
|
+
/**
|
|
71
|
+
* Which display the `-run` session used (ADR-0017): `native` (the caller's
|
|
72
|
+
* own DISPLAY/WAYLAND_DISPLAY, or none) or a private virtual display (`Xvfb`
|
|
73
|
+
* spawned directly, or the `xvfb-run` fallback). Omitted by fakes.
|
|
74
|
+
*/
|
|
75
|
+
readonly display?: 'native' | VirtualDisplayBackend;
|
|
76
|
+
/**
|
|
77
|
+
* Set only when `wavPath` is undefined: WHY no WAV was captured (the backstop
|
|
78
|
+
* fired before the done-sentinel, PICO-8 exited early, or the sentinel was
|
|
79
|
+
* reached but the WAV was missing/empty), so a silent failure always says why.
|
|
80
|
+
*/
|
|
81
|
+
readonly noWavReason?: string;
|
|
82
|
+
/**
|
|
83
|
+
* Set only when `wavPath` is undefined: the tail of PICO-8's own `log.txt`
|
|
84
|
+
* from the isolated `-home` (load errors, SDL/audio init failures).
|
|
85
|
+
*/
|
|
86
|
+
readonly pico8LogTail?: string;
|
|
69
87
|
}
|
|
70
88
|
/** A successful audio-record call carrying the {@link RecordReport}. */
|
|
71
89
|
export interface Pico8RecordOk {
|
|
@@ -117,7 +135,7 @@ export interface DriveOptions {
|
|
|
117
135
|
* The result {@link Pico8Adapter.record} returns: a {@link RecordReport} or the
|
|
118
136
|
* structured {@link Pico8NotFound} (PICO-8 absent), mirroring {@link Pico8Result}.
|
|
119
137
|
*/
|
|
120
|
-
export type Pico8RecordResult = Pico8RecordOk | Pico8NotFound;
|
|
138
|
+
export type Pico8RecordResult = Pico8RecordOk | Pico8NotFound | DisplayUnavailable;
|
|
121
139
|
/**
|
|
122
140
|
* Options for a single {@link Pico8Adapter.record} (ADR-0009). The recorded cart
|
|
123
141
|
* is expected to COOPERATE: at start it does `extcmd("set_filename", <base>)` +
|
|
@@ -232,8 +250,10 @@ export interface Pico8Adapter {
|
|
|
232
250
|
* `-x`, which mixes no audio and yields an empty WAV, ADR-0009), streams
|
|
233
251
|
* stdout, ends on the sentinel (backstop as the net), and collects the WAV the
|
|
234
252
|
* cooperating cart wrote via `audio_rec`/`audio_end(1)`. Returns
|
|
235
|
-
* {@link Pico8NotFound} when PICO-8 is not installed
|
|
236
|
-
*
|
|
253
|
+
* {@link Pico8NotFound} when PICO-8 is not installed, and
|
|
254
|
+
* {@link DisplayUnavailable} when the session needs a display, there is none,
|
|
255
|
+
* and no Xvfb is installed to provide a virtual one (ADR-0017). CI drives a
|
|
256
|
+
* fake runner + fake Xvfb; a live capture needs the paid binary.
|
|
237
257
|
*/
|
|
238
258
|
record(options: RecordOptions): Promise<Pico8RecordResult>;
|
|
239
259
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/engine/pico8/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,oFAAoF;AACpF,eAAO,MAAM,YAAY,EAAG,kCAA2C,CAAC;AAExE,2FAA2F;AAC3F,eAAO,MAAM,WAAW,oBAAqB,CAAC;AAE9C,6FAA6F;AAC7F,eAAO,MAAM,aAAa,EAAG,oBAA6B,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,OAAO,YAAY,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CAClC;AAED,iGAAiG;AACjG,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAEzD;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CAChC;AAED,yDAAyD;AACzD,MAAM,WAAW,OAAO;IACvB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,aAAa,CAAC;AAElD;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/engine/pico8/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/engine/pico8/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/engine/pico8/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,oFAAoF;AACpF,MAAM,CAAC,MAAM,YAAY,GAAG,kCAA2C,CAAC;AAExE,2FAA2F;AAC3F,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAO,CAAU,CAAC;AAE9C,6FAA6F;AAC7F,MAAM,CAAC,MAAM,aAAa,GAAG,oBAA6B,CAAC;AAwN3D,0GAA0G;AAC1G,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAqB,CAAC;AAmEtD,mFAAmF;AACnF,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAA0B,CAAC;AAE9D,yFAAyF;AACzF,MAAM,CAAC,MAAM,sBAAsB,GAAG,GAAG,CAAC;AAE1C,uFAAuF;AACvF,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAE1C,yFAAyF;AACzF,MAAM,UAAU,aAAa;IAC5B,OAAO;QACN,EAAE,EAAE,KAAK;QACT,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,YAAY;QACpB,KAAK,EAAE,CAAC,GAAG,WAAW,CAAC;KACvB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kill-on-abort for child processes picopilot owns while a run is in flight
|
|
3
|
+
* (the PICO-8 process group, a private Xvfb). Normal endings (sentinel,
|
|
4
|
+
* backstop, crash) are handled by the run itself; this covers picopilot being
|
|
5
|
+
* stopped mid-run: `process.exit`, an uncaught throw, or SIGINT / SIGTERM /
|
|
6
|
+
* SIGHUP sent to picopilot alone (an agent harness or `timeout` killing it).
|
|
7
|
+
* Without it, a detached PICO-8 or an Xvfb would outlive picopilot.
|
|
8
|
+
*
|
|
9
|
+
* `kill` must be synchronous (it runs inside an `exit` handler). On a signal,
|
|
10
|
+
* the hook kills, then re-raises the signal with picopilot's handler removed so
|
|
11
|
+
* the default behaviour (terminate) still happens, unless some other listener
|
|
12
|
+
* owns that signal (an MCP server, a test runner), which then decides.
|
|
13
|
+
*/
|
|
14
|
+
/** Registers `kill` to run if picopilot exits or is signalled; returns the disposer. */
|
|
15
|
+
export declare function killOnAbort(kill: () => void): () => void;
|
|
16
|
+
//# sourceMappingURL=cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../../../src/engine/pico8/cleanup.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoDH,wFAAwF;AACxF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAUxD"}
|