opentui(phase3): launcher integration — HERMES_TUI_ENGINE dual-engine

hermes --tui launches the native OpenTUI engine (Bun) when
HERMES_TUI_ENGINE=opentui (env) or display.tui_engine=opentui (config);
Ink stays the default and the shipping path is untouched.

- _resolve_tui_engine() (env > config > ink); refuses opentui on
  Windows/Termux (no Bun) -> falls back to ink with a notice.
- _make_opentui_argv() -> [bun, src/entry.real.tsx] (no build step).
- _bun_bin() with HERMES_BUN override.
- Branch at top of _make_tui_argv BEFORE _ensure_tui_node (Bun-only host
  must not bootstrap Node).
- Gate _launch_tui NODE_OPTIONS/--max-old-space-size on engine==ink (Bun
  is JSC; the V8 flag errors/ignores).

Verified end-to-end via tmux: real hermes --tui -> Bun -> OpenTUI ->
real Python gateway streamed a real reply. No-flag default still ink.
This commit is contained in:
alt-glitch 2026-06-08 11:11:54 +00:00
parent 24f74eb888
commit 2bd9c9b881
741 changed files with 17733 additions and 79889 deletions

View file

@ -190,49 +190,6 @@ class TestSnapshotEndToEnd:
"""Spin up a real LocalEnvironment and confirm the snapshot sources
extra init files."""
def test_exported_env_changes_persist_between_commands(self, tmp_path):
env = LocalEnvironment(cwd=str(tmp_path), timeout=15)
try:
first = env.execute(
'export HERMES_SESSION_ENV_PROBE="sticky"; '
'export PATH="/tmp/hermes-session-bin:$PATH"; '
'echo "first=$HERMES_SESSION_ENV_PROBE"'
)
second = env.execute(
'echo "second=$HERMES_SESSION_ENV_PROBE"; echo "PATH=$PATH"'
)
finally:
env.cleanup()
assert first["returncode"] == 0
assert second["returncode"] == 0
assert "first=sticky" in first.get("output", "")
output = second.get("output", "")
assert "second=sticky" in output
assert "/tmp/hermes-session-bin" in output
def test_venv_style_activation_persists_between_commands(self, tmp_path):
venv_bin = tmp_path / ".venv" / "bin"
venv_bin.mkdir(parents=True)
activate = venv_bin / "activate"
activate.write_text(
f'export VIRTUAL_ENV="{tmp_path / ".venv"}"\n'
f'export PATH="{venv_bin}:$PATH"\n'
)
env = LocalEnvironment(cwd=str(tmp_path), timeout=15)
try:
first = env.execute('source .venv/bin/activate; echo "venv=$VIRTUAL_ENV"')
second = env.execute('echo "venv=$VIRTUAL_ENV"; echo "PATH=$PATH"')
finally:
env.cleanup()
assert first["returncode"] == 0
assert second["returncode"] == 0
output = second.get("output", "")
assert f"venv={tmp_path / '.venv'}" in output
assert str(venv_bin) in output
def test_snapshot_picks_up_init_file_exports(self, tmp_path, monkeypatch):
init_file = tmp_path / "custom-init.sh"
init_file.write_text(