← Back to Kontasks
Konduct: Standalone Agent with Local Session Cache
Design for agent-side session persistence, replay capability, and future GPU-accelerated RAG
Output
🗄️ Konduct: Truly Standalone Agent
Agent owns its session state. Hub is just a coordination layer.
The Problem Today
| Issue | Impact |
|---|---|
| konui buffers events in memory | Lost on restart |
| Session state split across services | Inconsistent after failures |
| No replay for long jobs | User returns, history gone |
| Hub has no context cache | Full reload every reconnect |
Konduct Session Architecture
┌────────────────────────────────────────────────────────────────┐ │ KONDUCT AGENT │ │ │ │ ┌────────────────┐ ┌────────────────┐ │ │ │ Session Store │ │ Event Journal │ │ │ │ (SQLite) │ │ (append-only) │ │ │ │ │ │ │ │ │ │ • context │ │ • all events │ │ │ │ • messages │ │ • timestamps │ │ │ │ • tool calls │ │ • seq numbers │ │ │ │ • metadata │ │ • checksums │ │ │ └───────┬────────┘ └───────┬────────┘ │ │ │ │ │ │ └─────────┬─────────┘ │ │ │ │ │ ┌──────┴──────┐ │ │ │ Replay API │ ← Hub requests history │ │ └──────┬──────┘ │ │ │ │ └────────────────────┼────────────────────────────────────────┘ │ WebSocket ▼ ┌────────────────────────────────────────────────────────────────┐ │ KONUI HUB │ │ │ │ Work Queue │ Agent Registry │ Thin State (pointers only) │ │ │ │ Hub stores: session_id → agent_id mapping │ │ Agent stores: everything else │ └────────────────────────────────────────────────────────────────┘
Agent Local Storage
konduct/data/ ├── sessions.db # SQLite - session metadata & context ├── events/ │ ├── sess_abc123.jsonl # Append-only event journal │ └── sess_def456.jsonl └── cache/ # Future: embeddings, context cache ├── embeddings.db # GPU-accelerated vectors └── context_lru/ # Prompt prefix cache
Replay Protocol
1. HUB REQUESTS HISTORY → { type: "replay_request", sessionId, fromSeq: 0 } 2. AGENT STREAMS EVENTS ← { type: "replay_event", seq: 1, event: {...} } ← { type: "replay_event", seq: 2, event: {...} } ← { type: "replay_complete", lastSeq: 1547 } 3. HUB CATCHES UP CLIENT // Hub forwards to browser in real-time // Client sees full history on reconnect 4. RESUME FROM CHECKPOINT → { type: "replay_request", sessionId, fromSeq: 1200 } // Only get events 1201+ (incremental sync)
Event Journal Format
// sess_abc123.jsonl (append-only, never modified) {"seq":1,"ts":"2026-01-05T04:00:00Z","type":"prompt","data":{...}} {"seq":2,"ts":"2026-01-05T04:00:01Z","type":"text","data":{"content":"..."}} {"seq":3,"ts":"2026-01-05T04:00:02Z","type":"tool_call","data":{...}} {"seq":4,"ts":"2026-01-05T04:00:05Z","type":"tool_result","data":{...}} {"seq":5,"ts":"2026-01-05T04:00:10Z","type":"done","data":{"kontask":"abc"}} // Benefits: // • Survives crashes (fsync after each write) // • Grep-able for debugging // • Streamable for replay // • Compressible for archival
Future: GPU-Accelerated Features
| Feature | Use Case | Hardware |
|---|---|---|
| Local embeddings | RAG over codebase | Any CUDA GPU |
| Context caching | Prompt prefix reuse | High VRAM |
| Local inference | Quick Turn fallback | RTX 4090+ |
| Speculative decode | Speed up API calls | Consumer GPU |
💡 Key Principle: Agent is Source of Truth
Hub stores pointers (session → agent mapping).
Agent stores everything else (context, history, cache).
Result: Hub can restart freely. Agent reconnects, replays state.
Agent can restart too — just replays from local journal on startup.
What's Next?
Choose an action:
Quick Actions
Original Request
No layout configured
Details
Type
General
Status
Completed
Scope
vibetools
Tags
agentsessionscachingarchitecture
Created
5 Jan 2026, 3:43 pm
Updated
5 Jan 2026, 3:43 pm
Timing
⏱️ 106.8s
1 tools
● TTFE 5%
● Thinking 95%
● Tools 0%
Created By
claude
Raw Data
{
"id": "16ebe376-090d-48a9-96d8-adbdfb047120",
"type": "general",
"status": "completed",
"title": "Konduct: Standalone Agent with Local Session Cache",
"description": "Design for agent-side session persistence, replay capability, and future GPU-accelerated RAG",
"context": {
"output": "<div style=\"background:#1e1e1e;color:#e0e0e0;padding:20px;border-radius:8px;font-family:'Consolas','Monaco',monospace;\">\n<h2 style=\"font-family:sans-serif;color:#fff;margin:0 0 16px 0;\">🗄️ Konduct: Truly Standalone Agent</h2>\n\n<p style=\"color:#9ca3af;font-family:sans-serif;margin:0 0 16px 0;\">Agent owns its session state. Hub is just a coordination layer.</p>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#e5c07b;margin:0 0 12px 0;font-family:sans-serif;\">The Problem Today</h3>\n\n<table style=\"width:100%;border-collapse:collapse;font-size:0.85rem;\">\n<tr style=\"background:#1a1a1a;\">\n<th style=\"padding:8px;text-align:left;color:#fff;\">Issue</th>\n<th style=\"padding:8px;text-align:left;color:#fff;\">Impact</th>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e06c75;\">konui buffers events in memory</td>\n<td style=\"padding:8px;color:#e0e0e0;\">Lost on restart</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e06c75;\">Session state split across services</td>\n<td style=\"padding:8px;color:#e0e0e0;\">Inconsistent after failures</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e06c75;\">No replay for long jobs</td>\n<td style=\"padding:8px;color:#e0e0e0;\">User returns, history gone</td>\n</tr>\n<tr>\n<td style=\"padding:8px;color:#e06c75;\">Hub has no context cache</td>\n<td style=\"padding:8px;color:#e0e0e0;\">Full reload every reconnect</td>\n</tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#e5c07b;margin:0 0 12px 0;font-family:sans-serif;\">Konduct Session Architecture</h3>\n\n<pre style=\"background:#1a1a1a;padding:12px;border-radius:4px;overflow-x:auto;font-size:0.8rem;color:#abb2bf;margin:0;\">\n<span style=\"color:#7f848e;\">┌────────────────────────────────────────────────────────────────┐</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#e5c07b;\">KONDUCT AGENT</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#c678dd;\">┌────────────────┐</span> <span style=\"color:#61afef;\">┌────────────────┐</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#c678dd;\">│ Session Store │</span> <span style=\"color:#61afef;\">│ Event Journal │</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#c678dd;\">│ (SQLite) │</span> <span style=\"color:#61afef;\">│ (append-only) │</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#c678dd;\">│ │</span> <span style=\"color:#61afef;\">│ │</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#c678dd;\">│ • context │</span> <span style=\"color:#61afef;\">│ • all events │</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#c678dd;\">│ • messages │</span> <span style=\"color:#61afef;\">│ • timestamps │</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#c678dd;\">│ • tool calls │</span> <span style=\"color:#61afef;\">│ • seq numbers │</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#c678dd;\">│ • metadata │</span> <span style=\"color:#61afef;\">│ • checksums │</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#c678dd;\">└───────┬────────┘</span> <span style=\"color:#61afef;\">└───────┬────────┘</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">└─────────┬─────────┘</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#98c379;\">┌──────┴──────┐</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#98c379;\">│ Replay API │</span> <span style=\"color:#7f848e;\">← Hub requests history</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#98c379;\">└──────┬──────┘</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">└────────────────────┼────────────────────────────────────────┘</span>\n <span style=\"color:#7f848e;\">│</span> WebSocket\n <span style=\"color:#7f848e;\">▼</span>\n<span style=\"color:#7f848e;\">┌────────────────────────────────────────────────────────────────┐</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#61afef;\">KONUI HUB</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> Work Queue │ Agent Registry │ <span style=\"color:#e5c07b;\">Thin State</span> (pointers only) <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">Hub stores: session_id → agent_id mapping</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">│</span> <span style=\"color:#7f848e;\">Agent stores: everything else</span> <span style=\"color:#7f848e;\">│</span>\n<span style=\"color:#7f848e;\">└────────────────────────────────────────────────────────────────┘</span>\n</pre>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#e5c07b;margin:0 0 12px 0;font-family:sans-serif;\">Agent Local Storage</h3>\n\n<pre style=\"background:#1a1a1a;padding:12px;border-radius:4px;overflow-x:auto;font-size:0.85rem;color:#abb2bf;margin:0;\">\n<span style=\"color:#61afef;\">konduct/data/</span>\n├── <span style=\"color:#e5c07b;\">sessions.db</span> <span style=\"color:#7f848e;\"># SQLite - session metadata & context</span>\n├── <span style=\"color:#e5c07b;\">events/</span>\n│ ├── <span style=\"color:#98c379;\">sess_abc123.jsonl</span> <span style=\"color:#7f848e;\"># Append-only event journal</span>\n│ └── <span style=\"color:#98c379;\">sess_def456.jsonl</span>\n└── <span style=\"color:#e5c07b;\">cache/</span> <span style=\"color:#7f848e;\"># Future: embeddings, context cache</span>\n ├── <span style=\"color:#c678dd;\">embeddings.db</span> <span style=\"color:#7f848e;\"># GPU-accelerated vectors</span>\n └── <span style=\"color:#c678dd;\">context_lru/</span> <span style=\"color:#7f848e;\"># Prompt prefix cache</span>\n</pre>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#e5c07b;margin:0 0 12px 0;font-family:sans-serif;\">Replay Protocol</h3>\n\n<pre style=\"background:#1a1a1a;padding:12px;border-radius:4px;overflow-x:auto;font-size:0.85rem;color:#abb2bf;margin:0;\">\n<span style=\"color:#c678dd;\">1. HUB REQUESTS HISTORY</span>\n <span style=\"color:#98c379;\">→ { type: \"replay_request\", sessionId, fromSeq: 0 }</span>\n\n<span style=\"color:#c678dd;\">2. AGENT STREAMS EVENTS</span>\n <span style=\"color:#61afef;\">← { type: \"replay_event\", seq: 1, event: {...} }</span>\n <span style=\"color:#61afef;\">← { type: \"replay_event\", seq: 2, event: {...} }</span>\n <span style=\"color:#61afef;\">← { type: \"replay_complete\", lastSeq: 1547 }</span>\n\n<span style=\"color:#c678dd;\">3. HUB CATCHES UP CLIENT</span>\n <span style=\"color:#7f848e;\">// Hub forwards to browser in real-time</span>\n <span style=\"color:#7f848e;\">// Client sees full history on reconnect</span>\n\n<span style=\"color:#c678dd;\">4. RESUME FROM CHECKPOINT</span>\n <span style=\"color:#98c379;\">→ { type: \"replay_request\", sessionId, fromSeq: 1200 }</span>\n <span style=\"color:#7f848e;\">// Only get events 1201+ (incremental sync)</span>\n</pre>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#e5c07b;margin:0 0 12px 0;font-family:sans-serif;\">Event Journal Format</h3>\n\n<pre style=\"background:#1a1a1a;padding:12px;border-radius:4px;overflow-x:auto;font-size:0.85rem;color:#abb2bf;margin:0;\">\n<span style=\"color:#7f848e;\">// sess_abc123.jsonl (append-only, never modified)</span>\n{<span style=\"color:#e06c75;\">\"seq\"</span>:1,<span style=\"color:#e06c75;\">\"ts\"</span>:<span style=\"color:#98c379;\">\"2026-01-05T04:00:00Z\"</span>,<span style=\"color:#e06c75;\">\"type\"</span>:<span style=\"color:#98c379;\">\"prompt\"</span>,<span style=\"color:#e06c75;\">\"data\"</span>:{...}}\n{<span style=\"color:#e06c75;\">\"seq\"</span>:2,<span style=\"color:#e06c75;\">\"ts\"</span>:<span style=\"color:#98c379;\">\"2026-01-05T04:00:01Z\"</span>,<span style=\"color:#e06c75;\">\"type\"</span>:<span style=\"color:#98c379;\">\"text\"</span>,<span style=\"color:#e06c75;\">\"data\"</span>:{<span style=\"color:#e06c75;\">\"content\"</span>:<span style=\"color:#98c379;\">\"...\"</span>}}\n{<span style=\"color:#e06c75;\">\"seq\"</span>:3,<span style=\"color:#e06c75;\">\"ts\"</span>:<span style=\"color:#98c379;\">\"2026-01-05T04:00:02Z\"</span>,<span style=\"color:#e06c75;\">\"type\"</span>:<span style=\"color:#98c379;\">\"tool_call\"</span>,<span style=\"color:#e06c75;\">\"data\"</span>:{...}}\n{<span style=\"color:#e06c75;\">\"seq\"</span>:4,<span style=\"color:#e06c75;\">\"ts\"</span>:<span style=\"color:#98c379;\">\"2026-01-05T04:00:05Z\"</span>,<span style=\"color:#e06c75;\">\"type\"</span>:<span style=\"color:#98c379;\">\"tool_result\"</span>,<span style=\"color:#e06c75;\">\"data\"</span>:{...}}\n{<span style=\"color:#e06c75;\">\"seq\"</span>:5,<span style=\"color:#e06c75;\">\"ts\"</span>:<span style=\"color:#98c379;\">\"2026-01-05T04:00:10Z\"</span>,<span style=\"color:#e06c75;\">\"type\"</span>:<span style=\"color:#98c379;\">\"done\"</span>,<span style=\"color:#e06c75;\">\"data\"</span>:{<span style=\"color:#e06c75;\">\"kontask\"</span>:<span style=\"color:#98c379;\">\"abc\"</span>}}\n\n<span style=\"color:#7f848e;\">// Benefits:</span>\n<span style=\"color:#7f848e;\">// • Survives crashes (fsync after each write)</span>\n<span style=\"color:#7f848e;\">// • Grep-able for debugging</span>\n<span style=\"color:#7f848e;\">// • Streamable for replay</span>\n<span style=\"color:#7f848e;\">// • Compressible for archival</span>\n</pre>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#e5c07b;margin:0 0 12px 0;font-family:sans-serif;\">Future: GPU-Accelerated Features</h3>\n\n<table style=\"width:100%;border-collapse:collapse;font-size:0.85rem;\">\n<tr style=\"background:#1a1a1a;\">\n<th style=\"padding:8px;text-align:left;color:#fff;\">Feature</th>\n<th style=\"padding:8px;text-align:left;color:#fff;\">Use Case</th>\n<th style=\"padding:8px;text-align:left;color:#fff;\">Hardware</th>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#c678dd;\">Local embeddings</td>\n<td style=\"padding:8px;color:#e0e0e0;\">RAG over codebase</td>\n<td style=\"padding:8px;color:#98c379;\">Any CUDA GPU</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#c678dd;\">Context caching</td>\n<td style=\"padding:8px;color:#e0e0e0;\">Prompt prefix reuse</td>\n<td style=\"padding:8px;color:#98c379;\">High VRAM</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#c678dd;\">Local inference</td>\n<td style=\"padding:8px;color:#e0e0e0;\">Quick Turn fallback</td>\n<td style=\"padding:8px;color:#98c379;\">RTX 4090+</td>\n</tr>\n<tr>\n<td style=\"padding:8px;color:#c678dd;\">Speculative decode</td>\n<td style=\"padding:8px;color:#e0e0e0;\">Speed up API calls</td>\n<td style=\"padding:8px;color:#98c379;\">Consumer GPU</td>\n</tr>\n</table>\n</div>\n\n<div style=\"background:#1a3d1a;border:1px solid #2d5a2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h4 style=\"color:#98c379;margin:0 0 8px 0;font-family:sans-serif;\">💡 Key Principle: Agent is Source of Truth</h4>\n<p style=\"color:#e0e0e0;margin:0;line-height:1.6;\">Hub stores <strong>pointers</strong> (session → agent mapping).<br/>\nAgent stores <strong>everything else</strong> (context, history, cache).<br/><br/>\n<strong>Result:</strong> Hub can restart freely. Agent reconnects, replays state.<br/>\nAgent can restart too — just replays from local journal on startup.</p>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;\">\n<h4 style=\"margin:0 0 8px 0;color:#fff;font-family:sans-serif;\">What's Next?</h4>\n<p style=\"color:#9ca3af;margin:0;font-family:sans-serif;\">Choose an action:</p>\n</div>\n</div>",
"requestedAt": "2026-01-05T03:50:00.000Z",
"requestId": "ef2903d1-55c7-47eb-b7e9-bd5efc2a3e8f",
"choices": [
{
"label": "Design session store schema",
"value": "Design the SQLite schema for Konduct session store - sessions, messages, tool calls, metadata",
"primary": true
},
{
"label": "Design replay protocol",
"value": "Design the detailed WebSocket replay protocol with sequence numbers and checkpoints"
},
{
"label": "Add to VIBE.md",
"value": "Add Konduct agent architecture to VIBE.md as a major backlog item"
}
],
"turnTiming": {
"totalMs": 106827,
"ttfeMs": 5127,
"thinkingMs": 101195,
"toolExecutionMs": 504,
"toolCallCount": 1,
"thinkingPct": 95,
"toolsPct": 0,
"ttfePct": 5
}
},
"createdBy": "claude",
"createdAt": "2026-01-05T05:43:42.955Z",
"updatedAt": "2026-01-05T05:43:50.785Z",
"requestId": "ef2903d1-55c7-47eb-b7e9-bd5efc2a3e8f",
"scope": "vibetools",
"tags": [
"agent",
"sessions",
"caching",
"architecture"
],
"targetUser": "claude"
}