hotpath 0.2.0__tar.gz → 0.2.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {hotpath-0.2.0 → hotpath-0.2.2}/.github/workflows/release.yml +0 -21
- {hotpath-0.2.0 → hotpath-0.2.2}/CHANGELOG.md +20 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/PKG-INFO +1 -1
- {hotpath-0.2.0 → hotpath-0.2.2}/hotpath_py/__init__.py +1 -1
- {hotpath-0.2.0 → hotpath-0.2.2}/pyproject.toml +2 -2
- {hotpath-0.2.0 → hotpath-0.2.2}/src/interactive.cpp +33 -10
- {hotpath-0.2.0 → hotpath-0.2.2}/src/main.cpp +1 -1
- {hotpath-0.2.0 → hotpath-0.2.2}/.github/workflows/ci.yml +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/.github/workflows/gpu-smoke.yml +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/.gitignore +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/.smoke-bench-a.json +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/.smoke-bench-b.json +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/CMakeLists.txt +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/PLAN.MD +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/README.md +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/fixtures/smoke_prefix_traffic.jsonl +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/fixtures/smoke_traffic.jsonl +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/fixtures/traffic.jsonl +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_aggregate.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_artifacts.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_attach.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_audit.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_batch_analyzer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_bench.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_bench_json.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_cache_analyzer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_categorizer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_cli.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_clock_control.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_diff.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_disagg_model.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_doctor.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_export.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_interactive.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_log_parser.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_otlp_export.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_parser.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_phase_analyzer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_prefix_analyzer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_recommender.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_remote.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_report.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_request_trace.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_serve_report.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_server.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_sglang_metrics.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_stability.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_store.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_targets.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_traffic.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_traffic_replayer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_validate.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_vllm_metrics.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/cpp_tests/test_workload_classifier.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/hotpath_py/bench_cuda.py +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/hotpath_py/bench_cuda_kernels.py +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/hotpath_py/cli.py +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/aggregate.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/artifacts.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/batch_analyzer.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/bench/kernels/rms_norm.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/bench/kernels/rotary_emb.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/bench/kernels/silu_mul.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/bench/registry.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/bench/runner.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/cache_analyzer.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/clock_control.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/diff.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/disagg_model.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/doctor.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/export.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/kv_config.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/log_parser.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/ops.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/otlp_export.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/phase_analyzer.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/prefix_analyzer.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/profiler/attach.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/profiler/categorizer.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/profiler/kernel_record.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/profiler/parser.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/profiler/runner.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/profiler/server.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/profiler/vllm_metrics.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/recommender.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/remote.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/report.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/request_trace.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/serve_profiler.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/sglang_metrics.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/stability.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/store.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/targets.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/traffic.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/traffic_replayer.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/validate.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/include/hotpath/workload_classifier.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/advisor/disagg_model.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/advisor/kv_config.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/advisor/recommender.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/advisor/workload_classifier.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/aggregate.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/artifacts.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/bench/kernels/rms_norm.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/bench/kernels/rotary_emb.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/bench/kernels/silu_mul.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/bench/registry.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/bench/runner.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/clock_control.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/diff.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/doctor.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/export/otlp_export.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/export.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/interactive.h +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/ops.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/profiler/attach.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/profiler/categorizer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/profiler/parser.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/profiler/runner.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/profiler/server.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/profiler/sglang_metrics.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/profiler/vllm_metrics.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/remote.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/report.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/serving/batch_analyzer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/serving/cache_analyzer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/serving/log_parser.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/serving/phase_analyzer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/serving/prefix_analyzer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/serving/serve_profiler.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/serving/traffic_replayer.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/stability.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/store.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/targets.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/traffic.cpp +0 -0
- {hotpath-0.2.0 → hotpath-0.2.2}/src/validate.cpp +0 -0
|
@@ -32,26 +32,10 @@ jobs:
|
|
|
32
32
|
path: dist/*.tar.gz
|
|
33
33
|
if-no-files-found: error
|
|
34
34
|
|
|
35
|
-
build_linux_wheels:
|
|
36
|
-
name: build linux wheels
|
|
37
|
-
runs-on: ubuntu-latest
|
|
38
|
-
steps:
|
|
39
|
-
- uses: actions/checkout@v4
|
|
40
|
-
|
|
41
|
-
- name: Build wheels
|
|
42
|
-
uses: pypa/cibuildwheel@v3.1.4
|
|
43
|
-
|
|
44
|
-
- uses: actions/upload-artifact@v4
|
|
45
|
-
with:
|
|
46
|
-
name: dist-wheels-linux
|
|
47
|
-
path: wheelhouse/*.whl
|
|
48
|
-
if-no-files-found: error
|
|
49
|
-
|
|
50
35
|
publish_pypi:
|
|
51
36
|
name: publish to PyPI
|
|
52
37
|
needs:
|
|
53
38
|
- build_sdist
|
|
54
|
-
- build_linux_wheels
|
|
55
39
|
if: github.event_name == 'release' && github.event.action == 'published'
|
|
56
40
|
runs-on: ubuntu-latest
|
|
57
41
|
environment: pypi
|
|
@@ -63,10 +47,5 @@ jobs:
|
|
|
63
47
|
name: dist-sdist
|
|
64
48
|
path: dist
|
|
65
49
|
|
|
66
|
-
- uses: actions/download-artifact@v4
|
|
67
|
-
with:
|
|
68
|
-
name: dist-wheels-linux
|
|
69
|
-
path: dist
|
|
70
|
-
|
|
71
50
|
- name: Publish package distributions to PyPI
|
|
72
51
|
uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -1,5 +1,25 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v0.2.2 - 2026-04-05
|
|
4
|
+
|
|
5
|
+
Release workflow safety rollback.
|
|
6
|
+
|
|
7
|
+
Highlights:
|
|
8
|
+
|
|
9
|
+
- Linux wheel publishing is temporarily disabled because the manylinux packaged binary still crashes during wheel smoke tests, even though source builds are healthy
|
|
10
|
+
- PyPI release flow now publishes the source distribution only, which keeps installs on the safe path that compiles against the target system rather than shipping a broken prebuilt ELF
|
|
11
|
+
- the wheel smoke command remains in `pyproject.toml` so future wheel work still fails fast until the packaging root cause is fixed
|
|
12
|
+
|
|
13
|
+
## v0.2.1 - 2026-04-05
|
|
14
|
+
|
|
15
|
+
Packaging and interactive TUI hardening.
|
|
16
|
+
|
|
17
|
+
Highlights:
|
|
18
|
+
|
|
19
|
+
- release workflow now installs the built wheel artifacts on fresh Python 3.10, 3.11, and 3.12 runners and blocks PyPI publish unless `hotpath --help`, `hotpath`, and `hotpath version` all succeed from the installed entrypoint
|
|
20
|
+
- `cibuildwheel` now smoke-tests the installed `hotpath` CLI instead of only importing the Python package, which would have caught the broken packaged ELF before release
|
|
21
|
+
- interactive arrow-key menus now clip rendered lines to terminal width, avoiding wrapped redraw corruption in Ghostty and other narrow terminals
|
|
22
|
+
|
|
3
23
|
## v0.2.0 - 2026-04-05
|
|
4
24
|
|
|
5
25
|
Serving analysis, interactive TUI, and numerical hardening.
|
|
@@ -6,7 +6,7 @@ build-backend = "scikit_build_core.build"
|
|
|
6
6
|
|
|
7
7
|
[project]
|
|
8
8
|
name = "hotpath"
|
|
9
|
-
version = "0.2.
|
|
9
|
+
version = "0.2.2"
|
|
10
10
|
description = "Profile vLLM inference under RL-style rollout workloads."
|
|
11
11
|
readme = "README.md"
|
|
12
12
|
requires-python = ">=3.10"
|
|
@@ -77,7 +77,7 @@ wheel.packages = ["hotpath_py"]
|
|
|
77
77
|
[tool.cibuildwheel]
|
|
78
78
|
build = ["cp310-manylinux_x86_64", "cp311-manylinux_x86_64", "cp312-manylinux_x86_64"]
|
|
79
79
|
skip = ["pp*"]
|
|
80
|
-
test-command = "python -c \"import hotpath_py; print(hotpath_py.__version__)\""
|
|
80
|
+
test-command = "python -c \"import hotpath_py; print(hotpath_py.__version__)\" && hotpath --help && printf 'q\\n' | hotpath"
|
|
81
81
|
|
|
82
82
|
[tool.cibuildwheel.linux]
|
|
83
83
|
manylinux-x86_64-image = "manylinux_2_28"
|
|
@@ -73,6 +73,27 @@ const char* color_code(const char* code) {
|
|
|
73
73
|
return use_color() ? code : "";
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
+
int terminal_columns() {
|
|
77
|
+
struct winsize ws{};
|
|
78
|
+
if (ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws) == 0 && ws.ws_col > 0) {
|
|
79
|
+
return ws.ws_col;
|
|
80
|
+
}
|
|
81
|
+
return 80;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
std::string truncate_display_text(const std::string& text, int max_columns) {
|
|
85
|
+
if (max_columns <= 0) {
|
|
86
|
+
return "";
|
|
87
|
+
}
|
|
88
|
+
if (static_cast<int>(text.size()) <= max_columns) {
|
|
89
|
+
return text;
|
|
90
|
+
}
|
|
91
|
+
if (max_columns <= 3) {
|
|
92
|
+
return text.substr(0, static_cast<std::size_t>(max_columns));
|
|
93
|
+
}
|
|
94
|
+
return text.substr(0, static_cast<std::size_t>(max_columns - 3)) + "...";
|
|
95
|
+
}
|
|
96
|
+
|
|
76
97
|
std::filesystem::path defaults_path() {
|
|
77
98
|
const char* explicit_path = std::getenv("RLPROF_DEFAULTS_PATH");
|
|
78
99
|
if (explicit_path != nullptr && std::string(explicit_path).size() > 0) {
|
|
@@ -297,6 +318,7 @@ std::optional<int> prompt_choice(
|
|
|
297
318
|
struct winsize ws{};
|
|
298
319
|
ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws);
|
|
299
320
|
const int term_rows = (ws.ws_row > 6) ? ws.ws_row - 6 : 8;
|
|
321
|
+
const int term_cols = terminal_columns();
|
|
300
322
|
const int n = static_cast<int>(options.size());
|
|
301
323
|
const int max_vis = std::min(n, std::max(4, term_rows));
|
|
302
324
|
|
|
@@ -310,19 +332,21 @@ std::optional<int> prompt_choice(
|
|
|
310
332
|
if (selected >= vp_start + max_vis) vp_start = selected - max_vis + 1;
|
|
311
333
|
|
|
312
334
|
rendered_lines = 0;
|
|
335
|
+
const std::string header =
|
|
336
|
+
truncate_display_text(label + " (arrows, enter, q)", std::max(1, term_cols - 4));
|
|
313
337
|
std::cout << "\r " << color_code(CYAN) << "? " << color_code(RESET)
|
|
314
|
-
<< color_code(BOLD) <<
|
|
315
|
-
<< " " << color_code(DIM) << "(↑↓ · enter · q)"
|
|
316
|
-
<< color_code(RESET) << "\033[K\n";
|
|
338
|
+
<< color_code(BOLD) << header << color_code(RESET) << "\033[K\n";
|
|
317
339
|
++rendered_lines;
|
|
318
340
|
|
|
319
341
|
for (int i = vp_start; i < vp_start + max_vis; ++i) {
|
|
342
|
+
const std::string option =
|
|
343
|
+
truncate_display_text(options[static_cast<std::size_t>(i)], std::max(1, term_cols - 4));
|
|
320
344
|
if (i == selected) {
|
|
321
345
|
std::cout << "\r " << color_code(CYAN) << "> " << color_code(RESET)
|
|
322
|
-
<<
|
|
346
|
+
<< option << "\033[K\n";
|
|
323
347
|
} else {
|
|
324
348
|
std::cout << "\r " << color_code(DIM)
|
|
325
|
-
<<
|
|
349
|
+
<< option
|
|
326
350
|
<< color_code(RESET) << "\033[K\n";
|
|
327
351
|
}
|
|
328
352
|
++rendered_lines;
|
|
@@ -339,9 +363,8 @@ std::optional<int> prompt_choice(
|
|
|
339
363
|
for (int i = 0; i < reserve; ++i) std::cout << '\n';
|
|
340
364
|
// CUU (up N) + CR to reach column 0 — both universally supported VT100.
|
|
341
365
|
std::cout << "\033[" << reserve << "A\r";
|
|
342
|
-
//
|
|
343
|
-
|
|
344
|
-
std::cout << "\0337";
|
|
366
|
+
// Save the top-of-menu cursor position so redraws can return here cleanly.
|
|
367
|
+
std::cout << "\033[s";
|
|
345
368
|
}
|
|
346
369
|
render();
|
|
347
370
|
|
|
@@ -373,7 +396,7 @@ std::optional<int> prompt_choice(
|
|
|
373
396
|
}
|
|
374
397
|
|
|
375
398
|
if (needs_redraw && use_ansi_control()) {
|
|
376
|
-
std::cout << "\
|
|
399
|
+
std::cout << "\033[u";
|
|
377
400
|
render();
|
|
378
401
|
}
|
|
379
402
|
}
|
|
@@ -385,7 +408,7 @@ std::optional<int> prompt_choice(
|
|
|
385
408
|
|
|
386
409
|
// Replace the menu with a single confirmation line.
|
|
387
410
|
if (use_ansi_control()) {
|
|
388
|
-
std::cout << "\
|
|
411
|
+
std::cout << "\033[u\033[J";
|
|
389
412
|
}
|
|
390
413
|
if (result.has_value()) {
|
|
391
414
|
std::cout << " " << color_code(CYAN) << "\xe2\x9c\x93 " << color_code(RESET)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|