hermes-agent/tests/gateway
teknium1 b159002078 feat: multi-agent architecture — named agents with routing, tool policies, and isolated workspaces
Implements the full multi-agent system for Hermes Agent, allowing a single
installation to host multiple named agents, each with its own model,
personality, toolset, workspace, and session history.

## New Files

- gateway/agent_registry.py: AgentConfig, ToolPolicy, SubagentPolicy,
  AgentRegistry, TOOL_PROFILES (minimal/coding/messaging/full), and
  normalize_tool_config() for shorthand YAML parsing

- gateway/router.py: BindingRouter with 7-tier deterministic routing
  (chat_id > peer > guild+type > guild > platform+type > platform > default)

## Core Changes

- model_tools.py: get_tool_definitions() accepts agent_tool_policy for
  per-agent tool filtering; handle_function_call() extended enabled_tools
  check to gate ALL tool calls (defense-in-depth)

- gateway/session.py: build_session_key() now accepts agent_id and dm_scope
  parameters, replacing hardcoded 'agent:main' with 'agent:{agent_id}'

- tools/memory_tool.py: MemoryStore accepts memory_dir parameter for
  per-agent memory isolation

- agent/prompt_builder.py: build_context_files_prompt() accepts
  agent_workspace for SOUL.md lookup; build_skills_system_prompt()
  accepts agent_skills_dir for per-agent skill overlay

- run_agent.py: AIAgent accepts agent_tool_policy and agent_workspace,
  passes policy through to get_tool_definitions()

- gateway/run.py: Initializes AgentRegistry + BindingRouter, resolves
  agent per-message in _handle_message(), passes config to _run_agent(),
  adds /agents command

- cli.py: --agent flag for selecting named agent profiles, /agents
  slash command, agent config override for model/personality/tools

- hermes_cli/config.py: agents/bindings in DEFAULT_CONFIG, version 7

- tools/delegate_tool.py: Configurable max_depth per-agent, tool policy
  inheritance from parent to child

## Config Format

agents:
  main:
    default: true
  coder:
    model: anthropic/claude-sonnet-4
    personality: 'You are a coding assistant.'
    tools: coding  # or [tool1, tool2] or {profile: x, deny: [...]}

bindings:
  - agent: coder
    telegram: '-100123456'

## Tests

168 new tests across 3 test files (agent_registry, router, integration).
All 3106 tests pass.
2026-03-11 03:21:12 -07:00
..
__init__.py test: reorganize test structure and add missing unit tests 2026-02-26 03:20:08 +03:00
test_agent_registry.py feat: multi-agent architecture — named agents with routing, tool policies, and isolated workspaces 2026-03-11 03:21:12 -07:00
test_async_memory_flush.py feat(gateway): proactive async memory flush on session expiry 2026-03-07 11:27:50 -08:00
test_background_process_notifications.py feat(gateway): configurable background process watcher notifications 2026-03-10 04:12:39 -07:00
test_channel_directory.py test: add unit tests for 8 untested modules (batch 3) (#191) 2026-03-01 05:28:12 -08:00
test_config.py test: reorganize test structure and add missing unit tests 2026-02-26 03:20:08 +03:00
test_delivery.py test: reorganize test structure and add missing unit tests 2026-02-26 03:20:08 +03:00
test_document_cache.py fix(security): patch path traversal, size bypass, and prompt injection in document processing 2026-02-27 11:53:46 -05:00
test_homeassistant.py feat: enhance Home Assistant integration with service discovery and setup 2026-03-03 05:16:53 -08:00
test_hooks.py test: strengthen assertions across 7 test files (batch 1) 2026-03-05 18:39:37 -08:00
test_media_extraction.py fix(gateway): prevent TTS voice messages from accumulating across turns 2026-02-28 03:38:27 -05:00
test_mirror.py fix: sanitize FTS5 queries and close mirror DB connections 2026-03-07 04:24:45 +03:00
test_multi_agent_integration.py feat: multi-agent architecture — named agents with routing, tool policies, and isolated workspaces 2026-03-11 03:21:12 -07:00
test_pairing.py test: strengthen assertions across 7 test files (batch 1) 2026-03-05 18:39:37 -08:00
test_platform_base.py test: strengthen assertions across 7 test files (batch 1) 2026-03-05 18:39:37 -08:00
test_resume_command.py feat: add /resume command to gateway for switching to named sessions 2026-03-08 17:09:00 -07:00
test_router.py feat: multi-agent architecture — named agents with routing, tool policies, and isolated workspaces 2026-03-11 03:21:12 -07:00
test_send_image_file.py feat: browser screenshot sharing via MEDIA: on all messaging platforms 2026-03-07 22:57:05 -08:00
test_session.py Merge PR #370: fix(session): use database session count for has_any_sessions 2026-03-04 05:37:15 -08:00
test_session_hygiene.py fix: unify gateway session hygiene with agent compression config 2026-03-08 21:30:48 -07:00
test_signal.py fix: Signal adapter parity pass — integration gaps, clawdbot features, env var simplification 2026-03-08 21:00:21 -07:00
test_slack.py feat(slack): fix app_mention 404 + add document/video support 2026-03-09 13:02:59 -07:00
test_sticker_cache.py test: add unit tests for 8 untested modules (batch 3) (#191) 2026-03-01 05:28:12 -08:00
test_telegram_documents.py fix(security): patch path traversal, size bypass, and prompt injection in document processing 2026-02-27 11:53:46 -05:00
test_telegram_format.py fix: strip MarkdownV2 italic markers in Telegram plaintext fallback 2026-03-07 18:55:25 +03:00
test_title_command.py fix: add title validation — sanitize, length limit, control char stripping 2026-03-08 15:54:51 -07:00
test_transcript_offset.py fix(gateway): use filtered history length for transcript message extraction 2026-03-04 21:34:40 +03:00
test_update_command.py feat: add /update slash command for gateway platforms 2026-03-05 01:20:58 -08:00
test_whatsapp_connect.py fix(whatsapp): replace Linux-only fuser with cross-platform port cleanup 2026-03-05 17:13:14 +03:00