Files
bot/docs/cli/agents.md
zeekayandHanzo Dev 84e4069c2c docs name the state dir and config file the bot reads: ~/.bot/bot.json
The docs said ~/.hanzo-bot/hanzo-bot.json (and ~/.hanzo-bot-<profile>, hanzo-bot.plugin.json), which nothing reads: src/config/paths.ts resolves ~/.bot, bot.json and ~/.bot-<profile>, and plugins ship bot.plugin.json. Every such path in docs/ now names what the code opens.

Co-authored-by: Hanzo Dev <[email protected]>
2026-09-24 21:12:09 -07:00

3.2 KiB

summary, read_when, title
summary read_when title
CLI reference for `hanzo-bot agents` (list/add/delete/bindings/bind/unbind/set identity)
You want multiple isolated agents (workspaces + routing + auth)
agents

hanzo-bot agents

Manage isolated agents (workspaces + auth + routing).

Related:

Examples

hanzo-bot agents list
hanzo-bot agents add work --workspace ~/.bot/workspace-work
hanzo-bot agents bindings
hanzo-bot agents bind --agent work --bind telegram:ops
hanzo-bot agents unbind --agent work --bind telegram:ops
hanzo-bot agents set-identity --workspace ~/.bot/workspace --from-identity
hanzo-bot agents set-identity --agent main --avatar avatars/hanzo-bot.png
hanzo-bot agents delete work

Routing bindings

Use routing bindings to pin inbound channel traffic to a specific agent.

List bindings:

hanzo-bot agents bindings
hanzo-bot agents bindings --agent work
hanzo-bot agents bindings --json

Add bindings:

hanzo-bot agents bind --agent work --bind telegram:ops --bind discord:guild-a

If you omit accountId (--bind <channel>), HanzoBot resolves it from channel defaults and plugin setup hooks when available.

Binding scope behavior

  • A binding without accountId matches the channel default account only.
  • accountId: "*" is the channel-wide fallback (all accounts) and is less specific than an explicit account binding.
  • If the same agent already has a matching channel binding without accountId, and you later bind with an explicit or resolved accountId, HanzoBot upgrades that existing binding in place instead of adding a duplicate.

Example:

# initial channel-only binding
hanzo-bot agents bind --agent work --bind telegram

# later upgrade to account-scoped binding
hanzo-bot agents bind --agent work --bind telegram:ops

After the upgrade, routing for that binding is scoped to telegram:ops. If you also want default-account routing, add it explicitly (for example --bind telegram:default).

Remove bindings:

hanzo-bot agents unbind --agent work --bind telegram:ops
hanzo-bot agents unbind --agent work --all

Identity files

Each agent workspace can include an IDENTITY.md at the workspace root:

  • Example path: ~/.bot/workspace/IDENTITY.md
  • set-identity --from-identity reads from the workspace root (or an explicit --identity-file)

Avatar paths resolve relative to the workspace root.

Set identity

set-identity writes fields into agents.list[].identity:

  • name
  • theme
  • emoji
  • avatar (workspace-relative path, http(s) URL, or data URI)

Load from IDENTITY.md:

hanzo-bot agents set-identity --workspace ~/.bot/workspace --from-identity

Override fields explicitly:

hanzo-bot agents set-identity --agent main --name "HanzoBot" --emoji "🤖" --avatar avatars/hanzo-bot.png

Config sample:

{
  agents: {
    list: [
      {
        id: "main",
        identity: {
          name: "HanzoBot",
          theme: "midnight",
          emoji: "🤖",
          avatar: "avatars/hanzo-bot.png",
        },
      },
    ],
  },
}