diff --git a/packages/simulation/src/frontend/renderer.ts b/packages/simulation/src/frontend/renderer.ts index f10f0ec076af..b20860c1ca49 100644 --- a/packages/simulation/src/frontend/renderer.ts +++ b/packages/simulation/src/frontend/renderer.ts @@ -41,6 +41,7 @@ export const create = Effect.fn("SimulationRenderer.create")(function* ( ...options, width: cols, height: rows, + kittyKeyboard: Boolean(options.useKittyKeyboard), ...(recording ? { stdout: recording as unknown as NodeJS.WriteStream, diff --git a/packages/simulation/test/actions.test.ts b/packages/simulation/test/actions.test.ts index 6841393373d2..c5f60c8f52b0 100644 --- a/packages/simulation/test/actions.test.ts +++ b/packages/simulation/test/actions.test.ts @@ -43,6 +43,25 @@ test("normalizes named keys for OpenTUI", async () => { ]) }) +test("headless input mirrors the configured kitty keyboard protocol", async () => { + await Effect.runPromise( + Effect.scoped( + Effect.gen(function* () { + const renderer = yield* SimulationRenderer.create({ useKittyKeyboard: {} }) + const harness = createHarness(renderer) + let key: { readonly name: string; readonly source: string } | undefined + renderer.keyInput.once("keypress", (event) => { + key = event + }) + + yield* execute(harness, { type: "ui.press", key: "escape" }) + + expect(key).toMatchObject({ name: "escape", source: "kitty" }) + }), + ), + ) +}) + test("clicks a target at relative coordinates through descendant text", async () => { await Effect.runPromise( Effect.scoped(