> ⚠️ **AI-Assisted Programming Notice**: Parts of this project's code, documentation, and commit history were generated or modified with AI assistance. Key changes have been human-reviewed, but please evaluate and verify before use. # HomeAgent > **中文**: [README.md](./README.md) An Agent framework designed around **separation of core domain and application domain**. The kernel enforces a zero-IO policy — all external interaction (WebUI, QQ, CLI, file operations, web search, memos, etc.) is handled by the plugin layer; the kernel performs no direct IO operations. Combined with a **three-layer memory architecture** (Context → Document → Graph), it maintains contextual coherence across long-running single-conversation sessions through tiered storage and automated archival. ```go homed (kernel, zero IO) ← PluginSDK → plugins (all IO capabilities) ``` **Since v1.0.0 external plugins are independent subprocesses**, communicating with the kernel over stdio JSON-RPC (control plane) + a shared memory segment (data plane) + an event ring (notification plane). A plugin crash cannot take down the kernel and it restarts automatically; swapping `plugin.bin` gives true hot-reload. ## Design Principles **Separation of Core Domain and Application Domain** — The kernel's responsibilities are limited to LLM orchestration, memory management, and knowledge retrieval; all IO capabilities (message send/receive, file read/write, network requests, hardware interaction, etc.) are implemented by plugins. This separation defines domain boundaries at the Agent framework level, with distinct responsibility scopes for the kernel and plugins. **Three-Layer Memory Architecture** — Manages information retention in long-running agents through a tiered storage strategy: - **Context Layer**: Pretrained word embedding / TF-IDF fallback relevance-scored event window, protects last 10 entries, maintains topK context entries - **Document Layer**: Temporary memory with automatic cold data sinking, also supports user-initiated submissions - **Graph Layer**: SQLite graph database, persists entity relationships and semantic memory, supports distillation pipelines to extract triples from conversations ## Architecture Diagrams ### 1. Message Processing Sequence ```mermaid sequenceDiagram participant U as User/Plugin participant IO as IOManager participant EV as eventLoop participant CTX as RelevanceContext participant LLM as LLM+Tool Loop participant ST as StageHost participant MEM as Three-Layer Memory U->>IO: InjectInput(type, payload) IO->>EV: inputCh rect lavender Note over EV: processTextInput EV->>ST: StageOnInput Plugin can rewrite/short-circuit EV->>CTX: Prune(input,topK) StaticEmbedder/TF-IDF cosine pruning CTX->>MEM: Low-score events archived to Document (original timestamp) EV->>CTX: Append(input) CleanTemplateText→three-branch vector→5s write end rect lightgreen Note over EV,LLM: process() EV->>MEM: buildMemoryContext Indexer recalls from Graph (vector+jieba→BFS depth=2) EV->>MEM: buildSystemPrompt DocQuery summary+Graph memory index+Persona+Skills EV->>ST: StagePreAction Plugin can pre-intercept loop Tool loop LLM->>LLM: drainInterrupts LLM->>LLM: LLM Chat LLM->>ST: StagePostAction Plugin can modify/short-circuit alt No tool call LLM-->>EV: Returns response else loop Each tool ST->>ST: StageBeforeToolcall Plugin can reject LLM->>LLM: executeToolCall ST->>ST: StageAfterToolcall end end end end rect lightpink Note over EV: emitResponse CTX->>CTX: Append(response) ST->>ST: StageBeforeOutput Plugin can rewrite EV-->>U: ResponseCh CLI sync EV-->>EV: Event bus WebUI SSE ST->>ST: StageAfterOutput Read-only EV->>MEM: emitMemoryCandidate end ``` ### 2. Stage Pipeline ```mermaid flowchart LR S1[① on_input] --> S2[② pre_action] S2 --> S3[③ post_action] S3 --> Q{Has tool?} Q -->|Yes| S4[④ before_toolcall] S4 --> T[executeToolCall] T --> S5[⑤ after_toolcall] S5 --> S3 Q -->|No| S6[⑥ before_output] S6 --> S7[⑦ after_output] style S1 fill:#e1f5fe style S3 fill:#fff3e0 style S6 fill:#e8f5e9 ``` ### 3. Three-Layer Memory ```mermaid flowchart TB subgraph C[① Context Working Window] RC[RelevanceContext] A[Append] -->|CleanTemplateText→three-branch vector| RC P[Prune StaticEmbedder/TF-IDF Cosine] -->|Low score original timestamp| D P -->|Keep| TL[timeline→chronological→system prompt] end subgraph D[② Document File Memory] DS[DocStore JSON+TF-IDF] Q1[Query summary auto-inject] -->|[Related Memory Docs]| SP Q2[doc_query LLM active recall] -->|Consume+delete source| DS Q2 -->|Original timestamp write to context| RC CD[FindColdDocs 72h] -->|docToTriples| G end subgraph G[③ Graph Database] DB[(SQLite)] IDX[Indexer vector+jieba→BFS depth=2] -->|[Memory Index]| SP MEM[memory_recall/commit/merge/purge/edit] SOC[person_query/set_trait] end subgraph H[④ Heartbeat Distillation] REORG -->|Step3 Cold docs| CD REORG -->|Step4 Bigram Jaccard| CONS[consolidation] PIPE[Pipeline regex] -->|Name/Address/Likes/Age/Job| DB end SP[System Prompt] -->|Sequential assembly| LLM LLM[LLM] -->|doc_query| Q2 LLM -->|memory_recall| MEM ``` See [`assets/docs/en/ARCHITECTURE.md`](assets/docs/en/ARCHITECTURE.md) for details. ## Web Mascot
Xiaozhai — HomeAgent Web Mascot