| name | rlm-memory |
| description | Long-term memory persistence for RLM using Daytona durable volume storage. Use when storing, recalling, listing, or searching data that persists across sandbox sessions in the daytona_pilot runtime. |
โ ๏ธ CRITICAL: /tmp/ is ephemeral โ data is lost when the sandbox restarts.
ALWAYS write persistent data to /home/daytona/memory/ using a volume_name.
ALWAYS call interp.shutdown() in a finally block.
RLM Memory โ Persistent Storage
Persist data across sandbox sessions using the Daytona mounted durable volume.
There are no slash commands โ all interactions use the Python API.
Daytona Durable Volume
The Daytona mounted volume is rooted at /home/daytona/memory/ inside the sandbox.
Canonical Directories
| Directory | Purpose |
|---|
/home/daytona/memory/memory/ | Key-value and named memory items |
/home/daytona/memory/artifacts/ | Produced outputs and saved results |
/home/daytona/memory/buffers/ | Named buffer lists (session logs, staging) |
/home/daytona/memory/meta/ | Session manifests and workspace metadata |
Session Manifest Path
/home/daytona/memory/meta/workspaces/<workspace_id>/users/<user_id>/react-session-<session_id>.json
Store and Recall
from fleet_rlm.integrations.providers.daytona.interpreter import DaytonaInterpreter
interp = DaytonaInterpreter(
repo_url="https://github.com/your-org/your-repo",
timeout=120,
volume_name="rlm-volume-dspy",
)
interp.start()
try:
interp.execute('''
import json, os
os.makedirs('/home/daytona/memory/artifacts', exist_ok=True)
data = {'result': 'my-finding', 'created': '2026-04-03'}
with open('/home/daytona/memory/artifacts/analysis.json', 'w') as f:
json.dump(data, f)
''')
result = interp.execute('''
import json
with open('/home/daytona/memory/artifacts/analysis.json') as f:
data = json.load(f)
SUBMIT(result=data['result'])
''')
print(result.result)
finally:
interp.shutdown()
Buffer Pattern
add_buffer(name, value) / get_buffer(name) are injected by the sandbox
driver (runtime/execution/sandbox_assets.py) and persist named lists across
execute() calls within the same sandbox session:
interp.start()
try:
interp.execute('add_buffer("log", "Step 1: setup")')
interp.execute('add_buffer("log", "Step 2: done")')
result = interp.execute('SUBMIT(log=get_buffer("log"))')
print(result.log)
finally:
interp.shutdown()
Volume-Aware Document Tools (Inside Sandbox)
Available inside sandbox code on the Daytona path:
load_text_from_volume(path) โ loads durable mounted-volume content
load_from_volume(path) โ loads file contents from volume
process_document(...) โ targeted at mounted-volume content
workspace_read(path) โ low-level transient workspace helper (not durable)
result = interp.execute("""
content = load_text_from_volume('/home/daytona/memory/artifacts/report.txt')
SUBMIT(size=len(content))
""")
print(result.size)
Checkpoint Pattern
interp.start()
try:
interp.execute('''
import json, os
root = '/home/daytona/memory/buffers/checkpoints'
os.makedirs(root, exist_ok=True)
with open(f'{root}/batch_1.json', 'w') as f:
json.dump([{'i': i} for i in range(100)], f)
''')
result = interp.execute('''
import json
with open('/home/daytona/memory/buffers/checkpoints/batch_1.json') as f:
previous = json.load(f)
SUBMIT(count=len(previous))
''')
print(result.count)
finally:
interp.shutdown()
Troubleshooting
See rlm-debug for comprehensive diagnostics and daytona-runtime for Daytona volume specifics.
Common Mistakes
- Never use
/tmp/ for data that must persist โ it is cleared on sandbox restart
- Always use
try/finally to ensure interp.shutdown() is called
- Never use different
volume_name values across sessions that must share data
- Do not use
pickle for structured data โ use json.dump / json.load