summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2026-01-11 19:40:16 -0500
committerDax Raad <[email protected]>2026-01-11 19:40:16 -0500
commit68ed664a3f08c64061af0781bbcc345ebd245f5a (patch)
treec92d7b8c3dc6b5aafc3be0b75a78d75dbfb61941
parent3a30773874ccb92d085eddbab66d053c5d4e6326 (diff)
downloadopencode-68ed664a3f08c64061af0781bbcc345ebd245f5a.tar.gz
opencode-68ed664a3f08c64061af0781bbcc345ebd245f5a.zip
tui: fix prompt ref initialization to prevent undefined reference errors
-rw-r--r--packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx75
1 files changed, 38 insertions, 37 deletions
diff --git a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
index ad55c5268..644ac2622 100644
--- a/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
+++ b/packages/opencode/src/cli/cmd/tui/component/prompt/index.tsx
@@ -89,7 +89,7 @@ export function Prompt(props: PromptProps) {
const fileStyleId = syntax().getStyleId("extmark.file")!
const agentStyleId = syntax().getStyleId("extmark.agent")!
const pasteStyleId = syntax().getStyleId("extmark.paste")!
- let promptPartTypeId: number
+ let promptPartTypeId = 0
sdk.event.on(TuiEvent.PromptAppend.type, (evt) => {
input.insertText(evt.properties.text)
@@ -310,47 +310,44 @@ export function Prompt(props: PromptProps) {
]
})
+ const ref: PromptRef = {
+ get focused() {
+ return input.focused
+ },
+ get current() {
+ return store.prompt
+ },
+ focus() {
+ input.focus()
+ },
+ blur() {
+ input.blur()
+ },
+ set(prompt) {
+ input.setText(prompt.input)
+ setStore("prompt", prompt)
+ restoreExtmarksFromParts(prompt.parts)
+ input.gotoBufferEnd()
+ },
+ reset() {
+ input.clear()
+ input.extmarks.clear()
+ setStore("prompt", {
+ input: "",
+ parts: [],
+ })
+ setStore("extmarkToPartIndex", new Map())
+ },
+ submit() {
+ submit()
+ },
+ }
+
createEffect(() => {
if (props.visible !== false) input?.focus()
if (props.visible === false) input?.blur()
})
- onMount(() => {
- promptPartTypeId = input.extmarks.registerType("prompt-part")
- props.ref?.({
- get focused() {
- return input.focused
- },
- get current() {
- return store.prompt
- },
- focus() {
- input.focus()
- },
- blur() {
- input.blur()
- },
- set(prompt) {
- input.setText(prompt.input)
- setStore("prompt", prompt)
- restoreExtmarksFromParts(prompt.parts)
- input.gotoBufferEnd()
- },
- reset() {
- input.clear()
- input.extmarks.clear()
- setStore("prompt", {
- input: "",
- parts: [],
- })
- setStore("extmarkToPartIndex", new Map())
- },
- submit() {
- submit()
- },
- })
- })
-
function restoreExtmarksFromParts(parts: PromptInfo["parts"]) {
input.extmarks.clear()
setStore("extmarkToPartIndex", new Map())
@@ -920,6 +917,10 @@ export function Prompt(props: PromptProps) {
}}
ref={(r: TextareaRenderable) => {
input = r
+ if (promptPartTypeId === 0) {
+ promptPartTypeId = input.extmarks.registerType("prompt-part")
+ }
+ props.ref?.(ref)
setTimeout(() => {
input.cursorColor = theme.text
}, 0)