fix(ui,remote): decline without a terminal, and stop swallowing Ctrl-C master
F6, the two smaller findings. ask_yes_no read a single keypress, which needs stdin in cbreak mode, and termios.tcgetattr raises "Inappropriate ioctl for device" when stdin is not a tty. Every non-interactive caller that omitted --yes got a traceback instead of an answer -- reachable from cron, from a container, and from the HTTP service. It now checks isatty() first and declines, printing what to pass instead. Declining rather than accepting is deliberate: `default='y'` describes what Enter means for a human at a prompt, not consent from a caller that was never asked. --yes/auto_confirm still short-circuits ahead of the check, so non-interactive confirmation keeps working. isatty() can itself raise on a closed or replaced stdin, and a prompt helper is the wrong place to raise from, so that counts as non-interactive too. The two bare `except:` clauses in core/tasks/remote.py also caught KeyboardInterrupt and SystemExit, so Ctrl-C during a summarize run over many datasets was swallowed and the loop carried on. Now `except Exception` with a debug log -- the expected case is "the file is not there", which is not worth a warning but is worth being able to see. Needed a module logger in core/tasks/remote.py; it had none, so this follows the getLogger("owilix") convention used elsewhere. Left alone: the second ask_yes_no in owilix/compat/core_base.py uses Prompt.ask and never touches termios, so it does not have this failure. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017phbSd6D8u4iEQsCAPEw6s