Compare commits
1 Commits
census/fea
...
fix/ci-sta
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5eb5bfbdef |
@@ -1,477 +0,0 @@
|
||||
# Hermes Agent — Feature Census
|
||||
|
||||
**Epic:** [#290 — Know Thy Agent: Hermes Feature Census](https://forge.alexanderwhitestone.com/Timmy_Foundation/hermes-agent/issues/290)
|
||||
**Date:** 2026-04-11
|
||||
**Source:** Timmy_Foundation/hermes-agent (fork of NousResearch/hermes-agent)
|
||||
**Upstream:** NousResearch/hermes-agent (last sync: 2026-04-07, 499 commits merged in PR #201)
|
||||
**Codebase:** ~200K lines Python (335 source files), 470 test files
|
||||
|
||||
---
|
||||
|
||||
## 1. Feature Matrix
|
||||
|
||||
### 1.1 Memory System
|
||||
|
||||
| Feature | Status | File:Line | Notes |
|
||||
|---------|--------|-----------|-------|
|
||||
| **`add` action** | ✅ Exists | `tools/memory_tool.py:457` | Append entry to MEMORY.md or USER.md |
|
||||
| **`replace` action** | ✅ Exists | `tools/memory_tool.py:466` | Find by substring, replace content |
|
||||
| **`remove` action** | ✅ Exists | `tools/memory_tool.py:475` | Find by substring, delete entry |
|
||||
| **Dual stores (memory + user)** | ✅ Exists | `tools/memory_tool.py:43-45` | MEMORY.md (2200 char limit) + USER.md (1375 char limit) |
|
||||
| **Entry deduplication** | ✅ Exists | `tools/memory_tool.py:128-129` | Exact-match dedup on load |
|
||||
| **Injection/exfiltration scanning** | ✅ Exists | `tools/memory_tool.py:85` | Blocks prompt injection, role hijacking, secret exfil |
|
||||
| **Frozen snapshot pattern** | ✅ Exists | `tools/memory_tool.py:119-135` | Preserves LLM prefix cache across session |
|
||||
| **Atomic writes** | ✅ Exists | `tools/memory_tool.py:417-436` | tempfile.mkstemp + os.replace |
|
||||
| **File locking (fcntl)** | ✅ Exists | `tools/memory_tool.py:137-153` | Exclusive lock for concurrent safety |
|
||||
| **External provider plugin** | ✅ Exists | `agent/memory_manager.py` | Supports 1 external provider (Honcho, Mem0, Hindsight, etc.) |
|
||||
| **Provider lifecycle hooks** | ✅ Exists | `agent/memory_provider.py:55-66` | on_memory_write, prefetch, sync_turn, on_session_end, on_pre_compress, on_delegation |
|
||||
| **Session search (past conversations)** | ✅ Exists | `tools/session_search_tool.py:492` | FTS5 search across SQLite message store |
|
||||
| **Holographic memory** | 🔌 Plugin slot | Config `memory.provider` | Accepted as external provider name, not built-in |
|
||||
| **Engram integration** | ❌ Not present | — | Not in codebase; Engram is a Timmy Foundation project |
|
||||
| **Trust system** | ❌ Not present | — | No trust scoring on memory entries |
|
||||
|
||||
### 1.2 Tool System
|
||||
|
||||
| Feature | Status | File:Line | Notes |
|
||||
|---------|--------|-----------|-------|
|
||||
| **Central registry** | ✅ Exists | `tools/registry.py:290` | Module-level singleton, all tools self-register |
|
||||
| **47 static tools** | ✅ Exists | See full list below | Organized in 21+ toolsets |
|
||||
| **Dynamic MCP tools** | ✅ Exists | `tools/mcp_tool.py` | Runtime registration from MCP servers (17 in live instance) |
|
||||
| **Tool approval system** | ✅ Exists | `tools/approval.py` | Manual/smart/off modes, dangerous command detection |
|
||||
| **Toolset composition** | ✅ Exists | `toolsets.py:404` | Composite toolsets (e.g., `debugging = terminal + web + file`) |
|
||||
| **Per-platform toolsets** | ✅ Exists | `toolsets.py` | `hermes-cli`, `hermes-telegram`, `hermes-discord`, etc. |
|
||||
| **Skill management** | ✅ Exists | `tools/skill_manager_tool.py:747` | Create, patch, delete skill documents |
|
||||
| **Mixture of Agents** | ✅ Exists | `tools/mixture_of_agents_tool.py:553` | Route through 4+ frontier LLMs |
|
||||
| **Subagent delegation** | ✅ Exists | `tools/delegate_tool.py:963` | Isolated contexts, up to 3 parallel |
|
||||
| **Code execution sandbox** | ✅ Exists | `tools/code_execution_tool.py:1360` | Python scripts with tool access |
|
||||
| **Image generation** | ✅ Exists | `tools/image_generation_tool.py:694` | FLUX 2 Pro |
|
||||
| **Vision analysis** | ✅ Exists | `tools/vision_tools.py:606` | Multi-provider vision |
|
||||
| **Text-to-speech** | ✅ Exists | `tools/tts_tool.py:974` | Edge TTS, ElevenLabs, OpenAI, NeuTTS |
|
||||
| **Speech-to-text** | ✅ Exists | Config `stt.*` | Local Whisper, Groq, OpenAI, Mistral Voxtral |
|
||||
| **Home Assistant** | ✅ Exists | `tools/homeassistant_tool.py:456-483` | 4 HA tools (list, state, services, call) |
|
||||
| **RL training** | ✅ Exists | `tools/rl_training_tool.py:1376-1394` | 10 Tinker-Atropos tools |
|
||||
| **Browser automation** | ✅ Exists | `tools/browser_tool.py:2137-2211` | 10 tools (navigate, click, type, scroll, screenshot, etc.) |
|
||||
| **Gitea client** | ✅ Exists | `tools/gitea_client.py` | Gitea API integration |
|
||||
| **Cron job management** | ✅ Exists | `tools/cronjob_tools.py:508` | Scheduled task CRUD |
|
||||
| **Send message** | ✅ Exists | `tools/send_message_tool.py:1036` | Cross-platform messaging |
|
||||
|
||||
#### Complete Tool List (47 static)
|
||||
|
||||
| # | Tool | Toolset | File:Line |
|
||||
|---|------|---------|-----------|
|
||||
| 1 | `read_file` | file | `tools/file_tools.py:832` |
|
||||
| 2 | `write_file` | file | `tools/file_tools.py:833` |
|
||||
| 3 | `patch` | file | `tools/file_tools.py:834` |
|
||||
| 4 | `search_files` | file | `tools/file_tools.py:835` |
|
||||
| 5 | `terminal` | terminal | `tools/terminal_tool.py:1783` |
|
||||
| 6 | `process` | terminal | `tools/process_registry.py:1039` |
|
||||
| 7 | `web_search` | web | `tools/web_tools.py:2082` |
|
||||
| 8 | `web_extract` | web | `tools/web_tools.py:2092` |
|
||||
| 9 | `vision_analyze` | vision | `tools/vision_tools.py:606` |
|
||||
| 10 | `image_generate` | image_gen | `tools/image_generation_tool.py:694` |
|
||||
| 11 | `text_to_speech` | tts | `tools/tts_tool.py:974` |
|
||||
| 12 | `skills_list` | skills | `tools/skills_tool.py:1357` |
|
||||
| 13 | `skill_view` | skills | `tools/skills_tool.py:1367` |
|
||||
| 14 | `skill_manage` | skills | `tools/skill_manager_tool.py:747` |
|
||||
| 15 | `browser_navigate` | browser | `tools/browser_tool.py:2137` |
|
||||
| 16 | `browser_snapshot` | browser | `tools/browser_tool.py:2145` |
|
||||
| 17 | `browser_click` | browser | `tools/browser_tool.py:2154` |
|
||||
| 18 | `browser_type` | browser | `tools/browser_tool.py:2162` |
|
||||
| 19 | `browser_scroll` | browser | `tools/browser_tool.py:2170` |
|
||||
| 20 | `browser_back` | browser | `tools/browser_tool.py:2178` |
|
||||
| 21 | `browser_press` | browser | `tools/browser_tool.py:2186` |
|
||||
| 22 | `browser_get_images` | browser | `tools/browser_tool.py:2195` |
|
||||
| 23 | `browser_vision` | browser | `tools/browser_tool.py:2203` |
|
||||
| 24 | `browser_console` | browser | `tools/browser_tool.py:2211` |
|
||||
| 25 | `todo` | todo | `tools/todo_tool.py:260` |
|
||||
| 26 | `memory` | memory | `tools/memory_tool.py:544` |
|
||||
| 27 | `session_search` | session_search | `tools/session_search_tool.py:492` |
|
||||
| 28 | `clarify` | clarify | `tools/clarify_tool.py:131` |
|
||||
| 29 | `execute_code` | code_execution | `tools/code_execution_tool.py:1360` |
|
||||
| 30 | `delegate_task` | delegation | `tools/delegate_tool.py:963` |
|
||||
| 31 | `cronjob` | cronjob | `tools/cronjob_tools.py:508` |
|
||||
| 32 | `send_message` | messaging | `tools/send_message_tool.py:1036` |
|
||||
| 33 | `mixture_of_agents` | moa | `tools/mixture_of_agents_tool.py:553` |
|
||||
| 34 | `ha_list_entities` | homeassistant | `tools/homeassistant_tool.py:456` |
|
||||
| 35 | `ha_get_state` | homeassistant | `tools/homeassistant_tool.py:465` |
|
||||
| 36 | `ha_list_services` | homeassistant | `tools/homeassistant_tool.py:474` |
|
||||
| 37 | `ha_call_service` | homeassistant | `tools/homeassistant_tool.py:483` |
|
||||
| 38-47 | `rl_*` (10 tools) | rl | `tools/rl_training_tool.py:1376-1394` |
|
||||
|
||||
### 1.3 Session System
|
||||
|
||||
| Feature | Status | File:Line | Notes |
|
||||
|---------|--------|-----------|-------|
|
||||
| **Session creation** | ✅ Exists | `gateway/session.py:676` | get_or_create_session with auto-reset |
|
||||
| **Session keying** | ✅ Exists | `gateway/session.py:429` | platform:chat_type:chat_id[:thread_id][:user_id] |
|
||||
| **Reset policies** | ✅ Exists | `gateway/session.py:610` | none / idle / daily / both |
|
||||
| **Session switching (/resume)** | ✅ Exists | `gateway/session.py:825` | Point key at a previous session ID |
|
||||
| **Session branching (/branch)** | ✅ Exists | CLI commands.py | Fork conversation history |
|
||||
| **SQLite persistence** | ✅ Exists | `hermes_state.py:41-94` | sessions + messages + FTS5 search |
|
||||
| **JSONL dual-write** | ✅ Exists | `gateway/session.py:891` | Backward compatibility with legacy format |
|
||||
| **WAL mode concurrency** | ✅ Exists | `hermes_state.py:157` | Concurrent read/write with retry |
|
||||
| **Context compression** | ✅ Exists | Config `compression.*` | Auto-compress when context exceeds ratio |
|
||||
| **Memory flush on reset** | ✅ Exists | `gateway/run.py:632` | Reviews old transcript before auto-reset |
|
||||
| **Token/cost tracking** | ✅ Exists | `hermes_state.py:41` | input, output, cache_read, cache_write, reasoning tokens |
|
||||
| **PII redaction** | ✅ Exists | Config `privacy.redact_pii` | Hash user IDs, strip phone numbers |
|
||||
|
||||
### 1.4 Plugin System
|
||||
|
||||
| Feature | Status | File:Line | Notes |
|
||||
|---------|--------|-----------|-------|
|
||||
| **Plugin discovery** | ✅ Exists | `hermes_cli/plugins.py:5-11` | User (~/.hermes/plugins/), project, pip entry-points |
|
||||
| **Plugin manifest (plugin.yaml)** | ✅ Exists | `hermes_cli/plugins.py` | name, version, requires_env, provides_tools, provides_hooks |
|
||||
| **Lifecycle hooks** | ✅ Exists | `hermes_cli/plugins.py:55-66` | 9 hooks (pre/post tool_call, llm_call, api_request; on_session_start/end/finalize/reset) |
|
||||
| **PluginContext API** | ✅ Exists | `hermes_cli/plugins.py:124-233` | register_tool, inject_message, register_cli_command, register_hook |
|
||||
| **Plugin management CLI** | ✅ Exists | `hermes_cli/plugins_cmd.py:1-690` | install, update, remove, enable, disable |
|
||||
| **Project plugins (opt-in)** | ✅ Exists | `hermes_cli/plugins.py` | Requires HERMES_ENABLE_PROJECT_PLUGINS env var |
|
||||
| **Pip plugins** | ✅ Exists | `hermes_cli/plugins.py` | Entry-point group: hermes_agent.plugins |
|
||||
|
||||
### 1.5 Config System
|
||||
|
||||
| Feature | Status | File:Line | Notes |
|
||||
|---------|--------|-----------|-------|
|
||||
| **YAML config** | ✅ Exists | `hermes_cli/config.py:259-619` | ~120 config keys across 25 sections |
|
||||
| **Schema versioning** | ✅ Exists | `hermes_cli/config.py` | `_config_version: 14` with migration support |
|
||||
| **Provider config** | ✅ Exists | Config `providers.*`, `fallback_providers` | Per-provider overrides, fallback chains |
|
||||
| **Credential pooling** | ✅ Exists | Config `credential_pool_strategies` | Key rotation strategies |
|
||||
| **Auxiliary model config** | ✅ Exists | Config `auxiliary.*` | 8 separate side-task models (vision, compression, etc.) |
|
||||
| **Smart model routing** | ✅ Exists | Config `smart_model_routing.*` | Route simple prompts to cheap model |
|
||||
| **Env var management** | ✅ Exists | `hermes_cli/config.py:643-1318` | ~80 env vars across provider/tool/messaging/setting categories |
|
||||
| **Interactive setup wizard** | ✅ Exists | `hermes_cli/setup.py` | Guided first-run configuration |
|
||||
| **Config migration** | ✅ Exists | `hermes_cli/config.py` | Auto-migrates old config versions |
|
||||
|
||||
### 1.6 Gateway
|
||||
|
||||
| Feature | Status | File:Line | Notes |
|
||||
|---------|--------|-----------|-------|
|
||||
| **18 platform adapters** | ✅ Exists | `gateway/platforms/` | Telegram, Discord, Slack, WhatsApp, Signal, Mattermost, Matrix, HomeAssistant, Email, SMS, DingTalk, API Server, Webhook, Feishu, Wecom, Weixin, BlueBubbles |
|
||||
| **Message queuing** | ✅ Exists | `gateway/run.py:507` | Queue during agent processing, media placeholder support |
|
||||
| **Agent caching** | ✅ Exists | `gateway/run.py:515` | Preserve AIAgent instances per session for prompt caching |
|
||||
| **Background reconnection** | ✅ Exists | `gateway/run.py:527` | Exponential backoff for failed platforms |
|
||||
| **Authorization** | ✅ Exists | `gateway/run.py:1826` | Per-user allowlists, DM pairing codes |
|
||||
| **Slash command interception** | ✅ Exists | `gateway/run.py` | Commands handled before agent (not billed) |
|
||||
| **ACP server** | ✅ Exists | `acp_adapter/server.py:726` | VS Code / Zed / JetBrains integration |
|
||||
| **Cron scheduler** | ✅ Exists | `cron/scheduler.py:850` | Full job scheduler with cron expressions |
|
||||
| **Batch runner** | ✅ Exists | `batch_runner.py:1285` | Parallel batch processing |
|
||||
| **API server** | ✅ Exists | `gateway/platforms/api_server.py` | OpenAI-compatible HTTP API |
|
||||
|
||||
### 1.7 Providers (20 supported)
|
||||
|
||||
| Provider | ID | Key Env Var |
|
||||
|----------|----|-------------|
|
||||
| Nous Portal | `nous` | `NOUS_BASE_URL` |
|
||||
| OpenRouter | `openrouter` | `OPENROUTER_API_KEY` |
|
||||
| Anthropic | `anthropic` | (standard) |
|
||||
| Google AI Studio | `gemini` | `GOOGLE_API_KEY`, `GEMINI_API_KEY` |
|
||||
| OpenAI Codex | `openai-codex` | (standard) |
|
||||
| GitHub Copilot | `copilot` / `copilot-acp` | (OAuth) |
|
||||
| DeepSeek | `deepseek` | `DEEPSEEK_API_KEY` |
|
||||
| Kimi / Moonshot | `kimi-coding` | `KIMI_API_KEY` |
|
||||
| Z.AI / GLM | `zai` | `GLM_API_KEY`, `ZAI_API_KEY` |
|
||||
| MiniMax | `minimax` | `MINIMAX_API_KEY` |
|
||||
| MiniMax (China) | `minimax-cn` | `MINIMAX_CN_API_KEY` |
|
||||
| Alibaba / DashScope | `alibaba` | `DASHSCOPE_API_KEY` |
|
||||
| Hugging Face | `huggingface` | `HF_TOKEN` |
|
||||
| OpenCode Zen | `opencode-zen` | `OPENCODE_ZEN_API_KEY` |
|
||||
| OpenCode Go | `opencode-go` | `OPENCODE_GO_API_KEY` |
|
||||
| Qwen OAuth | `qwen-oauth` | (Portal) |
|
||||
| AI Gateway | `ai-gateway` | (Nous) |
|
||||
| Kilo Code | `kilocode` | (standard) |
|
||||
| Ollama (local) | — | First-class via auxiliary wiring |
|
||||
| Custom endpoint | `custom` | user-provided URL |
|
||||
|
||||
### 1.8 UI / UX
|
||||
|
||||
| Feature | Status | File:Line | Notes |
|
||||
|---------|--------|-----------|-------|
|
||||
| **Skin/theme engine** | ✅ Exists | `hermes_cli/skin_engine.py` | 7 built-in skins, user YAML skins |
|
||||
| **Kawaii spinner** | ✅ Exists | `agent/display.py` | Animated faces, configurable verbs/wings |
|
||||
| **Rich banner** | ✅ Exists | `banner.py` | Logo, hero art, system info |
|
||||
| **Prompt_toolkit input** | ✅ Exists | `cli.py` | Autocomplete, history, syntax |
|
||||
| **Streaming output** | ✅ Exists | Config `display.streaming` | Optional streaming |
|
||||
| **Reasoning display** | ✅ Exists | Config `display.show_reasoning` | Show/hide chain-of-thought |
|
||||
| **Cost display** | ✅ Exists | Config `display.show_cost` | Show $ in status bar |
|
||||
| **Voice mode** | ✅ Exists | Config `voice.*` | Ctrl+B record, auto-TTS, silence detection |
|
||||
| **Human delay simulation** | ✅ Exists | Config `human_delay.*` | Simulated typing delay |
|
||||
|
||||
### 1.9 Security
|
||||
|
||||
| Feature | Status | File:Line | Notes |
|
||||
|---------|--------|-----------|-------|
|
||||
| **Tirith security scanning** | ✅ Exists | `tools/tirith_security.py` | Pre-exec code scanning |
|
||||
| **Secret redaction** | ✅ Exists | Config `security.redact_secrets` | Auto-strip secrets from output |
|
||||
| **Memory injection scanning** | ✅ Exists | `tools/memory_tool.py:85` | Blocks prompt injection in memory |
|
||||
| **URL safety** | ✅ Exists | `tools/url_safety.py` | URL reputation checking |
|
||||
| **Command approval** | ✅ Exists | `tools/approval.py` | Manual/smart/off modes |
|
||||
| **OSV vulnerability check** | ✅ Exists | `tools/osv_check.py` | Open Source Vulnerabilities DB |
|
||||
| **Conscience validator** | ✅ Exists | `tools/conscience_validator.py` | SOUL.md alignment checking |
|
||||
| **Shield detector** | ✅ Exists | `tools/shield/detector.py` | Jailbreak/crisis detection |
|
||||
|
||||
---
|
||||
|
||||
## 2. Architecture Overview
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ Entry Points │
|
||||
├──────────┬──────────┬──────────┬──────────┬─────────────┤
|
||||
│ CLI │ Gateway │ ACP │ Cron │ Batch Runner│
|
||||
│ cli.py │gateway/ │acp_apt/ │ cron/ │batch_runner │
|
||||
│ 8620 ln │ run.py │server.py │sched.py │ 1285 ln │
|
||||
│ │ 7905 ln │ 726 ln │ 850 ln │ │
|
||||
└────┬─────┴────┬─────┴──────────┴──────┬───┴─────────────┘
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ AIAgent (run_agent.py, 9423 ln) │
|
||||
│ ┌──────────────────────────────────────────────────┐ │
|
||||
│ │ Core Conversation Loop │ │
|
||||
│ │ while iterations < max: │ │
|
||||
│ │ response = client.chat(tools, messages) │ │
|
||||
│ │ if tool_calls: handle_function_call() │ │
|
||||
│ │ else: return response │ │
|
||||
│ └──────────────────────┬───────────────────────────┘ │
|
||||
│ │ │
|
||||
│ ┌──────────────────────▼───────────────────────────┐ │
|
||||
│ │ model_tools.py (577 ln) │ │
|
||||
│ │ _discover_tools() → handle_function_call() │ │
|
||||
│ └──────────────────────┬───────────────────────────┘ │
|
||||
└─────────────────────────┼───────────────────────────────┘
|
||||
│
|
||||
┌────────────────────▼────────────────────┐
|
||||
│ tools/registry.py (singleton) │
|
||||
│ ToolRegistry.register() → dispatch() │
|
||||
└────────────────────┬────────────────────┘
|
||||
│
|
||||
┌─────────┬───────────┼───────────┬────────────────┐
|
||||
▼ ▼ ▼ ▼ ▼
|
||||
┌────────┐┌────────┐┌──────────┐┌──────────┐ ┌──────────┐
|
||||
│ file ││terminal││ web ││ browser │ │ memory │
|
||||
│ tools ││ tool ││ tools ││ tool │ │ tool │
|
||||
│ 4 tools││2 tools ││ 2 tools ││ 10 tools │ │ 3 actions│
|
||||
└────────┘└────────┘└──────────┘└──────────┘ └────┬─────┘
|
||||
│
|
||||
┌──────────▼──────────┐
|
||||
│ agent/memory_manager │
|
||||
│ ┌──────────────────┐│
|
||||
│ │BuiltinProvider ││
|
||||
│ │(MEMORY.md+USER.md)│
|
||||
│ ├──────────────────┤│
|
||||
│ │External Provider ││
|
||||
│ │(optional, 1 max) ││
|
||||
│ └──────────────────┘│
|
||||
└─────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ Session Layer │
|
||||
│ SessionStore (gateway/session.py, 1030 ln) │
|
||||
│ SessionDB (hermes_state.py, 1238 ln) │
|
||||
│ ┌───────────┐ ┌─────────────────────────────┐ │
|
||||
│ │sessions.js│ │ state.db (SQLite + FTS5) │ │
|
||||
│ │ JSONL │ │ sessions │ messages │ fts │ │
|
||||
│ └───────────┘ └─────────────────────────────┘ │
|
||||
└─────────────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ Gateway Platform Adapters │
|
||||
│ telegram │ discord │ slack │ whatsapp │ signal │
|
||||
│ matrix │ email │ sms │ mattermost│ api │
|
||||
│ homeassistant │ dingtalk │ feishu │ wecom │ ... │
|
||||
└─────────────────────────────────────────────────┘
|
||||
|
||||
┌─────────────────────────────────────────────────┐
|
||||
│ Plugin System │
|
||||
│ User ~/.hermes/plugins/ │ Project .hermes/ │
|
||||
│ Pip entry-points (hermes_agent.plugins) │
|
||||
│ 9 lifecycle hooks │ PluginContext API │
|
||||
└─────────────────────────────────────────────────┘
|
||||
```
|
||||
|
||||
**Key dependency chain:**
|
||||
```
|
||||
tools/registry.py (no deps — imported by all tool files)
|
||||
↑
|
||||
tools/*.py (each calls registry.register() at import time)
|
||||
↑
|
||||
model_tools.py (imports tools/registry + triggers tool discovery)
|
||||
↑
|
||||
run_agent.py, cli.py, batch_runner.py, environments/
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 3. Recent Development Activity (Last 30 Days)
|
||||
|
||||
### Activity Summary
|
||||
|
||||
| Metric | Value |
|
||||
|--------|-------|
|
||||
| Total commits (since 2026-03-12) | ~1,750 |
|
||||
| Top contributor | Teknium (1,169 commits) |
|
||||
| Timmy Foundation commits | ~55 (Alexander Whitestone: 21, Timmy Time: 22, Bezalel: 12) |
|
||||
| Key upstream sync | PR #201 — 499 commits from NousResearch/hermes-agent (2026-04-07) |
|
||||
|
||||
### Top Contributors (Last 30 Days)
|
||||
|
||||
| Contributor | Commits | Focus Area |
|
||||
|-------------|---------|------------|
|
||||
| Teknium | 1,169 | Core features, bug fixes, streaming, browser, Telegram/Discord |
|
||||
| teknium1 | 238 | Supplementary work |
|
||||
| 0xbyt4 | 117 | Various |
|
||||
| Test | 61 | Testing |
|
||||
| Allegro | 49 | Fleet ops, CI |
|
||||
| kshitijk4poor | 30 | Features |
|
||||
| SHL0MS | 25 | Features |
|
||||
| Google AI Agent | 23 | MemPalace plugin |
|
||||
| Timmy Time | 22 | CI, fleet config, merge coordination |
|
||||
| Alexander Whitestone | 21 | Memory fixes, browser PoC, docs, CI, provider config |
|
||||
| Bezalel | 12 | CI pipeline, devkit, health checks |
|
||||
|
||||
### Key Upstream Changes (Merged in Last 30 Days)
|
||||
|
||||
| Change | PR | Impact |
|
||||
|--------|----|--------|
|
||||
| Browser provider switch (Browserbase → Browser Use) | upstream #5750 | Breaking change in browser tooling |
|
||||
| notify_on_complete for background processes | upstream #5779 | New feature for async workflows |
|
||||
| Interactive model picker (Telegram + Discord) | upstream #5742 | UX improvement |
|
||||
| Streaming fix after tool boundaries | upstream #5739 | Bug fix |
|
||||
| Delegate: share credential pools with subagents | upstream | Security improvement |
|
||||
| Permanent command allowlist on startup | upstream #5076 | Bug fix |
|
||||
| Paginated model picker for Telegram | upstream | UX improvement |
|
||||
| Slack thread replies without @mentions | upstream | Gateway improvement |
|
||||
| Supermemory memory provider (added then removed) | upstream | Experimental, rolled back |
|
||||
| Background process management overhaul | upstream | Major feature |
|
||||
|
||||
### Timmy Foundation Contributions (Our Fork)
|
||||
|
||||
| Change | PR | Author |
|
||||
|--------|----|--------|
|
||||
| Memory remove action bridge fix | #277 | Alexander Whitestone |
|
||||
| Browser integration PoC + analysis | #262 | Alexander Whitestone |
|
||||
| Memory budget enforcement tool | #256 | Alexander Whitestone |
|
||||
| Memory sovereignty verification | #257 | Alexander Whitestone |
|
||||
| Memory Architecture Guide | #263, #258 | Alexander Whitestone |
|
||||
| MemPalace plugin creation | #259, #265 | Google AI Agent |
|
||||
| CI: duplicate model detection | #235 | Alexander Whitestone |
|
||||
| Kimi model config fix | #225 | Bezalel |
|
||||
| Ollama provider wiring fix | #223 | Alexander Whitestone |
|
||||
| Deep Self-Awareness Epic | #215 | Bezalel |
|
||||
| BOOT.md for repo | #202 | Bezalel |
|
||||
| Upstream sync (499 commits) | #201 | Alexander Whitestone |
|
||||
| Forge CI pipeline | #154, #175, #187 | Bezalel |
|
||||
| Gitea PR & Issue automation skill | #181 | Bezalel |
|
||||
| Development tools for wizard fleet | #166 | Bezalel |
|
||||
| KNOWN_VIOLATIONS justification | #267 | Manus AI |
|
||||
|
||||
---
|
||||
|
||||
## 4. Overlap Analysis
|
||||
|
||||
### What We're Building That Already Exists
|
||||
|
||||
| Timmy Foundation Planned Work | Hermes-Agent Already Has | Verdict |
|
||||
|------------------------------|--------------------------|---------|
|
||||
| **Memory system (add/remove/replace)** | `tools/memory_tool.py` with all 3 actions | **USE IT** — already exists, we just needed the `remove` fix (PR #277) |
|
||||
| **Session persistence** | SQLite + JSONL dual-write system | **USE IT** — battle-tested, FTS5 search included |
|
||||
| **Gateway platform adapters** | 18 adapters including Telegram, Discord, Matrix | **USE IT** — don't rebuild, contribute fixes |
|
||||
| **Config management** | Full YAML config with migration, env vars | **USE IT** — extend rather than replace |
|
||||
| **Plugin system** | Complete with lifecycle hooks, PluginContext API | **USE IT** — write plugins, not custom frameworks |
|
||||
| **Tool registry** | Centralized registry with self-registration | **USE IT** — register new tools via existing pattern |
|
||||
| **Cron scheduling** | `cron/scheduler.py` + `cronjob` tool | **USE IT** — integrate rather than duplicate |
|
||||
| **Subagent delegation** | `delegate_task` with isolated contexts | **USE IT** — extend for fleet coordination |
|
||||
|
||||
### What We Need That Doesn't Exist
|
||||
|
||||
| Timmy Foundation Need | Hermes-Agent Status | Action |
|
||||
|----------------------|---------------------|--------|
|
||||
| **Engram integration** | Not present | Build as external memory provider plugin |
|
||||
| **Holographic fact store** | Accepted as provider name, not implemented | Build as external memory provider |
|
||||
| **Fleet orchestration** | Not present (single-agent focus) | Build on top, contribute patterns upstream |
|
||||
| **Trust scoring on memory** | Not present | Build as extension to memory tool |
|
||||
| **Multi-agent coordination** | delegate_tool supports parallel (max 3) | Extend for fleet-wide dispatch |
|
||||
| **VPS wizard deployment** | Not present | Timmy Foundation domain — build independently |
|
||||
| **Gitea CI/CD integration** | Minimal (gitea_client.py exists) | Extend existing client |
|
||||
|
||||
### Duplication Risk Assessment
|
||||
|
||||
| Risk | Level | Details |
|
||||
|------|-------|---------|
|
||||
| Memory system duplication | 🟢 LOW | We were almost duplicating memory removal (PR #278 vs #277). Now resolved. |
|
||||
| Config system duplication | 🟢 LOW | Using hermes config directly via fork |
|
||||
| Gateway duplication | 🟡 MEDIUM | Our fleet-ops patterns may partially overlap with gateway capabilities |
|
||||
| Session management duplication | 🟢 LOW | Using hermes sessions directly |
|
||||
| Plugin system duplication | 🟢 LOW | We write plugins, not a parallel system |
|
||||
|
||||
---
|
||||
|
||||
## 5. Contribution Roadmap
|
||||
|
||||
### What to Build (Timmy Foundation Own)
|
||||
|
||||
| Item | Rationale | Priority |
|
||||
|------|-----------|----------|
|
||||
| **Engram memory provider** | Sovereign local memory (Go binary, SQLite+FTS). Must be ours. | 🔴 HIGH |
|
||||
| **Holographic fact store** | Our architecture for knowledge graph memory. Unique to Timmy. | 🔴 HIGH |
|
||||
| **Fleet orchestration layer** | Multi-wizard coordination (Allegro, Bezalel, Ezra, Claude). Not upstream's problem. | 🔴 HIGH |
|
||||
| **VPS deployment automation** | Sovereign wizard provisioning. Timmy-specific. | 🟡 MEDIUM |
|
||||
| **Trust scoring system** | Evaluate memory entry reliability. Research needed. | 🟡 MEDIUM |
|
||||
| **Gitea CI/CD integration** | Deep integration with our forge. Extend gitea_client.py. | 🟡 MEDIUM |
|
||||
| **SOUL.md compliance tooling** | Conscience validator exists (`tools/conscience_validator.py`). Extend it. | 🟢 LOW |
|
||||
|
||||
### What to Contribute Upstream
|
||||
|
||||
| Item | Rationale | Difficulty |
|
||||
|------|-----------|------------|
|
||||
| **Memory remove action fix** | Already done (PR #277). ✅ | Done |
|
||||
| **Browser integration analysis** | Useful for all users (PR #262). ✅ | Done |
|
||||
| **CI stability improvements** | Reduce deps, increase timeout (our commit). ✅ | Done |
|
||||
| **Duplicate model detection** | CI check useful for all forks (PR #235). ✅ | Done |
|
||||
| **Memory sovereignty patterns** | Verification scripts, budget enforcement. Useful broadly. | Medium |
|
||||
| **Engram provider adapter** | If Engram proves useful, offer as memory provider option. | Medium |
|
||||
| **Fleet delegation patterns** | If multi-agent coordination patterns generalize. | Hard |
|
||||
| **Wizard health monitoring** | If monitoring patterns generalize to any agent fleet. | Medium |
|
||||
|
||||
### Quick Wins (Next Sprint)
|
||||
|
||||
1. **Verify memory remove action** — Confirm PR #277 works end-to-end in our fork
|
||||
2. **Test browser tool after upstream switch** — Browserbase → Browser Use (upstream #5750) may break our PoC
|
||||
3. **Update provider config** — Kimi model references updated (PR #225), verify no remaining stale refs
|
||||
4. **Engram provider prototype** — Start implementing as external memory provider plugin
|
||||
5. **Fleet health integration** — Use gateway's background reconnection patterns for wizard fleet
|
||||
|
||||
---
|
||||
|
||||
## Appendix A: File Counts by Directory
|
||||
|
||||
| Directory | Files | Lines |
|
||||
|-----------|-------|-------|
|
||||
| `tools/` | 70+ .py files | ~50K |
|
||||
| `gateway/` | 20+ .py files | ~25K |
|
||||
| `agent/` | 10 .py files | ~10K |
|
||||
| `hermes_cli/` | 15 .py files | ~20K |
|
||||
| `acp_adapter/` | 9 .py files | ~8K |
|
||||
| `cron/` | 3 .py files | ~2K |
|
||||
| `tests/` | 470 .py files | ~80K |
|
||||
| **Total** | **335 source + 470 test** | **~200K + ~80K** |
|
||||
|
||||
## Appendix B: Key File Index
|
||||
|
||||
| File | Lines | Purpose |
|
||||
|------|-------|---------|
|
||||
| `run_agent.py` | 9,423 | AIAgent class, core conversation loop |
|
||||
| `cli.py` | 8,620 | CLI orchestrator, slash command dispatch |
|
||||
| `gateway/run.py` | 7,905 | Gateway main loop, platform management |
|
||||
| `tools/terminal_tool.py` | 1,783 | Terminal orchestration |
|
||||
| `tools/web_tools.py` | 2,082 | Web search + extraction |
|
||||
| `tools/browser_tool.py` | 2,211 | Browser automation (10 tools) |
|
||||
| `tools/code_execution_tool.py` | 1,360 | Python sandbox |
|
||||
| `tools/delegate_tool.py` | 963 | Subagent delegation |
|
||||
| `tools/mcp_tool.py` | ~1,050 | MCP client |
|
||||
| `tools/memory_tool.py` | 560 | Memory CRUD |
|
||||
| `hermes_state.py` | 1,238 | SQLite session store |
|
||||
| `gateway/session.py` | 1,030 | Session lifecycle |
|
||||
| `cron/scheduler.py` | 850 | Job scheduler |
|
||||
| `hermes_cli/config.py` | 1,318 | Config system |
|
||||
| `hermes_cli/plugins.py` | 611 | Plugin system |
|
||||
| `hermes_cli/skin_engine.py` | 500+ | Theme engine |
|
||||
Reference in New Issue
Block a user