@flyingrobots/bijou-node 2.1.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,13 +1,14 @@
1
1
  # @flyingrobots/bijou-node
2
2
 
3
- Node.js adapter for bijou chalk styling, readline I/O, process runtime.
3
+ Node.js adapters and runtime utilities for Bijou.
4
4
 
5
- ## Documentation Status
5
+ This package bridges the pure `@flyingrobots/bijou` core and the `@flyingrobots/bijou-tui` runtime to the Node.js environment. It owns runtime detection, terminal I/O, Chalk-backed styling, worker-thread helpers, and the native V3 demo recorder.
6
6
 
7
- This npm README is a quick overview and may lag behind the repository.
7
+ ## What's New in v3.0.0
8
8
 
9
- - Canonical API details and behavior notes live in [`GUIDE.md`](./GUIDE.md)
10
- - Release-level changes live in the [CHANGELOG](https://github.com/flyingrobots/bijou/blob/main/docs/CHANGELOG.md)
9
+ - **Worker runtime support** — `runInWorker()` and `startWorkerApp()` let TEA apps move heavy update work off the main thread while keeping input and rendering responsive.
10
+ - **Native demo recorder** V3 flagship demos can now be recorded directly from captured `Surface[]` frames with `recordDemoGif()`.
11
+ - **Node boundary stays explicit** — runtime facts, I/O, and styling remain behind the port interfaces instead of leaking `process`, `readline`, or Chalk into the pure packages.
11
12
 
12
13
  ## Install
13
14
 
@@ -35,6 +36,8 @@ console.log(headerBox('My CLI', { detail: 'v1.0.0' }));
35
36
  - **Interactive terminal I/O**: stdin/stdout integration with readline and resize-event support.
36
37
  - **Styling backend**: Chalk-powered color/style methods wired into bijou styling APIs.
37
38
  - **One-line bootstrap**: `initDefaultContext()` creates a production-ready context and registers it as default on first call.
39
+ - **Worker helpers**: `runInWorker()` and `startWorkerApp()` for moving app logic into a worker thread.
40
+ - **Native recorder**: `recordDemoGif()` and related helpers for scripted V3 demo capture.
38
41
 
39
42
  ## What It Provides
40
43
 
@@ -65,6 +68,7 @@ initDefaultContext();
65
68
  If you need to replace the default context later in-process, call `setDefaultContext(createNodeContext())` from `@flyingrobots/bijou`.
66
69
 
67
70
  See [ARCHITECTURE.md](./ARCHITECTURE.md) for how the adapter maps to Node.js APIs, and [GUIDE.md](./GUIDE.md) for usage patterns.
71
+ For upgrading existing apps, see [`../../docs/MIGRATING_TO_V3.md`](../../docs/MIGRATING_TO_V3.md).
68
72
 
69
73
  ## Related Packages
70
74
 
package/dist/index.d.ts CHANGED
@@ -10,11 +10,14 @@
10
10
  */
11
11
  import type { BijouContext } from '@flyingrobots/bijou';
12
12
  /** Re-export the Node.js {@link RuntimePort} factory. */
13
- export { nodeRuntime } from './runtime.js';
13
+ export { nodeRuntime, detectRefreshRate } from './runtime.js';
14
14
  /** Re-export the Node.js {@link IOPort} factory. */
15
15
  export { nodeIO } from './io.js';
16
16
  /** Re-export the Chalk-based {@link StylePort} factory and its options type. */
17
17
  export { chalkStyle, type ChalkStyleOptions } from './style.js';
18
+ /** Re-export Worker utilities for multi-threaded applications. */
19
+ export { isBijouWorker, runInWorker, sendToMain, startWorkerApp, type RunWorkerOptions } from './worker/worker.js';
20
+ export { recordDemoGif, rasterizeSurface, writeSurfaceGif, type NativeDemoSpec, type RecorderResult, type SurfaceGifOptions, } from './recorder.js';
18
21
  /**
19
22
  * Create a {@link BijouContext} wired to Node.js adapters.
20
23
  *
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,yDAAyD;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,oDAAoD;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,gFAAgF;AAChF,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhE;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,CAQhD;AAQD;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAQjD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,yDAAyD;AACzD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC9D,oDAAoD;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,gFAAgF;AAChF,OAAO,EAAE,UAAU,EAAE,KAAK,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEhE,kEAAkE;AAClE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACnH,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,IAAI,YAAY,CAUhD;AAQD;;;;;GAKG;AACH,wBAAgB,2BAA2B,IAAI,IAAI,CAElD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,IAAI,YAAY,CAQjD"}
package/dist/index.js CHANGED
@@ -13,11 +13,14 @@ import { nodeRuntime } from './runtime.js';
13
13
  import { nodeIO } from './io.js';
14
14
  import { chalkStyle } from './style.js';
15
15
  /** Re-export the Node.js {@link RuntimePort} factory. */
16
- export { nodeRuntime } from './runtime.js';
16
+ export { nodeRuntime, detectRefreshRate } from './runtime.js';
17
17
  /** Re-export the Node.js {@link IOPort} factory. */
18
18
  export { nodeIO } from './io.js';
19
19
  /** Re-export the Chalk-based {@link StylePort} factory and its options type. */
20
20
  export { chalkStyle } from './style.js';
21
+ /** Re-export Worker utilities for multi-threaded applications. */
22
+ export { isBijouWorker, runInWorker, sendToMain, startWorkerApp } from './worker/worker.js';
23
+ export { recordDemoGif, rasterizeSurface, writeSurfaceGif, } from './recorder.js';
21
24
  /**
22
25
  * Create a {@link BijouContext} wired to Node.js adapters.
23
26
  *
@@ -31,10 +34,12 @@ export { chalkStyle } from './style.js';
31
34
  export function createNodeContext() {
32
35
  const runtime = nodeRuntime();
33
36
  const noColor = runtime.env('NO_COLOR') !== undefined;
37
+ // Force level 3 (truecolor) if NO_COLOR is not set,
38
+ // as the user is explicitly requesting a rich dashboard experience.
34
39
  return createBijou({
35
40
  runtime,
36
41
  io: nodeIO(),
37
- style: chalkStyle(noColor),
42
+ style: chalkStyle({ noColor, level: noColor ? 0 : 3 }),
38
43
  });
39
44
  }
40
45
  /**
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,yDAAyD;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,oDAAoD;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,gFAAgF;AAChF,OAAO,EAAE,UAAU,EAA0B,MAAM,YAAY,CAAC;AAEhE;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC;IACtD,OAAO,WAAW,CAAC;QACjB,OAAO;QACP,EAAE,EAAE,MAAM,EAAE;QACZ,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC;KAC3B,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B;IACzC,WAAW,GAAG,KAAK,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACvB,WAAW,GAAG,IAAI,CAAC;QACnB,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,iBAAiB,EAAE,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,yDAAyD;AACzD,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAC9D,oDAAoD;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,gFAAgF;AAChF,OAAO,EAAE,UAAU,EAA0B,MAAM,YAAY,CAAC;AAEhE,kEAAkE;AAClE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAyB,MAAM,oBAAoB,CAAC;AACnH,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,eAAe,GAIhB,MAAM,eAAe,CAAC;AAEvB;;;;;;;;;GASG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,SAAS,CAAC;IACtD,qDAAqD;IACrD,oEAAoE;IACpE,OAAO,WAAW,CAAC;QACjB,OAAO;QACP,EAAE,EAAE,MAAM,EAAE;QACZ,KAAK,EAAE,UAAU,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,IAAI,WAAW,GAAG,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B;IACzC,WAAW,GAAG,KAAK,CAAC;AACtB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,iBAAiB,EAAE,CAAC;QAChC,iBAAiB,CAAC,GAAG,CAAC,CAAC;QACvB,WAAW,GAAG,IAAI,CAAC;QACnB,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,iBAAiB,EAAE,CAAC;AAC7B,CAAC"}
package/dist/io.d.ts CHANGED
@@ -1,4 +1,9 @@
1
- import type { IOPort } from '@flyingrobots/bijou';
1
+ import { type ClockPort, type IOPort } from '@flyingrobots/bijou';
2
+ /** Optional overrides for {@link nodeIO}. */
3
+ export interface NodeIOOptions {
4
+ /** Clock override for deterministic timer scheduling in tests. */
5
+ clock?: ClockPort;
6
+ }
2
7
  /**
3
8
  * Create an {@link IOPort} backed by Node.js I/O primitives.
4
9
  *
@@ -7,7 +12,8 @@ import type { IOPort } from '@flyingrobots/bijou';
7
12
  * `rawInput`, `onResize`, and `setInterval` clean up their underlying
8
13
  * resources when `dispose()` is called.
9
14
  *
15
+ * @param options - Optional runtime overrides such as a deterministic clock for tests.
10
16
  * @returns An {@link IOPort} bound to the current Node.js process.
11
17
  */
12
- export declare function nodeIO(): IOPort;
18
+ export declare function nodeIO(options?: NodeIOOptions): IOPort;
13
19
  //# sourceMappingURL=io.d.ts.map
package/dist/io.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,MAAM,EAA+B,MAAM,qBAAqB,CAAC;AAE/E;;;;;;;;;GASG;AACH,wBAAgB,MAAM,IAAI,MAAM,CAuJ/B"}
1
+ {"version":3,"file":"io.d.ts","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"AAGA,OAAO,EAAgB,KAAK,SAAS,EAAE,KAAK,MAAM,EAAyC,MAAM,qBAAqB,CAAC;AAEvH,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,kEAAkE;IAClE,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,MAAM,CAAC,OAAO,GAAE,aAAkB,GAAG,MAAM,CAkJ1D"}
package/dist/io.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import * as readline from 'readline';
2
2
  import { readFileSync, readdirSync } from 'fs';
3
3
  import { join } from 'path';
4
+ import { resolveClock } from '@flyingrobots/bijou';
4
5
  /**
5
6
  * Create an {@link IOPort} backed by Node.js I/O primitives.
6
7
  *
@@ -9,9 +10,11 @@ import { join } from 'path';
9
10
  * `rawInput`, `onResize`, and `setInterval` clean up their underlying
10
11
  * resources when `dispose()` is called.
11
12
  *
13
+ * @param options - Optional runtime overrides such as a deterministic clock for tests.
12
14
  * @returns An {@link IOPort} bound to the current Node.js process.
13
15
  */
14
- export function nodeIO() {
16
+ export function nodeIO(options = {}) {
17
+ const clock = resolveClock(options.clock);
15
18
  return {
16
19
  /**
17
20
  * Write a string directly to `process.stdout`.
@@ -109,13 +112,7 @@ export function nodeIO() {
109
112
  * @returns A {@link TimerHandle} that cancels the timer on disposal.
110
113
  */
111
114
  setInterval(callback, ms) {
112
- const id = globalThis.setInterval(callback, ms);
113
- return {
114
- /** Cancel the repeating timer. */
115
- dispose() {
116
- clearInterval(id);
117
- },
118
- };
115
+ return clock.setInterval(callback, ms);
119
116
  },
120
117
  /**
121
118
  * Read an entire file synchronously as a UTF-8 string.
package/dist/io.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"io.js","sourceRoot":"","sources":["../src/io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import { type BijouContext, type Surface } from '@flyingrobots/bijou';
2
+ import { type App, type ScriptStep } from '@flyingrobots/bijou-tui';
3
+ export interface NativeDemoSpec<Model, M = never> {
4
+ name: string;
5
+ app: App<Model, M>;
6
+ steps: ScriptStep<M>[];
7
+ outputPath: string;
8
+ ctx?: BijouContext;
9
+ css?: string;
10
+ frameDelayMs?: number;
11
+ cellWidth?: number;
12
+ cellHeight?: number;
13
+ foreground?: string;
14
+ background?: string;
15
+ }
16
+ export interface RecorderResult {
17
+ outputPath: string;
18
+ frames: number;
19
+ width: number;
20
+ height: number;
21
+ }
22
+ export interface SurfaceGifOptions {
23
+ outputPath: string;
24
+ frames: Surface[];
25
+ frameDelayMs?: number;
26
+ cellWidth?: number;
27
+ cellHeight?: number;
28
+ foreground?: string;
29
+ background?: string;
30
+ }
31
+ interface RasterizeOptions {
32
+ cellWidth: number;
33
+ cellHeight: number;
34
+ foreground: string;
35
+ background: string;
36
+ }
37
+ export declare function recordDemoGif<Model, M = never>(spec: NativeDemoSpec<Model, M>): Promise<RecorderResult>;
38
+ export declare function writeSurfaceGif(options: SurfaceGifOptions): RecorderResult;
39
+ export declare function rasterizeSurface(surface: Surface, options?: Partial<RasterizeOptions>): Uint8Array;
40
+ export {};
41
+ //# sourceMappingURL=recorder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.d.ts","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAa,KAAK,GAAG,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAe/E,MAAM,WAAW,cAAc,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK;IAC9C,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,CAAC,GAAG,KAAK,EAClD,IAAI,EAAE,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,GAC7B,OAAO,CAAC,cAAc,CAAC,CAezB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,iBAAiB,GAAG,cAAc,CAuC1E;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,UAAU,CAgBlG"}
@@ -0,0 +1,213 @@
1
+ import { mkdirSync, writeFileSync } from 'node:fs';
2
+ import { dirname } from 'node:path';
3
+ import { createRequire } from 'node:module';
4
+ import { createSurface } from '@flyingrobots/bijou';
5
+ import { runScript } from '@flyingrobots/bijou-tui';
6
+ const require = createRequire(import.meta.url);
7
+ const { GIFEncoder, applyPalette, quantize } = require('gifenc');
8
+ const FONT = require('oled-font-5x7');
9
+ const GLYPH_MAP = new Map(FONT.lookup.map((char, index) => [char, index]));
10
+ const DEFAULT_FOREGROUND = '#f5f7ff';
11
+ const DEFAULT_BACKGROUND = '#0b1020';
12
+ export async function recordDemoGif(spec) {
13
+ const result = await runScript(spec.app, spec.steps, {
14
+ ctx: spec.ctx,
15
+ css: spec.css,
16
+ });
17
+ return writeSurfaceGif({
18
+ outputPath: spec.outputPath,
19
+ frames: result.frames,
20
+ frameDelayMs: spec.frameDelayMs,
21
+ cellWidth: spec.cellWidth,
22
+ cellHeight: spec.cellHeight,
23
+ foreground: spec.foreground,
24
+ background: spec.background,
25
+ });
26
+ }
27
+ export function writeSurfaceGif(options) {
28
+ if (options.frames.length === 0) {
29
+ throw new Error('writeSurfaceGif() requires at least one frame');
30
+ }
31
+ const rasterOptions = {
32
+ cellWidth: options.cellWidth ?? 8,
33
+ cellHeight: options.cellHeight ?? 10,
34
+ foreground: options.foreground ?? DEFAULT_FOREGROUND,
35
+ background: options.background ?? DEFAULT_BACKGROUND,
36
+ };
37
+ const width = Math.max(...options.frames.map((frame) => frame.width));
38
+ const height = Math.max(...options.frames.map((frame) => frame.height));
39
+ const frames = options.frames
40
+ .map((frame) => normalizeSurfaceFrame(frame, width, height))
41
+ .map((frame) => rasterizeSurface(frame, rasterOptions));
42
+ const palette = quantize(joinFrames(frames), 256, { format: 'rgb565' });
43
+ const gif = GIFEncoder();
44
+ const delay = Math.max(2, Math.round((options.frameDelayMs ?? 90) / 10));
45
+ for (const frame of frames) {
46
+ const indexed = applyPalette(frame, palette);
47
+ gif.writeFrame(indexed, width * rasterOptions.cellWidth, height * rasterOptions.cellHeight, {
48
+ palette,
49
+ delay,
50
+ });
51
+ }
52
+ gif.finish();
53
+ mkdirSync(dirname(options.outputPath), { recursive: true });
54
+ writeFileSync(options.outputPath, Buffer.from(gif.bytes()));
55
+ return {
56
+ outputPath: options.outputPath,
57
+ frames: frames.length,
58
+ width: width * rasterOptions.cellWidth,
59
+ height: height * rasterOptions.cellHeight,
60
+ };
61
+ }
62
+ export function rasterizeSurface(surface, options) {
63
+ const cellWidth = options?.cellWidth ?? 8;
64
+ const cellHeight = options?.cellHeight ?? 10;
65
+ const foreground = options?.foreground ?? DEFAULT_FOREGROUND;
66
+ const background = options?.background ?? DEFAULT_BACKGROUND;
67
+ const width = surface.width * cellWidth;
68
+ const height = surface.height * cellHeight;
69
+ const rgba = new Uint8Array(width * height * 4);
70
+ for (let y = 0; y < surface.height; y++) {
71
+ for (let x = 0; x < surface.width; x++) {
72
+ drawCell(rgba, width, height, x, y, cellWidth, cellHeight, surface.get(x, y), foreground, background);
73
+ }
74
+ }
75
+ return rgba;
76
+ }
77
+ function drawCell(rgba, width, height, cellX, cellY, cellWidth, cellHeight, cell, fallbackForeground, fallbackBackground) {
78
+ const modifiers = new Set(cell.modifiers ?? []);
79
+ let fg = parseHex(cell.fg ?? fallbackForeground);
80
+ let bg = parseHex(cell.bg ?? fallbackBackground);
81
+ if (modifiers.has('inverse')) {
82
+ [fg, bg] = [bg, fg];
83
+ }
84
+ if (modifiers.has('dim')) {
85
+ fg = mixRgb(fg, bg, 0.45);
86
+ }
87
+ const pixelX = cellX * cellWidth;
88
+ const pixelY = cellY * cellHeight;
89
+ fillRect(rgba, width, height, pixelX, pixelY, cellWidth, cellHeight, bg);
90
+ if (cell.empty || cell.char === ' ') {
91
+ return;
92
+ }
93
+ const drawn = drawSpecialGlyph(rgba, width, height, pixelX, pixelY, cellWidth, cellHeight, cell.char, fg);
94
+ if (!drawn) {
95
+ drawBitmapGlyph(rgba, width, height, pixelX + 1, pixelY + 1, cell.char, fg);
96
+ }
97
+ if (modifiers.has('bold')) {
98
+ const boldDrawn = drawSpecialGlyph(rgba, width, height, pixelX + 1, pixelY, cellWidth, cellHeight, cell.char, fg);
99
+ if (!boldDrawn) {
100
+ drawBitmapGlyph(rgba, width, height, pixelX + 2, pixelY + 1, cell.char, fg);
101
+ }
102
+ }
103
+ if (modifiers.has('underline')) {
104
+ fillRect(rgba, width, height, pixelX + 1, pixelY + cellHeight - 2, cellWidth - 2, 1, fg);
105
+ }
106
+ if (modifiers.has('strike')) {
107
+ fillRect(rgba, width, height, pixelX + 1, pixelY + Math.floor(cellHeight / 2), cellWidth - 2, 1, fg);
108
+ }
109
+ }
110
+ function drawBitmapGlyph(rgba, width, height, x, y, char, color) {
111
+ const glyphIndex = GLYPH_MAP.get(char);
112
+ if (glyphIndex == null) {
113
+ fillRect(rgba, width, height, x + 1, y + 2, 3, 3, color);
114
+ return;
115
+ }
116
+ const offset = glyphIndex * FONT.width;
117
+ for (let col = 0; col < FONT.width; col++) {
118
+ const bits = FONT.fontData[offset + col] ?? 0;
119
+ for (let row = 0; row < FONT.height; row++) {
120
+ if (((bits >> row) & 1) === 1) {
121
+ setPixel(rgba, width, height, x + col, y + row, color);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ function drawSpecialGlyph(rgba, width, height, x, y, cellWidth, cellHeight, char, color) {
127
+ const midX = x + Math.floor(cellWidth / 2);
128
+ const midY = y + Math.floor(cellHeight / 2);
129
+ const right = x + cellWidth - 2;
130
+ const bottom = y + cellHeight - 2;
131
+ switch (char) {
132
+ case '─':
133
+ fillRect(rgba, width, height, x + 1, midY, cellWidth - 2, 1, color);
134
+ return true;
135
+ case '│':
136
+ fillRect(rgba, width, height, midX, y + 1, 1, cellHeight - 2, color);
137
+ return true;
138
+ case '┌':
139
+ fillRect(rgba, width, height, midX, midY, right - midX + 1, 1, color);
140
+ fillRect(rgba, width, height, midX, midY, 1, bottom - midY + 1, color);
141
+ return true;
142
+ case '┐':
143
+ fillRect(rgba, width, height, x + 1, midY, midX - x, 1, color);
144
+ fillRect(rgba, width, height, midX, midY, 1, bottom - midY + 1, color);
145
+ return true;
146
+ case '└':
147
+ fillRect(rgba, width, height, midX, y + 1, 1, midY - y, color);
148
+ fillRect(rgba, width, height, midX, midY, right - midX + 1, 1, color);
149
+ return true;
150
+ case '┘':
151
+ fillRect(rgba, width, height, x + 1, midY, midX - x, 1, color);
152
+ fillRect(rgba, width, height, midX, y + 1, 1, midY - y, color);
153
+ return true;
154
+ case '▎':
155
+ fillRect(rgba, width, height, x + 1, y + 1, 1, cellHeight - 2, color);
156
+ return true;
157
+ default:
158
+ return false;
159
+ }
160
+ }
161
+ function fillRect(rgba, width, height, x, y, w, h, color) {
162
+ for (let row = 0; row < h; row++) {
163
+ for (let col = 0; col < w; col++) {
164
+ setPixel(rgba, width, height, x + col, y + row, color);
165
+ }
166
+ }
167
+ }
168
+ function setPixel(rgba, width, height, x, y, color) {
169
+ if (x < 0 || y < 0 || x >= width || y >= height)
170
+ return;
171
+ const idx = (y * width + x) * 4;
172
+ rgba[idx] = color.r;
173
+ rgba[idx + 1] = color.g;
174
+ rgba[idx + 2] = color.b;
175
+ rgba[idx + 3] = 255;
176
+ }
177
+ function joinFrames(frames) {
178
+ const total = frames.reduce((sum, frame) => sum + frame.length, 0);
179
+ const joined = new Uint8Array(total);
180
+ let offset = 0;
181
+ for (const frame of frames) {
182
+ joined.set(frame, offset);
183
+ offset += frame.length;
184
+ }
185
+ return joined;
186
+ }
187
+ function normalizeSurfaceFrame(surface, width, height) {
188
+ if (surface.width === width && surface.height === height) {
189
+ return surface;
190
+ }
191
+ const normalized = createSurface(width, height);
192
+ normalized.blit(surface, 0, 0);
193
+ return normalized;
194
+ }
195
+ function parseHex(hex) {
196
+ const normalized = hex.replace('#', '');
197
+ if (normalized.length !== 6)
198
+ return { r: 255, g: 255, b: 255 };
199
+ return {
200
+ r: parseInt(normalized.slice(0, 2), 16),
201
+ g: parseInt(normalized.slice(2, 4), 16),
202
+ b: parseInt(normalized.slice(4, 6), 16),
203
+ };
204
+ }
205
+ function mixRgb(a, b, ratio) {
206
+ const t = Math.max(0, Math.min(1, ratio));
207
+ return {
208
+ r: Math.round(a.r * (1 - t) + b.r * t),
209
+ g: Math.round(a.g * (1 - t) + b.g * t),
210
+ b: Math.round(a.b * (1 - t) + b.b * t),
211
+ };
212
+ }
213
+ //# sourceMappingURL=recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../src/recorder.ts"],"names":[],"mappings":"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"}
package/dist/runtime.d.ts CHANGED
@@ -1,4 +1,13 @@
1
1
  import type { RuntimePort } from '@flyingrobots/bijou';
2
+ /**
3
+ * Attempt to detect the system's refresh rate in Hz.
4
+ *
5
+ * Currently defaults to 60, but provides an anchor for future
6
+ * platform-specific detection (e.g. via native calls or shell commands).
7
+ *
8
+ * @returns Detected refresh rate or 60.
9
+ */
10
+ export declare function detectRefreshRate(): number;
2
11
  /**
3
12
  * Create a {@link RuntimePort} backed by Node.js `process` globals.
4
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;;;;;;GASG;AACH,wBAAgB,WAAW,IAAI,WAAW,CA0BzC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAU1C;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,IAAI,WAAW,CA8BzC"}
package/dist/runtime.js CHANGED
@@ -1,3 +1,21 @@
1
+ /**
2
+ * Attempt to detect the system's refresh rate in Hz.
3
+ *
4
+ * Currently defaults to 60, but provides an anchor for future
5
+ * platform-specific detection (e.g. via native calls or shell commands).
6
+ *
7
+ * @returns Detected refresh rate or 60.
8
+ */
9
+ export function detectRefreshRate() {
10
+ const envFps = process.env['BIJOU_FPS'];
11
+ if (envFps) {
12
+ const parsed = parseInt(envFps, 10);
13
+ if (!isNaN(parsed) && parsed > 0)
14
+ return parsed;
15
+ }
16
+ // Future: add platform-specific detection logic here
17
+ return 60;
18
+ }
1
19
  /**
2
20
  * Create a {@link RuntimePort} backed by Node.js `process` globals.
3
21
  *
@@ -33,6 +51,10 @@ export function nodeRuntime() {
33
51
  get rows() {
34
52
  return process.stdout.rows ?? 24;
35
53
  },
54
+ /** Refresh rate in FPS. Defaults to 60, or BIJOU_FPS if set. */
55
+ get refreshRate() {
56
+ return detectRefreshRate();
57
+ },
36
58
  };
37
59
  }
38
60
  //# sourceMappingURL=runtime.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;QACL;;;WAGG;QACH,GAAG,CAAC,GAAW;YACb,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,4EAA4E;QAC5E,IAAI,WAAW;YACb,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;QACvC,CAAC;QACD,2EAA2E;QAC3E,IAAI,UAAU;YACZ,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;QACtC,CAAC;QACD,2EAA2E;QAC3E,IAAI,OAAO;YACT,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,yEAAyE;QACzE,IAAI,IAAI;YACN,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,MAAM,CAAC;IAClD,CAAC;IAED,qDAAqD;IAErD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO;QACL;;;WAGG;QACH,GAAG,CAAC,GAAW;YACb,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;QACD,4EAA4E;QAC5E,IAAI,WAAW;YACb,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,KAAK,CAAC;QACvC,CAAC;QACD,2EAA2E;QAC3E,IAAI,UAAU;YACZ,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC;QACtC,CAAC;QACD,2EAA2E;QAC3E,IAAI,OAAO;YACT,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACtC,CAAC;QACD,yEAAyE;QACzE,IAAI,IAAI;YACN,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACnC,CAAC;QACD,gEAAgE;QAChE,IAAI,WAAW;YACb,OAAO,iBAAiB,EAAE,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
package/dist/style.js CHANGED
@@ -83,7 +83,10 @@ export function chalkStyle(arg) {
83
83
  styled(token, text) {
84
84
  if (!ansiEnabled)
85
85
  return text;
86
- const base = instance.hex(token.hex);
86
+ let base = instance;
87
+ if (token.hex) {
88
+ base = instance.hex(token.hex);
89
+ }
87
90
  let result = applyModifiers(base, token.modifiers)(text);
88
91
  result = applyUnderlineVariants(result, token.modifiers);
89
92
  // Note: bg is applied unconditionally when noColor is false.
package/dist/style.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"style.js","sourceRoot":"","sources":["../src/style.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=echo-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"echo-worker.d.ts","sourceRoot":"","sources":["../../../src/worker/fixtures/echo-worker.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { isMainThread, parentPort } from 'node:worker_threads';
2
+ if (!isMainThread && parentPort) {
3
+ parentPort.postMessage({ type: 'render:frame', output: 'worker:booting' });
4
+ parentPort.on('message', (msg) => {
5
+ if (msg.type === 'data') {
6
+ const text = msg.payload?.text ?? 'unknown';
7
+ parentPort.postMessage({ type: 'data', payload: { type: 'ack', text } });
8
+ parentPort.postMessage({ type: 'render:frame', output: `worker:${text}` });
9
+ parentPort.postMessage({ type: 'quit' });
10
+ }
11
+ });
12
+ }
13
+ //# sourceMappingURL=echo-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"echo-worker.js","sourceRoot":"","sources":["../../../src/worker/fixtures/echo-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAE/D,IAAI,CAAC,YAAY,IAAI,UAAU,EAAE,CAAC;IAChC,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAE3E,UAAU,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAkD,EAAE,EAAE;QAC9E,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,SAAS,CAAC;YAC5C,UAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1E,UAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5E,UAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { type BijouContext } from '@flyingrobots/bijou';
2
+ import type { App, RunOptions } from '@flyingrobots/bijou-tui';
3
+ interface WorkerInstance {
4
+ postMessage(message: unknown): void;
5
+ on(event: string, handler: (value: any) => void): void;
6
+ terminate(): Promise<number>;
7
+ }
8
+ interface WorkerParentPort {
9
+ on(event: string, listener: (msg: any) => void): void;
10
+ off(event: string, listener: (msg: any) => void): void;
11
+ postMessage(message: unknown): void;
12
+ }
13
+ interface WorkerThreadBindings {
14
+ isMainThread: boolean;
15
+ parentPort: WorkerParentPort | null;
16
+ workerData: unknown;
17
+ createWorker(entry: string, options: Record<string, unknown>): WorkerInstance;
18
+ createNodeContext(): BijouContext;
19
+ runApp<Model, M>(app: App<Model, M>, options: RunOptions<M>): Promise<void>;
20
+ scheduleTimeout(callback: () => void, ms: number): ReturnType<typeof setTimeout>;
21
+ }
22
+ export type WorkerMessage = {
23
+ type: 'io:data';
24
+ data: string;
25
+ } | {
26
+ type: 'io:resize';
27
+ columns: number;
28
+ rows: number;
29
+ } | {
30
+ type: 'data';
31
+ payload: unknown;
32
+ } | {
33
+ type: 'quit';
34
+ };
35
+ export type MainMessage = {
36
+ type: 'render:frame';
37
+ output: string;
38
+ } | {
39
+ type: 'error';
40
+ message: string;
41
+ } | {
42
+ type: 'data';
43
+ payload: unknown;
44
+ } | {
45
+ type: 'quit';
46
+ };
47
+ /**
48
+ * Checks if the current environment is running inside a Bijou Worker.
49
+ */
50
+ export declare function isBijouWorker(): boolean;
51
+ /**
52
+ * Sends a custom data message from the worker to the main thread.
53
+ * This will be received via the `onMessage` callback in `runInWorker`.
54
+ */
55
+ export declare function sendToMain(payload: unknown): void;
56
+ /**
57
+ * Options for starting an app in a background worker.
58
+ */
59
+ export interface RunWorkerOptions {
60
+ /** The absolute path to the file containing the worker entry point. */
61
+ entry: string;
62
+ /** Optional Bijou context for the host thread. */
63
+ ctx?: BijouContext;
64
+ /** Enter the alternate screen buffer on startup. */
65
+ altScreen?: boolean;
66
+ /** Hide the cursor on startup. */
67
+ hideCursor?: boolean;
68
+ /** Enable mouse input (SGR mode). */
69
+ mouse?: boolean;
70
+ /** Optional BCSS stylesheet string. */
71
+ css?: string;
72
+ /** Optional callback for custom data messages sent from the worker via `sendToMain`. */
73
+ onMessage?: (payload: unknown) => void;
74
+ /** Optional arguments passed to the Node.js worker process (e.g. ['--import', 'tsx']). */
75
+ execArgv?: string[];
76
+ }
77
+ /**
78
+ * Handle for a running background worker.
79
+ */
80
+ export interface WorkerHandle {
81
+ /** Sends a custom data message to the worker thread. */
82
+ send(payload: unknown): void;
83
+ /** Forcefully terminates the worker thread. */
84
+ terminate(): Promise<void>;
85
+ /** A promise that resolves when the worker exits cleanly. */
86
+ onExit: Promise<void>;
87
+ }
88
+ /**
89
+ * Spawns a background worker thread to run the TEA application.
90
+ * The main thread delegates all logic to the worker, only handling raw I/O
91
+ * and frame rendering (to keep the TTY responsive).
92
+ *
93
+ * @param options - Configuration including the path to the worker entry file.
94
+ * @returns A handle to the running worker.
95
+ */
96
+ export declare function runInWorker(options: RunWorkerOptions, bindings?: WorkerThreadBindings): WorkerHandle;
97
+ /**
98
+ * The entry point for the worker thread. Must be called in the file
99
+ * specified by `options.entry` in `runInWorker()`.
100
+ *
101
+ * Intercepts the normal `run()` execution, redirecting I/O to the parent port.
102
+ *
103
+ * @param app - The TEA app to run.
104
+ */
105
+ export declare function startWorkerApp<Model, M>(app: App<Model, M>, bindings?: WorkerThreadBindings): Promise<void>;
106
+ export {};
107
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,229 @@
1
+ import { Worker, isMainThread, parentPort, workerData } from 'node:worker_threads';
2
+ import { resolve as resolvePath } from 'node:path';
3
+ import { installRuntimeViewportOverlay, readRuntimeViewport, updateRuntimeViewport, } from '@flyingrobots/bijou';
4
+ import { run } from '@flyingrobots/bijou-tui';
5
+ import { createNodeContext } from '../index.js';
6
+ function defaultWorkerThreadBindings() {
7
+ return {
8
+ isMainThread,
9
+ parentPort,
10
+ workerData,
11
+ createWorker(entry, options) {
12
+ return new Worker(entry, options);
13
+ },
14
+ createNodeContext,
15
+ runApp: run,
16
+ scheduleTimeout(callback, ms) {
17
+ return setTimeout(callback, ms);
18
+ },
19
+ };
20
+ }
21
+ // ---------------------------------------------------------------------------
22
+ // Worker Environment API
23
+ // ---------------------------------------------------------------------------
24
+ /**
25
+ * Checks if the current environment is running inside a Bijou Worker.
26
+ */
27
+ export function isBijouWorker() {
28
+ const bindings = defaultWorkerThreadBindings();
29
+ return !bindings.isMainThread && bindings.workerData?.isBijouWorker === true;
30
+ }
31
+ /**
32
+ * Sends a custom data message from the worker to the main thread.
33
+ * This will be received via the `onMessage` callback in `runInWorker`.
34
+ */
35
+ export function sendToMain(payload) {
36
+ const bindings = defaultWorkerThreadBindings();
37
+ if (bindings.parentPort) {
38
+ bindings.parentPort.postMessage({ type: 'data', payload });
39
+ }
40
+ }
41
+ /**
42
+ * Spawns a background worker thread to run the TEA application.
43
+ * The main thread delegates all logic to the worker, only handling raw I/O
44
+ * and frame rendering (to keep the TTY responsive).
45
+ *
46
+ * @param options - Configuration including the path to the worker entry file.
47
+ * @returns A handle to the running worker.
48
+ */
49
+ export function runInWorker(options, bindings = defaultWorkerThreadBindings()) {
50
+ if (!bindings.isMainThread) {
51
+ throw new Error('runInWorker must be called from the main thread.');
52
+ }
53
+ const ctx = options.ctx ?? bindings.createNodeContext();
54
+ installRuntimeViewportOverlay(ctx);
55
+ const useAltScreen = options.altScreen ?? true;
56
+ const useHideCursor = options.hideCursor ?? true;
57
+ const useMouse = options.mouse ?? false;
58
+ // Setup main thread screen
59
+ if (useAltScreen || useHideCursor) {
60
+ ctx.io.write('\x1b[?1049h'); // ENTER_ALT_SCREEN
61
+ if (useHideCursor)
62
+ ctx.io.write('\x1b[?25l'); // HIDE_CURSOR
63
+ }
64
+ if (useMouse) {
65
+ ctx.io.write('\x1b[?1000h\x1b[?1002h\x1b[?1006h'); // ENABLE_MOUSE
66
+ }
67
+ // Spawn the worker with structured-clone-safe options only.
68
+ const serializableOptions = {
69
+ altScreen: options.altScreen,
70
+ hideCursor: options.hideCursor,
71
+ mouse: options.mouse,
72
+ css: options.css,
73
+ };
74
+ const worker = bindings.createWorker(resolvePath(options.entry), {
75
+ workerData: {
76
+ isBijouWorker: true,
77
+ options: serializableOptions,
78
+ runtime: readRuntimeViewport(ctx.runtime),
79
+ },
80
+ execArgv: options.execArgv,
81
+ // Pipe stdout/stderr so we can capture logs if needed, but primarily use IPC
82
+ });
83
+ // 1. Pipe Main Stdin -> Worker IPC
84
+ const inputHandle = ctx.io.rawInput((data) => {
85
+ worker.postMessage({ type: 'io:data', data });
86
+ });
87
+ const resizeHandle = ctx.io.onResize((columns, rows) => {
88
+ const nextViewport = updateRuntimeViewport(ctx.runtime, columns, rows);
89
+ worker.postMessage({ type: 'io:resize', ...nextViewport });
90
+ });
91
+ const onExit = new Promise((resolve, reject) => {
92
+ let requestedQuit = false;
93
+ let forcedTerminate = false;
94
+ // 2. Pipe Worker IPC -> Main Stdout
95
+ worker.on('message', (msg) => {
96
+ if (msg.type === 'render:frame') {
97
+ ctx.io.write(msg.output);
98
+ }
99
+ else if (msg.type === 'error') {
100
+ if (ctx.io.writeError)
101
+ ctx.io.writeError(msg.message);
102
+ else
103
+ ctx.io.write(msg.message);
104
+ }
105
+ else if (msg.type === 'data') {
106
+ if (options.onMessage)
107
+ options.onMessage(msg.payload);
108
+ }
109
+ else if (msg.type === 'quit') {
110
+ requestedQuit = true;
111
+ bindings.scheduleTimeout(() => {
112
+ if (requestedQuit) {
113
+ forcedTerminate = true;
114
+ void worker.terminate();
115
+ }
116
+ }, 50);
117
+ }
118
+ });
119
+ worker.on('error', (err) => {
120
+ cleanup();
121
+ reject(err);
122
+ });
123
+ worker.on('exit', (code) => {
124
+ cleanup();
125
+ if (requestedQuit && (code === 0 || forcedTerminate)) {
126
+ resolve();
127
+ return;
128
+ }
129
+ if (code !== 0)
130
+ reject(new Error(`Worker stopped with exit code ${code}`));
131
+ else
132
+ resolve();
133
+ });
134
+ function cleanup() {
135
+ inputHandle.dispose();
136
+ resizeHandle.dispose();
137
+ if (useMouse) {
138
+ ctx.io.write('\x1b[?1000l\x1b[?1002l\x1b[?1006l'); // DISABLE_MOUSE
139
+ }
140
+ if (useAltScreen || useHideCursor) {
141
+ ctx.io.write('\x1b[?1049l'); // EXIT_ALT_SCREEN
142
+ if (useHideCursor)
143
+ ctx.io.write('\x1b[?25h'); // SHOW_CURSOR
144
+ }
145
+ }
146
+ });
147
+ return {
148
+ send: (payload) => worker.postMessage({ type: 'data', payload }),
149
+ terminate: async () => { await worker.terminate(); },
150
+ onExit
151
+ };
152
+ }
153
+ // ---------------------------------------------------------------------------
154
+ // Worker Thread Logic
155
+ // ---------------------------------------------------------------------------
156
+ /**
157
+ * The entry point for the worker thread. Must be called in the file
158
+ * specified by `options.entry` in `runInWorker()`.
159
+ *
160
+ * Intercepts the normal `run()` execution, redirecting I/O to the parent port.
161
+ *
162
+ * @param app - The TEA app to run.
163
+ */
164
+ export async function startWorkerApp(app, bindings = defaultWorkerThreadBindings()) {
165
+ if (bindings.isMainThread || !bindings.parentPort) {
166
+ throw new Error('startWorkerApp must be called from within a worker thread.');
167
+ }
168
+ const initData = bindings.workerData;
169
+ // Create a proxy Context that speaks IPC instead of true I/O
170
+ const proxyCtx = bindings.createNodeContext();
171
+ installRuntimeViewportOverlay(proxyCtx);
172
+ const { setDefaultContext } = await import('@flyingrobots/bijou');
173
+ setDefaultContext(proxyCtx);
174
+ updateRuntimeViewport(proxyCtx.runtime, initData.runtime?.columns ?? proxyCtx.runtime.columns, initData.runtime?.rows ?? proxyCtx.runtime.rows);
175
+ // Hijack the WritePort to send frames back to main thread
176
+ proxyCtx.io.write = (data) => {
177
+ bindings.parentPort.postMessage({ type: 'render:frame', output: data });
178
+ };
179
+ proxyCtx.io.writeError = (data) => {
180
+ bindings.parentPort.postMessage({ type: 'error', message: data });
181
+ };
182
+ // We need to bypass the standard run() setup since the main thread
183
+ // already handled alt screen and mouse modes. We tell run() to do nothing.
184
+ const proxyOptions = {
185
+ ...initData.options,
186
+ ctx: proxyCtx,
187
+ altScreen: false,
188
+ hideCursor: false,
189
+ mouse: false,
190
+ };
191
+ // Override the io.rawInput to listen to IPC messages instead of process.stdin
192
+ proxyCtx.io.rawInput = (handler) => {
193
+ const listener = (msg) => {
194
+ if (msg.type === 'io:data')
195
+ handler(msg.data);
196
+ };
197
+ bindings.parentPort.on('message', listener);
198
+ return {
199
+ dispose: () => bindings.parentPort.off('message', listener)
200
+ };
201
+ };
202
+ proxyCtx.io.onResize = (handler) => {
203
+ const listener = (msg) => {
204
+ if (msg.type === 'io:resize') {
205
+ const nextViewport = updateRuntimeViewport(proxyCtx.runtime, msg.columns, msg.rows);
206
+ handler(nextViewport.columns, nextViewport.rows);
207
+ }
208
+ };
209
+ bindings.parentPort.on('message', listener);
210
+ return {
211
+ dispose: () => bindings.parentPort.off('message', listener)
212
+ };
213
+ };
214
+ proxyCtx.io.onData = (handler) => {
215
+ const listener = (msg) => {
216
+ if (msg.type === 'data')
217
+ handler(msg.payload);
218
+ };
219
+ bindings.parentPort.on('message', listener);
220
+ return {
221
+ dispose: () => bindings.parentPort.off('message', listener)
222
+ };
223
+ };
224
+ // Run the app using the proxy context
225
+ await bindings.runApp(app, proxyOptions);
226
+ // Signal main thread to shut down
227
+ bindings.parentPort.postMessage({ type: 'quit' });
228
+ }
229
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../src/worker/worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EACL,6BAA6B,EAC7B,mBAAmB,EACnB,qBAAqB,GAEtB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAwBhD,SAAS,2BAA2B;IAClC,OAAO;QACL,YAAY;QACZ,UAAU;QACV,UAAU;QACV,YAAY,CAAC,KAAK,EAAE,OAAO;YACzB,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,iBAAiB;QACjB,MAAM,EAAE,GAAG;QACX,eAAe,CAAC,QAAQ,EAAE,EAAE;YAC1B,OAAO,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;QAClC,CAAC;KACF,CAAC;AACJ,CAAC;AAkBD,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;IAC/C,OAAO,CAAC,QAAQ,CAAC,YAAY,IAAK,QAAQ,CAAC,UAAiD,EAAE,aAAa,KAAK,IAAI,CAAC;AACvH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,OAAgB;IACzC,MAAM,QAAQ,GAAG,2BAA2B,EAAE,CAAC;IAC/C,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;QACxB,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAwB,CAAC,CAAC;IACnF,CAAC;AACH,CAAC;AAwDD;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CACzB,OAAyB,EACzB,WAAiC,2BAA2B,EAAE;IAE9D,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAC,iBAAiB,EAAE,CAAC;IACxD,6BAA6B,CAAC,GAAG,CAAC,CAAC;IACnC,MAAM,YAAY,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;IAC/C,MAAM,aAAa,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IAExC,2BAA2B;IAC3B,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;QAClC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,mBAAmB;QAChD,IAAI,aAAa;YAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;IAC9D,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACb,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC,eAAe;IACpE,CAAC;IAED,4DAA4D;IAC5D,MAAM,mBAAmB,GAA8B;QACrD,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC;IAEF,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC/D,UAAU,EAAE;YACV,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,mBAAmB;YAC5B,OAAO,EAAE,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC;SAChB;QAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,6EAA6E;KAC9E,CAAC,CAAC;IAEH,mCAAmC;IACnC,MAAM,WAAW,GAAG,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,IAAY,EAAE,EAAE;QACnD,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAA0B,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,OAAe,EAAE,IAAY,EAAE,EAAE;QACrE,MAAM,YAAY,GAAG,qBAAqB,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACvE,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,YAAY,EAA0B,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnD,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,eAAe,GAAG,KAAK,CAAC;QAE5B,oCAAoC;QACpC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAgB,EAAE,EAAE;YACxC,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;gBAChC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC3B,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAChC,IAAI,GAAG,CAAC,EAAE,CAAC,UAAU;oBAAE,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;;oBACjD,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/B,IAAI,OAAO,CAAC,SAAS;oBAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxD,CAAC;iBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC/B,aAAa,GAAG,IAAI,CAAC;gBACrB,QAAQ,CAAC,eAAe,CAAC,GAAG,EAAE;oBAC5B,IAAI,aAAa,EAAE,CAAC;wBAClB,eAAe,GAAG,IAAI,CAAC;wBACvB,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;oBAC1B,CAAC;gBACH,CAAC,EAAE,EAAE,CAAC,CAAC;YACT,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,OAAO,EAAE,CAAC;YACV,IAAI,aAAa,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,eAAe,CAAC,EAAE,CAAC;gBACrD,OAAO,EAAE,CAAC;gBACV,OAAO;YACT,CAAC;YACD,IAAI,IAAI,KAAK,CAAC;gBAAE,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;;gBACtE,OAAO,EAAE,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,SAAS,OAAO;YACd,WAAW,CAAC,OAAO,EAAE,CAAC;YACtB,YAAY,CAAC,OAAO,EAAE,CAAC;YAEvB,IAAI,QAAQ,EAAE,CAAC;gBACb,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC,gBAAgB;YACrE,CAAC;YACD,IAAI,YAAY,IAAI,aAAa,EAAE,CAAC;gBAClC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,kBAAkB;gBAC/C,IAAI,aAAa;oBAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc;YAC9D,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,CAAC,OAAgB,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAA0B,CAAC;QACjG,SAAS,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM;KACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,sBAAsB;AACtB,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,GAAkB,EAClB,WAAiC,2BAA2B,EAAE;IAE9D,IAAI,QAAQ,CAAC,YAAY,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,UAA6B,CAAC;IAExD,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,EAAE,CAAC;IAC9C,6BAA6B,CAAC,QAAQ,CAAC,CAAC;IACxC,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAClE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC5B,qBAAqB,CACnB,QAAQ,CAAC,OAAO,EAChB,QAAQ,CAAC,OAAO,EAAE,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,EACrD,QAAQ,CAAC,OAAO,EAAE,IAAI,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAChD,CAAC;IAEF,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,CAAC,KAAK,GAAG,CAAC,IAAY,EAAE,EAAE;QACnC,QAAQ,CAAC,UAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAwB,CAAC,CAAC;IACjG,CAAC,CAAC;IACF,QAAQ,CAAC,EAAE,CAAC,UAAU,GAAG,CAAC,IAAY,EAAE,EAAE;QACxC,QAAQ,CAAC,UAAW,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAwB,CAAC,CAAC;IAC3F,CAAC,CAAC;IAEF,oEAAoE;IACpE,2EAA2E;IAC3E,MAAM,YAAY,GAAkB;QAClC,GAAG,QAAQ,CAAC,OAAO;QACnB,GAAG,EAAE,QAAQ;QACb,SAAS,EAAE,KAAK;QAChB,UAAU,EAAE,KAAK;QACjB,KAAK,EAAE,KAAK;KACb,CAAC;IAEF,8EAA8E;IAC9E,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,OAAO,EAAE,EAAE;QACjC,MAAM,QAAQ,GAAG,CAAC,GAAkB,EAAE,EAAE;YACtC,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC,CAAC;QACF,QAAQ,CAAC,UAAW,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC7D,CAAC;IACJ,CAAC,CAAC;IAEF,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,CAAC,OAAO,EAAE,EAAE;QACjC,MAAM,QAAQ,GAAG,CAAC,GAAkB,EAAE,EAAE;YACtC,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC7B,MAAM,YAAY,GAAG,qBAAqB,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;gBACpF,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;YACnD,CAAC;QACH,CAAC,CAAC;QACF,QAAQ,CAAC,UAAW,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC7D,CAAC;IACJ,CAAC,CAAC;IAEF,QAAQ,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,OAAO,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,CAAC,GAAkB,EAAE,EAAE;YACtC,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;gBAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC,CAAC;QACF,QAAQ,CAAC,UAAW,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAC7C,OAAO;YACL,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAW,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC;SAC7D,CAAC;IACJ,CAAC,CAAC;IAEF,sCAAsC;IACtC,MAAM,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAEzC,kCAAkC;IAClC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAwB,CAAC,CAAC;AAC1E,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@flyingrobots/bijou-node",
3
- "version": "2.1.0",
4
- "description": "Node.js adapter for bijou \u2014 chalk styling, readline I/O, process runtime.",
3
+ "version": "3.1.0",
4
+ "description": "Node.js adapter for bijou chalk styling, readline I/O, process runtime.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
7
7
  "main": "./dist/index.js",
@@ -24,10 +24,13 @@
24
24
  "lint": "tsc --noEmit"
25
25
  },
26
26
  "dependencies": {
27
- "chalk": "^5.6.2"
27
+ "@flyingrobots/bijou-tui": "3.1.0",
28
+ "chalk": "^5.6.2",
29
+ "gifenc": "^1.0.3",
30
+ "oled-font-5x7": "^1.0.3"
28
31
  },
29
32
  "peerDependencies": {
30
- "@flyingrobots/bijou": "2.1.0"
33
+ "@flyingrobots/bijou": "3.1.0"
31
34
  },
32
35
  "devDependencies": {
33
36
  "@types/node": "^22.0.0",