Understanding entry-tree-storage.ts in OpenMAIC: The Agent Session State Manager
The entry-tree-storage.ts module in OpenMAIC implements the AgentSessionEntryStorage class, which maintains a hierarchical tree structure to persist, retrieve, and manage agent conversation state across sessions.
The OpenMAIC repository relies on entry-tree-storage.ts to serve as the central state backbone for its agent runtime. This TypeScript module abstracts storage mechanics behind a tree-based API, enabling the runner and tool systems to record every interaction as a node in a traversable history.
What is entry-tree-storage.ts?
Located at lib/server/agent-runtime/entry-tree-storage.ts, this file defines the primary interface for session-scoped data persistence. It treats each user message, tool invocation, and generated artifact as a node in an entry tree, allowing the agent to replay branches or prune stale context without losing structural relationships.
Core Responsibilities
Hierarchical Entry Management
The storage organizes data as a tree rather than a flat log. Each node contains metadata such as type (e.g., message, toolCall), content, and timestamp. This structure supports complex operations like subtree extraction and ancestral traversal, which are essential for context-aware reasoning.
Storage Backend Abstraction
AgentSessionEntryStorage decouples agent logic from infrastructure concerns. Whether the runtime uses in-memory maps, Redis, or disk-backed stores, the class presents a uniform async API—append(), getTree(), and findLast()—hiding implementation details from consumers.
Session Continuity
By binding instances to unique session IDs, the module ensures that disconnected workflows can resume exactly where they left off. The runner initializes a storage instance at session start and flushes nodes incrementally, guaranteeing durability even across server restarts.
Integration with the Agent Runtime
Two critical consumers interact with this module to manage state.
- Runner Initialization: In
lib/server/agent-runtime/runner.ts, line 79 imports the storage to instantiate session state before processing input【runner.ts L79】. - Personal History Tools: The file
lib/server/agent-runtime/personal-history-tools.tsimports the storage at line 8 to retrieve historical context for injection into prompts【personal-history-tools.ts L8】.
API and Usage Patterns
Typical usage follows a create-append-query lifecycle. The following example demonstrates how to instantiate storage, record a user message, and query for recent tool calls:
import { AgentSessionEntryStorage } from '@/lib/server/agent-runtime/entry-tree-storage';
// Initialize storage bound to a specific session
const entryStore = new AgentSessionEntryStorage(sessionId);
// Append a new message node to the tree
await entryStore.append({
type: 'message',
content: userMessage,
timestamp: Date.now(),
});
// Retrieve the complete entry tree for inspection or replay
const tree = await entryStore.getTree();
// Find the most recent tool call node
const recentTool = await entryStore.findLast(node => node.type === 'toolCall');
Testing and Mocking Strategy
Unit tests in tests/agent-runtime/entry-tree-storage.test.ts verify the tree logic and storage API compliance. Higher-level tests, such as runner-web-search-registration.test.ts and runner-voice-registration.test.ts, mock AgentSessionEntryStorage to isolate runner behavior without requiring live database connections.
Summary
entry-tree-storage.tsdefinesAgentSessionEntryStorage, the canonical interface for agent session persistence in OpenMAIC.- It organizes interactions as a hierarchical tree, enabling complex traversal, replay, and branch pruning.
- The runner and personal-history tools rely on this module for state initialization and context retrieval【runner.ts L79】【personal-history-tools.ts L8】.
- A consistent async API abstracts the underlying storage mechanism, allowing seamless swaps between in-memory, Redis, or other backends.
Frequently Asked Questions
What does entry-tree-storage.ts do in OpenMAIC?
It provides the AgentSessionEntryStorage class that manages a tree-structured history of agent interactions, supporting persistence, retrieval, and traversal of conversation nodes across sessions.
How does the runner.ts file use entry-tree-storage.ts?
The runner imports the storage module at line 79 to instantiate a session-bound storage object, which it uses to append new entries and retrieve historical context during the execution loop【runner.ts L79】.
Can I use a custom storage backend with entry-tree-storage.ts?
Yes. The class abstracts the underlying implementation, allowing you to inject adapters for Redis, PostgreSQL, or in-memory stores while maintaining the same append() and getTree() interface.
Where are the tests for entry-tree-storage.ts located?
Core logic is tested in tests/agent-runtime/entry-tree-storage.test.ts, while dependent components like the runner mock the storage in files such as runner-web-search-registration.test.ts and runner-voice-registration.test.ts.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →