diff --git a/.dockerignore b/.dockerignore index 0e4a88fd2f..542c96700e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,7 +5,9 @@ # Dependencies node_modules +**/node_modules .venv +**/.venv # CI/CD .github diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 146cb1161b..30d171543b 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -494,7 +494,7 @@ branding: agent_name: "My Agent" welcome: "Welcome message" response_label: " ⚔ Agent " - prompt_symbol: "⚔ ❯ " + prompt_symbol: "⚔" tool_prefix: "╎" # Tool output line prefix ``` diff --git a/Dockerfile b/Dockerfile index 7f4ebc2d15..d988ea6407 100644 --- a/Dockerfile +++ b/Dockerfile @@ -14,7 +14,7 @@ ENV PLAYWRIGHT_BROWSERS_PATH=/opt/hermes/.playwright # that would otherwise accumulate when hermes runs as PID 1. See #15012. RUN apt-get update && \ apt-get install -y --no-install-recommends \ - build-essential nodejs npm python3 ripgrep ffmpeg gcc python3-dev libffi-dev procps git openssh-client docker-cli tini && \ + build-essential nodejs npm python3 ripgrep ffmpeg gcc python3-dev libffi-dev procps git openssh-client docker-cli tini && \ rm -rf /var/lib/apt/lists/* # Non-root user for runtime; UID can be overridden via HERMES_UID at runtime @@ -45,7 +45,13 @@ COPY --chown=hermes:hermes . . # Build browser dashboard and terminal UI assets. RUN cd web && npm run build && \ - cd ../ui-tui && npm run build + cd ../ui-tui && npm run build && \ + rm -rf node_modules/@hermes/ink && \ + rm -rf packages/hermes-ink/node_modules && \ + cp -R packages/hermes-ink node_modules/@hermes/ink && \ + npm install --omit=dev --prefer-offline --no-audit --prefix node_modules/@hermes/ink && \ + rm -rf node_modules/@hermes/ink/node_modules/react && \ + node --input-type=module -e "await import('@hermes/ink')" # ---------- Permissions ---------- # Make install dir world-readable so any HERMES_UID can read it at runtime. diff --git a/cli-config.yaml.example b/cli-config.yaml.example index 56b925f8ff..b2a6868604 100644 --- a/cli-config.yaml.example +++ b/cli-config.yaml.example @@ -927,7 +927,7 @@ display: # agent_name: "My Agent" # Banner title and branding # welcome: "Welcome message" # Shown at CLI startup # response_label: " ⚔ Agent " # Response box header label - # prompt_symbol: "⚔ ❯ " # Prompt symbol + # prompt_symbol: "⚔" # Prompt symbol (bare token; renderers add trailing space) # tool_prefix: "╎" # Tool output line prefix (default: ┊) # skin: default diff --git a/hermes_cli/commands.py b/hermes_cli/commands.py index 5c732720e5..7160c16f9d 100644 --- a/hermes_cli/commands.py +++ b/hermes_cli/commands.py @@ -128,6 +128,9 @@ COMMAND_REGISTRY: list[CommandDef] = [ subcommands=("normal", "fast", "status", "on", "off")), CommandDef("skin", "Show or change the display skin/theme", "Configuration", cli_only=True, args_hint="[name]"), + CommandDef("indicator", "Pick the TUI busy-indicator style", "Configuration", + cli_only=True, args_hint="[kaomoji|emoji|unicode|ascii]", + subcommands=("kaomoji", "emoji", "unicode", "ascii")), CommandDef("voice", "Toggle voice mode", "Configuration", args_hint="[on|off|tts|status]", subcommands=("on", "off", "tts", "status")), CommandDef("busy", "Control what Enter does while Hermes is working", "Configuration", diff --git a/hermes_cli/config.py b/hermes_cli/config.py index 7fdc4d7e07..6d96e62e7e 100644 --- a/hermes_cli/config.py +++ b/hermes_cli/config.py @@ -703,6 +703,11 @@ DEFAULT_CONFIG = { "personality": "kawaii", "resume_display": "full", "busy_input_mode": "interrupt", # interrupt | queue | steer + # When true, `hermes --tui` auto-resumes the most recent human- + # facing session on launch instead of forging a fresh one. + # Mirrors `hermes -c` muscle memory. Default off so existing + # users aren't surprised. HERMES_TUI_RESUME= always wins. + "tui_auto_resume_recent": False, "bell_on_complete": False, "show_reasoning": False, "streaming": False, @@ -710,6 +715,9 @@ DEFAULT_CONFIG = { "inline_diffs": True, # Show inline diff previews for write actions (write_file, patch, skill_manage) "show_cost": False, # Show $ cost in the status bar (off by default) "skin": "default", + # TUI busy indicator style: kaomoji (default), emoji, unicode (braille + # spinner), or ascii. Live-swappable via `/indicator