TUI keys: register both CSI and SS3 forms of the cursor/Home/End keys and
the xterm modifier sequences when terminfo lacks them, so an arrow sent in
the "other" form no longer turns into Esc + a typed letter. Up/Down move by
visual (soft-wrapped) row, and the draft survives a trip through history.
scripts/tui_keys drives the TUI in a pty to check all of this.
Images: text inside a multimodal content array is now a {"type":"text"}
part; DeepSeek rejected the bare string with HTTP 422. deepseek-flash
(and its deepseek-chat / deepseek-reasoner aliases) read images, so the
registry marks them vision; deepseek-v4-pro stays text only.
CI: models.c lost _DEFAULT_SOURCE in 0.7.0 and gmtime_r broke the musl
build; tests sleep with poll() instead of usleep for the same reason.
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
import os
|
|
import sys, time
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
from harness import Term
|
|
import fakeapi
|
|
from keys import input_text, styled, check, FAILS, base
|
|
|
|
for term in ("xterm-256color", "screen-256color"):
|
|
t = Term(args=("-b", base, "-k", "sk-test"), term=term)
|
|
t.send("some text")
|
|
t.send("\x1b", 0.4)
|
|
check(term + " lone esc clears input", input_text(t) == [], t)
|
|
t.send("alpha beta")
|
|
t.send("\x1bb") # alt+b word left
|
|
t.send("X")
|
|
check(term + " alt+b word left", "alpha Xbeta" in input_text(t), t)
|
|
t.send("\x1b\r") # alt+enter newline
|
|
t.send("Y")
|
|
check(term + " alt+enter newline", input_text(t)[-2:] == ["alpha X", "Ybeta"], t)
|
|
t.send("\x03", 0.2)
|
|
# picker with CSI form
|
|
t.send("/model\r", 0.8)
|
|
s0 = styled(t)
|
|
t.arrow("down", "csi")
|
|
s1 = styled(t)
|
|
t.arrow("up", "csi")
|
|
s2 = styled(t)
|
|
check(term + " picker csi down", s0 != s1, t)
|
|
check(term + " picker csi up", s0 == s2, t)
|
|
t.send("\x1b", 0.4)
|
|
# home/end variants
|
|
t.send("middle")
|
|
for seq in ("\x1b[H", "\x1bOH", "\x1b[1~", "\x1b[7~"):
|
|
t.send("\x1b[F" + seq)
|
|
t.send("<")
|
|
t.send("\x08" if False else "")
|
|
check(term + " home variants", input_text(t)[-1:] == ["<<<<middle"], t)
|
|
for seq in ("\x1b[F", "\x1bOF", "\x1b[4~", "\x1b[8~"):
|
|
t.send("\x1b[H" + seq)
|
|
t.send(">")
|
|
check(term + " end variants", input_text(t)[-1:] == ["<<<<middle>>>>"], t)
|
|
t.close()
|
|
print("FAILED:", len(FAILS))
|
|
sys.exit(min(len(FAILS), 100))
|