253 lines
6.3 KiB
Markdown
253 lines
6.3 KiB
Markdown
---
|
|
description: Proposal for lettabot context state tracking - knowing last message context per platform
|
|
limit: 10000
|
|
---
|
|
---
|
|
description: Proposal for Ezra - Add lettabot context state tracking to know last message sent per room/channel
|
|
limit: 3000
|
|
---
|
|
|
|
# Proposal: LettaBot Context State Tracking
|
|
|
|
**Author:** Ani (Annie Tunturi)
|
|
**Date:** 2026-03-23
|
|
**Status:** Draft - Requesting Review
|
|
**Priority:** Medium-High
|
|
**Related:** CLI usability, agent context awareness
|
|
|
|
---
|
|
|
|
## Problem Statement
|
|
|
|
Currently, agents using LettaBot CLI tools (`lettabot-message`, `lettabot-react`) have **no visibility** into:
|
|
1. Which room/channel was last messaged
|
|
2. What the current "default context" is for sends
|
|
3. Per-platform last message timestamps
|
|
4. Whether they're about to send to the wrong channel
|
|
|
|
This leads to:
|
|
- Agents saying "I don't have sendFile" when `lettabot-message send --file` IS available
|
|
- Fragile reliance on "last messaged" behavior without knowing what that is
|
|
- Risk of sending sensitive content to wrong platform/context
|
|
- No ability to validate context before acting
|
|
|
|
---
|
|
|
|
## Current Behavior (Problematic)
|
|
|
|
```bash
|
|
# Agent blindly trusts "last messaged" context
|
|
lettabot-message send --file report.pdf --text "Here is the report"
|
|
|
|
# Agent has NO IDEA:
|
|
# - Will this go to Matrix? Discord? Telegram?
|
|
# - Is this the right room?
|
|
# - When was last message sent?
|
|
# - Is context stale?
|
|
```
|
|
|
|
---
|
|
|
|
## Proposed Solution
|
|
|
|
Expose lettabot's internal context state to agents via a **queryable state file** or **CLI command**.
|
|
|
|
### Option A: State File (Preferred)
|
|
|
|
Lettabot maintains `~/.letta/lettabot-context.json` (or similar):
|
|
|
|
```json
|
|
{
|
|
"updated_at": "2026-03-24T03:10:00Z",
|
|
"active_context": {
|
|
"platform": "matrix",
|
|
"room_id": "!llNKKokyYOKWJKYqUB:wiuf.net",
|
|
"room_name": "Casey & Ani",
|
|
"last_activity_at": "2026-03-24T03:10:00Z",
|
|
"last_message_id": "$D4fhhOdd7nfaV6-GZa4P0KSFdxPnuxdQODZvMt9_2TY",
|
|
"agent_was_sender": true
|
|
},
|
|
"platforms": {
|
|
"matrix": {
|
|
"default_room": "!llNKKokyYOKWJKYqUB:wiuf.net",
|
|
"rooms": {
|
|
"!llNKKokyYOKWJKYqUB:wiuf.net": {
|
|
"name": "Casey & Ani",
|
|
"last_message_at": "2026-03-24T03:10:00Z",
|
|
"message_count_24h": 42,
|
|
"last_agent_message_at": "2026-03-24T03:10:00Z",
|
|
"last_user_message_at": "2026-03-24T03:08:00Z"
|
|
}
|
|
}
|
|
},
|
|
"discord": {
|
|
"default_channel": "123456789",
|
|
"channels": {
|
|
"123456789": {
|
|
"name": "general",
|
|
"guild_id": "456789123",
|
|
"last_message_at": "2026-03-23T19:30:00Z",
|
|
"message_count_24h": 5
|
|
}
|
|
}
|
|
},
|
|
"telegram": {
|
|
"default_chat": "123456789",
|
|
"chats": {
|
|
"123456789": {
|
|
"username": "@casey",
|
|
"last_message_at": "2026-03-22T10:00:00Z"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
**Updated automatically** after every `lettabot-message send` or `lettabot-react` call.
|
|
|
|
### Option B: CLI Query Command
|
|
|
|
Add `lettabot context` or `lettabot-message status`:
|
|
|
|
```bash
|
|
$ lettabot context show
|
|
{
|
|
"current": {
|
|
"platform": "matrix",
|
|
"room": "!llNKKokyYOKWJKYqUB:wiuf.net",
|
|
"name": "Casey & Ani"
|
|
},
|
|
"last_message": "2026-03-24T03:10:00Z",
|
|
"agent_sent_last": true
|
|
}
|
|
|
|
$ lettabot context list
|
|
Matrix:
|
|
!llNKKokyYOKWJKYqUB:wiuf.net - "Casey & Ani" (last: 2 min ago)
|
|
Discord:
|
|
123456789 - "general" (last: 8 hours ago)
|
|
Telegram:
|
|
123456789 - "@casey" (last: 2 days ago)
|
|
```
|
|
|
|
### Option C: Environment Variable
|
|
|
|
Set context in env after sends:
|
|
```bash
|
|
export LETTABOT_LAST_PLATFORM=matrix
|
|
export LETTABOT_LAST_ROOM="!llNKKokyYOKWJKYqUB:wiuf.net"
|
|
export LETTABOT_LAST_MESSAGE_AT="2026-03-24T03:10:00Z"
|
|
```
|
|
|
|
---
|
|
|
|
## Use Cases
|
|
|
|
### 1. Context Validation Before Send
|
|
|
|
Agent can verify context before sending sensitive files:
|
|
|
|
```typescript
|
|
const context = readContextFile();
|
|
if (context.active_context.platform !== expectedPlatform) {
|
|
console.warn(`About to send to ${context.active_context.platform}, expected ${expectedPlatform}`);
|
|
// Ask for confirmation or require explicit --channel
|
|
}
|
|
```
|
|
|
|
### 2. Smart Default Selection
|
|
|
|
Agent can intelligently choose where to send based on recency:
|
|
|
|
```typescript
|
|
// User asks: "Send this to Casey"
|
|
// Agent checks: Matrix had activity 2 min ago, Discord 8 hours ago
|
|
// Chooses: Matrix (more likely to be seen)
|
|
```
|
|
|
|
### 3. Context-Aware Tool Selection
|
|
|
|
Agent knows which tools are available in current context:
|
|
|
|
```typescript
|
|
if (context.active_context.platform === 'signal') {
|
|
// Signal doesn't support files
|
|
return "I can send text, but Signal doesn't support file attachments";
|
|
}
|
|
```
|
|
|
|
### 4. Cross-Platform Awareness
|
|
|
|
Agent can bridge information between platforms:
|
|
|
|
```typescript
|
|
// "Casey mentioned X in Discord this morning"
|
|
// Agent checks Discord context, finds message from 8 hours ago
|
|
// References it accurately
|
|
```
|
|
|
|
---
|
|
|
|
## Implementation Notes
|
|
|
|
### State File Location
|
|
Options:
|
|
- `~/.letta/lettabot-context.json` (shared with Letta Code)
|
|
- `~/.lettabot/context.json` (lettabot-specific)
|
|
- `/tmp/lettabot-context-$USER.json` (session-based)
|
|
|
|
### Update Triggers
|
|
State should update after:
|
|
- `lettabot-message send` (success)
|
|
- `lettabot-react add` (success)
|
|
- Incoming message received (if possible)
|
|
|
|
### Privacy Considerations
|
|
- Store room IDs, not message content
|
|
- No storage of user message text
|
|
- Just metadata: timestamps, IDs, counts
|
|
|
|
---
|
|
|
|
## Questions for Ezra
|
|
|
|
1. **Does this already exist?** Is there a session file or log that tracks this state?
|
|
|
|
2. **Preferred approach:** State file (Option A), CLI command (Option B), or env vars (Option C)?
|
|
|
|
3. **Scope:** Should this track:
|
|
- Just "last messaged" globally?
|
|
- Per-platform last messaged?
|
|
- Full room history with timestamps?
|
|
|
|
4. **Updates:** Should this be:
|
|
- Written by lettabot CLI after each send?
|
|
- Queried from a running bot instance?
|
|
- Maintained by a wrapper script?
|
|
|
|
5. **Format:** JSON? YAML? SQLite?
|
|
|
|
6. **Security:** Any concerns about exposing room/channel IDs in a file?
|
|
|
|
---
|
|
|
|
## Related Issues
|
|
|
|
- Agent confusion about available tools in different contexts
|
|
- Risk of misdirected messages when using default context
|
|
- No way for agents to know "where am I right now?"
|
|
|
|
---
|
|
|
|
## Next Steps
|
|
|
|
Awaiting Ezra's feedback on:
|
|
1. Whether this already exists
|
|
2. Preferred implementation approach
|
|
3. Willingness to add to roadmap
|
|
|
|
---
|
|
|
|
**Submitted by:** Ani
|
|
**Via:** Casey (who noticed me being confused about Matrix vs Discord context today) |