Files
teknium1 f7f000de99 fix(setup): Codex image post-setup names the auth command instead of starting a device login without a terminal
The Desktop capabilities panel renders a PostSetupRunner button for any
provider that declares `post_setup`, and spawns `hermes tools post-setup
openai_codex` with stdin=DEVNULL and HERMES_NONINTERACTIVE=1. There the
prompt falls back to its default and a device-code login started with
nobody to complete it. When `is_noninteractive()` the hook now prints
`hermes auth add openai-codex` and returns; the panel already shows the
needs_auth pill.

Also lists `openai_codex` in the `hermes tools post-setup` help.

A/B: new test (HERMES_NONINTERACTIVE=1, login stub fails the test if
called) red before, green after; tests/hermes_cli/test_image_gen_picker.py
11 passed.
2026-09-19 10:05:26 -07:00

51 lines
2.6 KiB
Python

"""``hermes tools`` subcommand parser."""
from __future__ import annotations
from typing import Callable
def build_tools_parser(subparsers, *, cmd_tools: Callable) -> None:
"""Attach the ``tools`` subcommand to ``subparsers``."""
tools_parser = subparsers.add_parser(
"tools", help="Configure which tools are enabled per platform",
description="Enable, disable, or list tools for CLI, Telegram, Discord, etc.\n\n"
"Built-in toolsets use plain names (e.g. web, memory).\n"
"MCP tools use server:tool notation (e.g. github:create_issue).\n\n"
"Run 'hermes tools' with no subcommand for the interactive configuration UI.")
tools_parser.add_argument(
"--summary", action="store_true",
help="Print a summary of enabled tools per platform and exit")
tools_sub = tools_parser.add_subparsers(dest="tools_action")
tools_list_p = tools_sub.add_parser(
"list", help="Show all tools and their enabled/disabled status")
tools_list_p.add_argument("--platform", default="cli", help="Platform to show (default: cli)")
tools_disable_p = tools_sub.add_parser("disable", help="Disable toolsets or MCP tools")
tools_disable_p.add_argument(
"names", nargs="+", metavar="NAME",
help="Toolset name (e.g. web) or MCP tool in server:tool form")
tools_disable_p.add_argument(
"--platform", default="cli", help="Platform to apply to (default: cli)")
tools_enable_p = tools_sub.add_parser("enable", help="Enable toolsets or MCP tools")
tools_enable_p.add_argument(
"names", nargs="+", metavar="NAME", help="Toolset name or MCP tool in server:tool form")
tools_enable_p.add_argument(
"--platform", default="cli", help="Platform to apply to (default: cli)")
tools_postsetup_p = tools_sub.add_parser(
"post-setup", help="Run a provider's post-setup install hook (npm/pip/binary)",
description="Run the install/bootstrap hook a tool backend declares — the\n"
"same step `hermes tools` runs after you pick a provider that\n"
"needs extra dependencies (browser Chromium, Camofox, cua-driver,\n"
"KittenTTS/Piper, ddgs, Spotify, Langfuse, xAI, Codex). Stable,\n"
"non-interactive target the dashboard spawns to drive backend\n"
"setup. Keys: agent_browser, camofox, cua_driver, kittentts,\n"
"piper, ddgs, spotify, langfuse, xai_grok, openai_codex.")
tools_postsetup_p.add_argument(
"post_setup_key", metavar="KEY",
help="Post-setup hook key (e.g. agent_browser, camofox, kittentts)")
tools_parser.set_defaults(func=cmd_tools)