mirror of
https://github.com/lobehub/lobe-chat.git
synced 2026-06-14 03:30:19 +00:00
723c4d6daa
* 🐛 fix(cli): handle agent_run_request in `lh connect` so device dispatch doesn't time out `lh connect` auto-registers the CLI as a device, so the gateway can pick it as the dispatch target for a heterogeneous agent run (`agent_run_request`). But the connect daemon only listened for `system_info_request` and `tool_call_request` — it never handled `agent_run_request`, so it never sent `agent_run_ack`. The gateway waited out its ack window and returned `{error:'TIMEOUT',success:false}`, surfaced server-side as "Hetero agent device dispatch failed". Add an `agent_run_request` handler mirroring the desktop app: spawn `lh hetero exec` fire-and-forget and ack `accepted` immediately. The spawned process owns the full execution + server-ingest pipeline. It re-invokes the current CLI entry (process.execPath + argv[1]) rather than relying on `lh` being on PATH, so it works inside the detached daemon. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix: bump the cli version * chore: bump the cli manifest * 🐛 fix(cli): ack agent run only after spawn succeeds, reject on spawn error `child_process.spawn` reports a missing/inaccessible cwd asynchronously via the child's `error` event, after the handler had already sent an `accepted` ack. The gateway/server then recorded dispatch success while no `lh hetero exec` process existed to emit `heteroFinish`, leaving the assistant message stuck instead of surfacing a failure. `spawnHeteroAgentRun` now resolves on the child's outcome: `accepted` on the `spawn` event (stdin is written only then), `rejected` on an early `error`. A rejected ack returns the gateway 422 → execAgent writes a ServerAgentRuntimeError onto the assistant message, so a failed dispatch is visible. Still resolves in milliseconds, well within the gateway's 10s ack window. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@lobehub/cli
LobeHub command-line interface.
Local Development
| Task | Command |
|---|---|
| Run in dev mode | bun run dev -- <command> |
| Build the CLI | bun run build |
Link lh/lobe/lobehub into your shell |
bun run cli:link |
| Remove the global link | bun run cli:unlink |
bun run buildonly generatesdist/index.js.- To make
lhavailable in your shell, runbun run cli:link. - After linking, if your shell still cannot find
lh, runrehashinzsh.
Custom Server URL
By default the CLI connects to https://app.lobehub.com. To point it at a different server (e.g. a local instance):
| Method | Command | Persistence |
|---|---|---|
| Environment variable | LOBEHUB_SERVER=http://localhost:4000 bun run dev -- <command> |
Current command only |
| Login flag | lh login --server http://localhost:4000 |
Saved to ~/.lobehub/settings.json |
Priority: LOBEHUB_SERVER env var > settings.json > default official URL.
Shell Completion
Install completion for a linked CLI
| Shell | Command |
|---|---|
zsh |
source <(lh completion zsh) |
bash |
source <(lh completion bash) |
Use completion during local development
| Shell | Command |
|---|---|
zsh |
source <(bun src/index.ts completion zsh) |
bash |
source <(bun src/index.ts completion bash) |
- Completion is context-aware. For example,
lh agent <Tab>shows agent subcommands instead of top-level commands. - If you update completion logic locally, re-run the corresponding
source <(...)command to reload it in the current shell session. - Completion only registers shell functions. It does not install the
lhbinary by itself.
Quick Check
which lh
lh --help
lh agent <TAB>