File size: 2,164 Bytes
90f10d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271bd15
 
 
 
 
 
 
 
90f10d2
271bd15
 
90f10d2
 
 
 
 
 
 
 
271bd15
 
90f10d2
 
 
 
271bd15
 
90f10d2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
271bd15
90f10d2
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
"""Terminal output, prompts, and formatting."""

import os
import sys


_PLAIN_MAP = {"βœ“": "[OK]", "βœ—": "[ERR]", "⚠": "[WARN]", "β†’": ">", "↳": "->", "Β·": "-", "…": "...", "─": "-", "β€”": "-", "←": "<-", "↔": "<->"}


def _plain():
    return os.environ.get("VOICE_PLAIN") == "1"


def _transform(msg):
    if not _plain():
        return msg
    for k, v in _PLAIN_MAP.items():
        msg = msg.replace(k, v)
    return msg


def _now_iso():
    from datetime import datetime, timezone
    return datetime.now(timezone.utc).isoformat()


def _say(msg):
    print(_transform(msg), flush=True)


def _quiet():
    try:
        from vlib import ctx as _ctx
        return bool(getattr(_ctx, "QUIET", False))
    except Exception:
        return False


def _ok(msg):
    if _quiet():
        return
    _say(f"  βœ“ {msg}")


def _warn(msg):
    _say(f"  ⚠ {msg}")


def _step(msg):
    if _quiet():
        return
    _say(f"  β†’ {msg}")


def _note(msg):
    if _quiet():
        return
    _say(f"  ↳ {msg}")


def _fail(msg):
    sys.stdout.flush()
    msg = str(msg).lstrip()
    if msg.startswith("βœ—"):
        msg = msg[1:].lstrip()
    _say(f"  βœ— {msg}")
    sys.exit(1)


def _noninteractive(args):
    if getattr(args, "non_interactive", False) or getattr(args, "yes", False):
        return True
    try:
        return not sys.stdin.isatty()
    except Exception:
        return True


def _progress_pref():
    if _plain() or os.environ.get("REDUCE_MOTION") == "1":
        return True
    try:
        return not sys.stdout.isatty()
    except Exception:
        return True


def _confirm(question, args):
    if getattr(args, "yes", False):
        return True
    if _noninteractive(args):
        return False
    try:
        ans = input(question).strip().lower()
    except (EOFError, KeyboardInterrupt):
        _say("  ⚠ Cancelled.")
        sys.exit(1)
    return ans in ("y", "yes")


def _trunc(s, w):
    s = str(s)
    return s[: w - 1] + "…" if len(s) > w else s


def _term_width():
    try:
        import shutil
        return shutil.get_terminal_size().columns
    except Exception:
        return 80