feat(cli): add omnigent host --background to run the host daemon detached (#4317)

## Related issue

Closes OMNI-2516 — https://linear.app/omnigent/issue/OMNI-2516

## Summary

- `omnigent host` only ever ran in the foreground, so registering a machine as
  a host cost a dedicated terminal — even though the detached daemon it needs
  already exists and is what `run` / `claude` / `codex` spawn via
  `_ensure_host_daemon()`. `--background` exposes that path directly: spawn (or
  adopt) the daemon, report it, and return.
- Sign-in stays interactive. A detached daemon has no terminal to run the
  browser login on, so `_ensure_databricks_server_auth()` runs in the
  foreground *before* the spawn; otherwise the daemon dies in the background
  with an opaque "redirected to a login page" error. `--non-interactive` still
  fails with the `omnigent login` hint instead of prompting.
- In local mode the daemon also owns the local Omnigent server, so the command
  waits for that server and reports its URL — otherwise the Web UI is
  unreachable without a follow-up `omnigent server status`. That makes
  `omnigent host --background` the whole "start everything" step, which is now
  the README quickstart (it replaces the `server --background` + `host` pair).
- A daemon that dies on startup (bad URL, missing credentials) leaves nothing
  on the terminal, so the command waits a 2s grace and surfaces the daemon log
  rather than falsely reporting success.

Output is a colorized headline plus aligned detail rows, with the stop command
on its own line so it can be copied:

```
Started the host daemon in the background (pid 74241).
  server: https://dbc-…/api/2.0/omnigent
  log:    ~/.omnigent/logs/host/host-20260806-205308-765542.log

Stop it with:
  omnigent host stop --server https://dbc-…/api/2.0/omnigent
```

That stop command mirrors the invocation: `host` and `host stop` resolve their
target identically (the `--server` value, else config, else local), so the flag
is echoed only when the user named a target — a bare `host --background` prints
a bare `omnigent host stop`. Colorizing reuses the existing `NO_COLOR`-aware
helper, renamed `_help_style` → `_cli_style` now that it is not help-only.

## Test Plan

- `uv run --extra dev pytest tests/host/test_cli_host.py -q` → 21 passed.
- Manually, local mode: `omnigent host --background` reported
  `server: http://127.0.0.1:6767` and a bare `omnigent host stop` (no
  `--server` typed, none echoed), which then stopped it.
- Manually, remote mode: `omnigent host --background --server https://dbc-…`
  printed the block quoted above; `omnigent host status` showed
  `process=online host=online`; re-running reported `already running (pid …)`
  with no second spawn; and the echoed `host stop --server …` stopped it.

## Demo

N/A — CLI-only change; the new output is quoted above.

## Type of change

- [ ] Bug fix
- [x] Feature
- [ ] UI / frontend change
- [ ] Refactor / chore
- [ ] Docs
- [ ] Test / CI
- [ ] Breaking change

## Test coverage

- [x] Unit tests added / updated
- [ ] Integration tests added / updated
- [ ] E2E tests added / updated
- [x] Manual verification completed
- [ ] Existing tests cover this change
- [ ] Not applicable

## Coverage notes

Four new tests in `tests/host/test_cli_host.py` cover the spawn output
(including the local server URL and a flagless stop hint), that the foreground
daemon loop and in-process local-server bring-up are skipped, reuse of a
healthy daemon via an explicit `--server ""` (whose stop hint keeps the flag),
and that sign-in runs before the spawn. The daemon spawn and local-server
discovery are stubbed, so no process or log file is created. Manual
verification covered both modes end to end; the exits-immediately grace path is
covered by tests only.

## Changelog

`omnigent host --background` starts the local server and registers this machine
as a host without tying up a terminal.

Signed-off-by: Zeyi (Rice) Fan <zeyi.f@databricks.com>
This commit is contained in:
Zeyi (Rice) Fan
2026-08-06 21:11:20 -07:00
committed by GitHub
parent 8329fad713
commit 52166e5dec
3 changed files with 361 additions and 15 deletions
+6 -5
View File
@@ -301,15 +301,16 @@ full pages through an MCP search server, and verifies each claim across
independent sources. It's also the simplest example to copy from: one agent
plus one `tools/mcp/*.yaml` server, no sub-agents.
**Prefer the browser?** Start a server and register your machine as a host:
**Prefer the browser?** One command starts the local server and registers this
machine as a host:
```bash
omnigent server --background # start the local server and web UI in the background
omnigent host # (separate terminal) register this machine as a host
omnigent host --background # starts the local server too, then returns
```
In the web UI, hit **New Chat**, pick your machine, and go. Check status with
`omnigent server status`; stop everything with `omnigent stop`.
Open the server URL it prints, hit **New Chat**, pick your machine, and go.
Check status with `omnigent server status`; stop everything with
`omnigent stop`.
### 3. Choose & switch models