hermes-bsd/hermes_cli
teknium1 85782a4ed7 feat(acp): hermes acp --setup-browser bootstraps browser tools for registry installs
The Zed ACP Registry path (uvx --from 'hermes-agent[acp]==X' hermes-acp)
gets a Python-only install. Browser tools depend on the agent-browser npm
package + Chromium, neither of which are in the wheel. Without an
explicit bootstrap, registry users have no path to working browser tools.

Ship a bundled, idempotent bootstrap script (Linux/macOS bash + Windows
PowerShell) inside acp_adapter/bootstrap/ as wheel package-data. New
entry points:

  hermes acp --setup-browser        # interactive; prompts before Chromium download
  hermes acp --setup-browser --yes  # non-interactive
  hermes-acp --setup-browser

The terminal-auth flow (hermes acp --setup) also offers the browser
bootstrap as a follow-up after model selection, so first-run registry
users get the option without knowing the flag exists.

Key design choices:
- npm install -g --prefix $NODE_PREFIX so we never need sudo. System Node
  on PATH is respected; only the install target is redirected to the
  user-writable Hermes-managed Node prefix.
- tools/browser_tool.py::_browser_candidate_path_dirs() already walks
  $HERMES_HOME/node/bin, so installed binaries are discovered with no
  agent-side code change.
- System Chrome/Chromium detection short-circuits the ~400 MB Playwright
  download when a suitable browser already exists.
- Bash + PowerShell live as ONE copy each under acp_adapter/bootstrap/.
  Not duplicated under scripts/. install.sh and install.ps1 keep their
  inline browser blocks for the source-checkout path.

E2E validated end-to-end:
  bash bootstrap_browser_tools.sh --skip-chromium
    → installs agent-browser into ~/.hermes/node/bin/
  tools.browser_tool._find_agent_browser()
    → returns the installed path
  check_browser_requirements()
    → returns True (browser tools register)

Tests:
- tests/acp/test_entry.py: 11 tests covering --setup-browser dispatch
  (linux + windows + --yes forwarding + failure propagation), the
  terminal-auth follow-up prompt path, and a package-data wheel-shipping
  assertion that catches any future pyproject.toml regression.

Docs: website/docs/user-guide/features/acp.md gains a 'Browser tools
(optional)' subsection with the two-line install + what-it-does.
2026-05-15 01:38:24 -07:00
..
proxy fix(proxy): suppress false-positive windows-footgun on guarded add_signal_handler 2026-05-14 15:57:59 -07:00
__init__.py
_parser.py
_subprocess_compat.py
auth.py perf(tools): cache get_nous_auth_status() and load_env() to fix slow hermes tools menus (#25341) 2026-05-13 18:40:14 -07:00
auth_commands.py fix(minimax): harden OAuth dashboard and runtime 2026-05-11 22:15:16 -07:00
azure_detect.py
backup.py
banner.py feat(codex-runtime): optional codex app-server runtime for OpenAI/Codex models (#24182) 2026-05-13 17:18:15 -07:00
browser_connect.py
callbacks.py
checkpoints.py
claw.py
cli_output.py
clipboard.py fix(clipboard): only read PNG signature bytes, not entire file 2026-05-13 22:54:21 -07:00
codex_models.py
codex_runtime_plugin_migration.py feat(codex-runtime): skip unavailable plugins during migration (#25437) 2026-05-13 22:20:27 -07:00
codex_runtime_switch.py feat(codex-runtime): optional codex app-server runtime for OpenAI/Codex models (#24182) 2026-05-13 17:18:15 -07:00
colors.py
commands.py feat(goals): /subgoal — user-added criteria appended to active /goal (#25449) 2026-05-13 22:55:09 -07:00
completion.py test(cli): strengthen zsh completion regression coverage 2026-05-13 09:34:15 -07:00
config.py chore: remove Atropos RL environments and tinker-atropos integration (#26106) 2026-05-15 10:36:38 +05:30
copilot_auth.py
cron.py feat(cron): support name-based lookup for job operations 2026-05-15 01:36:03 -07:00
curator.py
curses_ui.py
debug.py
default_soul.py
dingtalk_auth.py
doctor.py chore: remove Atropos RL environments and tinker-atropos integration (#26106) 2026-05-15 10:36:38 +05:30
dump.py
env_loader.py
fallback_cmd.py
gateway.py fix(gateway): reduce systemd restart delay 2026-05-12 17:11:25 -07:00
gateway_windows.py
goals.py fix(goals): raise judge max_tokens 200 → 4096, make configurable 2026-05-14 23:44:06 -07:00
hooks.py
inventory.py refactor(inventory): extract shared ConfigContext + build_models_payload 2026-05-13 22:31:11 -07:00
kanban.py
kanban_db.py
kanban_diagnostics.py
kanban_specify.py feat(nous): unified client=hermes-client-v<version> tag on every Portal request (#24779) 2026-05-12 20:49:20 -07:00
logs.py
main.py feat(acp): hermes acp --setup-browser bootstraps browser tools for registry installs 2026-05-15 01:38:24 -07:00
mcp_config.py
memory_setup.py fix: restrict .env file permissions to 0600 2026-05-14 07:59:38 -07:00
model_catalog.py
model_normalize.py
model_switch.py
models.py docs: update NovitaAI provider positioning (#25532) 2026-05-14 01:31:12 -07:00
nous_subscription.py
oneshot.py
pairing.py
platforms.py
plugins.py feat(plugins): add ctx.register_web_search_provider() facade 2026-05-13 22:31:28 -07:00
plugins_cmd.py
profile_distribution.py
profiles.py refactor(profiles): remove dead generate_bash_completion / generate_zsh_completion 2026-05-13 09:34:15 -07:00
providers.py feat: add NovitaAI as LLM provider 2026-05-13 23:51:15 -07:00
pt_input_extras.py
pty_bridge.py
relaunch.py
runtime_provider.py feat(codex-runtime): optional codex app-server runtime for OpenAI/Codex models (#24182) 2026-05-13 17:18:15 -07:00
security_advisories.py feat(security): supply-chain advisory checker + lazy-install framework + tiered install fallback (#24220) 2026-05-12 01:02:25 -07:00
setup.py chore: remove Atropos RL environments and tinker-atropos integration (#26106) 2026-05-15 10:36:38 +05:30
skills_config.py
skills_hub.py
skin_engine.py fix(cli): kill resize scrollback duplication + light-mode visibility 2026-05-14 23:23:32 -07:00
slack_cli.py
status.py chore: remove Atropos RL environments and tinker-atropos integration (#26106) 2026-05-15 10:36:38 +05:30
stdio.py
timeouts.py
tips.py
tools_config.py chore: remove Atropos RL environments and tinker-atropos integration (#26106) 2026-05-15 10:36:38 +05:30
uninstall.py
vercel_auth.py
voice.py
web_server.py refactor(inventory): extract shared ConfigContext + build_models_payload 2026-05-13 22:31:11 -07:00
webhook.py