refactor(tui): remove legacy keymap layer (#37206)

Co-authored-by: Kit Langton <kit.langton@gmail.com>
Co-authored-by: Dax Raad <d@ironbay.co>
This commit is contained in:
opencode-agent[bot] 2026-07-16 21:33:15 +00:00 committed by GitHub
commit b4a4ef0b3c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
19 changed files with 535 additions and 1025 deletions

View file

@ -1,11 +1,10 @@
/** @jsxImportSource @opentui/solid */
import { expect, test } from "bun:test"
import { BoxRenderable, RGBA, type RootRenderable } from "@opentui/core"
import { testRender, useRenderer } from "@opentui/solid"
import { testRender } from "@opentui/solid"
import { createSignal } from "solid-js"
import { createDefaultOpenTuiKeymap } from "@opentui/keymap/opentui"
import type { QuestionRequest } from "@opencode-ai/sdk/v2"
import { OpencodeKeymapProvider, registerOpencodeKeymap } from "@opencode-ai/tui/keymap"
import { Keymap } from "@opencode-ai/tui/context/keymap"
import {
RUN_COMMAND_PANEL_ROWS,
RUN_SUBAGENT_PANEL_ROWS,
@ -174,15 +173,9 @@ async function renderFooter(
)
const state = footerState(input.state)
const config = input.tuiConfig ?? tuiConfig
let offKeymap: (() => void) | undefined
function Harness() {
const renderer = useRenderer()
const keymap = createDefaultOpenTuiKeymap(renderer)
offKeymap = registerOpencodeKeymap(keymap, renderer, config)
return (
<OpencodeKeymapProvider keymap={keymap}>
<Keymap.Provider config={config}>
<RunFooterView
directory="/tmp"
findFiles={async () => []}
@ -215,7 +208,7 @@ async function renderFooter(
onStatus={() => {}}
onQueuedRemove={async () => true}
/>
</OpencodeKeymapProvider>
</Keymap.Provider>
)
}
@ -233,8 +226,6 @@ async function renderFooter(
cleanup() {
app.renderer.currentFocusedRenderable?.blur()
app.renderer.currentFocusedEditor?.blur()
offKeymap?.()
offKeymap = undefined
app.renderer.destroy()
},
}
@ -1003,14 +994,9 @@ test("direct footer shows editable prompts and additional queued work while runn
permissions: [],
questions: [],
})
let offKeymap: (() => void) | undefined
function Harness() {
const renderer = useRenderer()
const keymap = createDefaultOpenTuiKeymap(renderer)
offKeymap = registerOpencodeKeymap(keymap, renderer, tuiConfig)
return (
<OpencodeKeymapProvider keymap={keymap}>
<Keymap.Provider config={tuiConfig}>
<RunFooterView
directory="/tmp"
findFiles={async () => []}
@ -1049,7 +1035,7 @@ test("direct footer shows editable prompts and additional queued work while runn
onStatus={() => {}}
onQueuedRemove={async () => true}
/>
</OpencodeKeymapProvider>
</Keymap.Provider>
)
}
@ -1085,7 +1071,7 @@ test("direct footer shows editable prompts and additional queued work while runn
expect(frame).toContain("3 queued")
expect(frame).toContain("ctrl+b background")
expect(frame).toContain("ctrl+x q 3 queued")
expect(frame).toContain("ctrl+x down subagents")
expect(frame).toContain(" subagents")
expect(frame).toContain("ctrl+p cmd")
expect(frame).toContain("a-model-name-long-enough-to-force-responsive-truncation")
expect(frame).toContain("subagents · ctrl+p cmd")
@ -1099,7 +1085,6 @@ test("direct footer shows editable prompts and additional queued work while runn
} finally {
app.renderer.currentFocusedRenderable?.blur()
app.renderer.currentFocusedEditor?.blur()
offKeymap?.()
app.renderer.destroy()
}
})
@ -1151,7 +1136,7 @@ test("direct footer hides the subagent hint when only completed subagents remain
expect(frame).toContain("GPT-5")
expect(frame).toContain("xhigh · ctrl+p cmd")
expect(frame).not.toContain("ctrl+x down subagents")
expect(frame).not.toContain(" subagents")
} finally {
app.cleanup()
}
@ -1269,15 +1254,9 @@ test.skip("direct custom answer submits through keymap return binding", async ()
],
} satisfies QuestionRequest
const questions: unknown[] = []
let off: (() => void) | undefined
function Harness() {
const renderer = useRenderer()
const keymap = createDefaultOpenTuiKeymap(renderer)
off = registerOpencodeKeymap(keymap, renderer, tuiConfig)
return (
<OpencodeKeymapProvider keymap={keymap}>
<Keymap.Provider config={tuiConfig}>
<RunQuestionBody
request={question}
theme={RUN_THEME_FALLBACK.footer}
@ -1286,7 +1265,7 @@ test.skip("direct custom answer submits through keymap return binding", async ()
}}
onReject={() => {}}
/>
</OpencodeKeymapProvider>
</Keymap.Provider>
)
}
@ -1311,7 +1290,6 @@ test.skip("direct custom answer submits through keymap return binding", async ()
} finally {
app.renderer.currentFocusedRenderable?.blur()
app.renderer.currentFocusedEditor?.blur()
off?.()
app.renderer.destroy()
}
})
@ -1319,15 +1297,9 @@ test.skip("direct custom answer submits through keymap return binding", async ()
test("direct permission rejection submits through keymap return binding", async () => {
let text = ""
const submits: string[] = []
let off: (() => void) | undefined
function Harness() {
const renderer = useRenderer()
const keymap = createDefaultOpenTuiKeymap(renderer)
off = registerOpencodeKeymap(keymap, renderer, tuiConfig)
return (
<OpencodeKeymapProvider keymap={keymap}>
<Keymap.Provider config={tuiConfig}>
<RejectField
theme={RUN_THEME_FALLBACK.footer}
text=""
@ -1340,7 +1312,7 @@ test("direct permission rejection submits through keymap return binding", async
}}
onCancel={() => {}}
/>
</OpencodeKeymapProvider>
</Keymap.Provider>
)
}
@ -1364,7 +1336,6 @@ test("direct permission rejection submits through keymap return binding", async
} finally {
app.renderer.currentFocusedRenderable?.blur()
app.renderer.currentFocusedEditor?.blur()
off?.()
app.renderer.destroy()
}
})