"""TUI 辅助: 中文输入收集 vue-tui 的 useInput 在 raw mode 下不支持 IME, 中文输入必须走 Python cooked-mode input()。 调用方 (TUI) 会先把 vue-tui 输入监听暂停 (isActive=false), 本脚本独占 tty: - 终端从 raw 临时切回 cooked+echo 供 input()/IME 使用, 结束后恢复 - prompt 写 stderr (继承终端直接显示), 答案 JSON 写 stdout (管道回传 TUI) 用法: python ask.py <提示词> [默认值] -> stdout 输出 JSON {"answer": "..."} """ import json import sys import termios fd = sys.stdin.fileno() old = termios.tcgetattr(fd) new = termios.tcgetattr(fd) new[3] |= termios.ICANON | termios.ECHO # 开行缓冲 + 回显 (cooked mode) termios.tcsetattr(fd, termios.TCSANOW, new) try: prompt = sys.argv[1] if len(sys.argv) > 1 else "输入" default = sys.argv[2] if len(sys.argv) > 2 else "" # prompt 走 stderr: 继承终端直接显示 (stdout 管道是给 TUI 解析 JSON 的) sys.stderr.write(f"{prompt} [{default}]: ") sys.stderr.flush() try: answer = sys.stdin.readline().rstrip("\n") except EOFError: answer = "" if not answer: answer = default finally: termios.tcsetattr(fd, termios.TCSANOW, old) print() print(json.dumps({"answer": answer}, ensure_ascii=False))