export function handleInputKey (model, key) {
const buf = model.inputBuffer || ''
const pos = model.cursorPos != null ? model.cursorPos : buf.length
if (key.name === 'return') {
if (buf.trim()) {
return { send: buf.trim(), inputBuffer: '', cursorPos: 0 }
}
return null
}
if (key.name === 'backspace') {
if (pos > 0) {
return {
inputBuffer: buf.slice(0, pos - 1) + buf.slice(pos),
cursorPos: pos - 1
}
}
return null
}
if (key.name === 'delete') {
if (pos < buf.length) {
return {
inputBuffer: buf.slice(0, pos) + buf.slice(pos + 1),
cursorPos: pos
}
}
return null
}
if (key.name === 'left') {
if (pos > 0) return { cursorPos: pos - 1 }
return null
}
if (key.name === 'right') {
if (pos < buf.length) return { cursorPos: pos + 1 }
return null
}
if (key.name === 'home' || (key.name === 'a' && key.ctrl)) {
return { cursorPos: 0 }
}
if (key.name === 'end' || (key.name === 'e' && key.ctrl)) {
return { cursorPos: buf.length }
}
// Ctrl+U: clear line
if (key.name === 'u' && key.ctrl) {
return { inputBuffer: '', cursorPos: 0 }
}
// Ctrl+W: delete word back
if (key.name === 'w' && key.ctrl) {
const before = buf.slice(0, pos)
const trimmed = before.replace(/\s*\S+\s*$/, '')
return {
inputBuffer: trimmed + buf.slice(pos),
cursorPos: trimmed.length
}
}
// Regular character input
if (!key.ctrl && !key.meta && key.sequence && key.sequence.length === 1 && key.sequence >= ' ') {
return {
inputBuffer: buf.slice(0, pos) + key.sequence + buf.slice(pos),
cursorPos: pos + 1
}
}
// Multi-byte chars (emoji, unicode)
if (!key.ctrl && !key.meta && key.sequence && key.sequence.length > 1 && !key.sequence.startsWith('\x1b')) {
return {
inputBuffer: buf.slice(0, pos) + key.sequence + buf.slice(pos),
cursorPos: pos + key.sequence.length
}
}
return null
}