← Back to Kontasks
Console Rendering Unification Plan
What the full refactor would accomplish to unify real-time and history rendering
Output
Console Rendering Unification Plan
🎯 GOAL
Make history restoration look identical to real-time streaming by sharing the same rendering code.
🐛 CURRENT PROBLEM
| Feature | Real-time | History |
|---|---|---|
| Prompt display | Full length | Truncated 100 chars |
| Tool results | Full content (short) or summary | Summary only |
| Shell output | Rich formatted block | Plain text summary |
| Diff display | Syntax highlighted | Not rendered |
| Code files | console-ui.ts, console-event-handler.ts | console-history.ts (inline) |
✅ WHAT THE REFACTOR WOULD DO
1. Extract Shared Renderers
Create console-render-items.ts with functions like:
export function renderPromptLine(prompt, hasImages, imageNames) export function renderToolUse(toolName, summary) export function renderToolResult(output, toolContext) export function renderAssistantText(text) export function renderResponseGroup(kontext)
2. Replay Events Through Same Handler
History restoration would "replay" events through the same event handler that real-time uses:
// Instead of manual DOM creation: for (const item of kontext.workingHistory) { handleStreamEvent({ // Same handler as real-time! type: item.type, tool: item.tool, input: item.input, output: item.output, text: item.text }); }
3. Store Richer Event Data
The kontext.workingHistory would need to store more detail:
- Full tool result content (not just summary) for short outputs
- Diff data for Edit tool results
- Shell command + output for Bash results
4. Remove Inline Script Duplication
The ~500 lines of inline rendering in console-history.ts would be replaced with imports from shared modules, eliminating the duplication that causes divergence.
📊 EFFORT ESTIMATE
| Create shared renderers | ~200 lines new |
| Refactor event handler | ~150 lines modified |
| Update history restoration | ~300 lines rewritten |
| Update kontext storage | ~50 lines modified |
| Testing | Manual + unit tests |
| Total | Medium effort (~2-3 hours) |
🎁 BENEFITS
- Visual consistency - History looks identical to real-time
- Single source of truth - No more diverging code paths
- Easier maintenance - Fix/improve in one place
- Full prompts - See complete prompts in history
- Rich results - Shell output, diffs, code blocks preserved
⚠️ CONSIDERATIONS
- Storage size - Storing full results increases kontext size
- Page load time - More data to render on refresh
- Breaking change - Old kontexts won't have rich data
Recommendation: Start with the quick truncation fix, then do full refactor as a separate flow.
Quick Actions
Original Request
No layout configured
Details
Type
General
Status
Completed
Scope
vibetools
Tags
console-historyrefactorarchitecture
Created
10 Jan 2026, 9:14 am
Updated
10 Jan 2026, 9:14 am
Timing
⏱️ 47.0s
0 tools
● TTFE 0%
● Thinking 100%
● Tools 0%
Created By
claude
📋 Claude's Context
Session
ses_df705a8d...
Raw Data
{
"id": "d7bbb63a-35ea-4aaf-b7d2-d90f7d284155",
"type": "general",
"status": "completed",
"title": "Console Rendering Unification Plan",
"description": "What the full refactor would accomplish to unify real-time and history rendering",
"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;\">Console Rendering Unification Plan</h2>\n\n<h3 style=\"color:#61afef;margin:20px 0 12px 0;font-size:14px;\">🎯 GOAL</h3>\n<div style=\"background:#2d2d2d;padding:12px;border-radius:6px;margin-bottom:16px;\">\n<p style=\"margin:0;color:#e0e0e0;\">Make history restoration look <strong>identical</strong> to real-time streaming by sharing the same rendering code.</p>\n</div>\n\n<h3 style=\"color:#e06c75;margin:20px 0 12px 0;font-size:14px;\">🐛 CURRENT PROBLEM</h3>\n<table style=\"width:100%;background:#2d2d2d;border-radius:6px;margin-bottom:16px;border-collapse:collapse;font-size:11px;\">\n<tr style=\"background:#353535;\"><th style=\"padding:8px;text-align:left;color:#7f848e;\">Feature</th><th style=\"padding:8px;text-align:left;color:#98c379;\">Real-time</th><th style=\"padding:8px;text-align:left;color:#e06c75;\">History</th></tr>\n<tr><td style=\"padding:8px;color:#e0e0e0;\">Prompt display</td><td style=\"padding:8px;color:#98c379;\">Full length</td><td style=\"padding:8px;color:#e06c75;\">Truncated 100 chars</td></tr>\n<tr><td style=\"padding:8px;color:#e0e0e0;\">Tool results</td><td style=\"padding:8px;color:#98c379;\">Full content (short) or summary</td><td style=\"padding:8px;color:#e06c75;\">Summary only</td></tr>\n<tr><td style=\"padding:8px;color:#e0e0e0;\">Shell output</td><td style=\"padding:8px;color:#98c379;\">Rich formatted block</td><td style=\"padding:8px;color:#e06c75;\">Plain text summary</td></tr>\n<tr><td style=\"padding:8px;color:#e0e0e0;\">Diff display</td><td style=\"padding:8px;color:#98c379;\">Syntax highlighted</td><td style=\"padding:8px;color:#e06c75;\">Not rendered</td></tr>\n<tr><td style=\"padding:8px;color:#e0e0e0;\">Code files</td><td style=\"padding:8px;color:#98c379;\">console-ui.ts, console-event-handler.ts</td><td style=\"padding:8px;color:#e06c75;\">console-history.ts (inline)</td></tr>\n</table>\n\n<h3 style=\"color:#98c379;margin:20px 0 12px 0;font-size:14px;\">✅ WHAT THE REFACTOR WOULD DO</h3>\n\n<div style=\"background:#2d3d2d;padding:12px;border-radius:6px;margin-bottom:12px;border-left:4px solid #98c379;\">\n<h4 style=\"color:#98c379;margin:0 0 8px 0;font-size:12px;\">1. Extract Shared Renderers</h4>\n<p style=\"margin:0;color:#e0e0e0;font-size:11px;\">Create <code>console-render-items.ts</code> with functions like:</p>\n<pre style=\"background:#252525;padding:8px;border-radius:4px;margin:8px 0 0 0;font-size:10px;overflow-x:auto;\"><span style=\"color:#c678dd;\">export function</span> <span style=\"color:#61afef;\">renderPromptLine</span>(prompt, hasImages, imageNames)\n<span style=\"color:#c678dd;\">export function</span> <span style=\"color:#61afef;\">renderToolUse</span>(toolName, summary)\n<span style=\"color:#c678dd;\">export function</span> <span style=\"color:#61afef;\">renderToolResult</span>(output, toolContext)\n<span style=\"color:#c678dd;\">export function</span> <span style=\"color:#61afef;\">renderAssistantText</span>(text)\n<span style=\"color:#c678dd;\">export function</span> <span style=\"color:#61afef;\">renderResponseGroup</span>(kontext)</pre>\n</div>\n\n<div style=\"background:#2d3d2d;padding:12px;border-radius:6px;margin-bottom:12px;border-left:4px solid #98c379;\">\n<h4 style=\"color:#98c379;margin:0 0 8px 0;font-size:12px;\">2. Replay Events Through Same Handler</h4>\n<p style=\"margin:0;color:#e0e0e0;font-size:11px;\">History restoration would \"replay\" events through the same event handler that real-time uses:</p>\n<pre style=\"background:#252525;padding:8px;border-radius:4px;margin:8px 0 0 0;font-size:10px;overflow-x:auto;\"><span style=\"color:#7f848e;\">// Instead of manual DOM creation:</span>\n<span style=\"color:#c678dd;\">for</span> (<span style=\"color:#c678dd;\">const</span> item <span style=\"color:#c678dd;\">of</span> kontext.workingHistory) {\n <span style=\"color:#61afef;\">handleStreamEvent</span>({ <span style=\"color:#7f848e;\">// Same handler as real-time!</span>\n type: item.type,\n tool: item.tool,\n input: item.input,\n output: item.output,\n text: item.text\n });\n}</pre>\n</div>\n\n<div style=\"background:#2d3d2d;padding:12px;border-radius:6px;margin-bottom:12px;border-left:4px solid #98c379;\">\n<h4 style=\"color:#98c379;margin:0 0 8px 0;font-size:12px;\">3. Store Richer Event Data</h4>\n<p style=\"margin:0;color:#e0e0e0;font-size:11px;\">The kontext.workingHistory would need to store more detail:</p>\n<ul style=\"margin:8px 0 0 0;padding-left:20px;font-size:10px;color:#e0e0e0;\">\n<li>Full tool result content (not just summary) for short outputs</li>\n<li>Diff data for Edit tool results</li>\n<li>Shell command + output for Bash results</li>\n</ul>\n</div>\n\n<div style=\"background:#2d3d2d;padding:12px;border-radius:6px;margin-bottom:16px;border-left:4px solid #98c379;\">\n<h4 style=\"color:#98c379;margin:0 0 8px 0;font-size:12px;\">4. Remove Inline Script Duplication</h4>\n<p style=\"margin:0;color:#e0e0e0;font-size:11px;\">The ~500 lines of inline rendering in <code>console-history.ts</code> would be replaced with imports from shared modules, eliminating the duplication that causes divergence.</p>\n</div>\n\n<h3 style=\"color:#61afef;margin:20px 0 12px 0;font-size:14px;\">📊 EFFORT ESTIMATE</h3>\n<table style=\"width:100%;background:#2d2d2d;border-radius:6px;margin-bottom:16px;border-collapse:collapse;font-size:11px;\">\n<tr><td style=\"padding:8px;color:#e0e0e0;\">Create shared renderers</td><td style=\"padding:8px;color:#e5c07b;\">~200 lines new</td></tr>\n<tr><td style=\"padding:8px;color:#e0e0e0;\">Refactor event handler</td><td style=\"padding:8px;color:#e5c07b;\">~150 lines modified</td></tr>\n<tr><td style=\"padding:8px;color:#e0e0e0;\">Update history restoration</td><td style=\"padding:8px;color:#e5c07b;\">~300 lines rewritten</td></tr>\n<tr><td style=\"padding:8px;color:#e0e0e0;\">Update kontext storage</td><td style=\"padding:8px;color:#e5c07b;\">~50 lines modified</td></tr>\n<tr><td style=\"padding:8px;color:#e0e0e0;\">Testing</td><td style=\"padding:8px;color:#e5c07b;\">Manual + unit tests</td></tr>\n<tr style=\"background:#353535;\"><td style=\"padding:8px;color:#e0e0e0;font-weight:bold;\">Total</td><td style=\"padding:8px;color:#c678dd;font-weight:bold;\">Medium effort (~2-3 hours)</td></tr>\n</table>\n\n<h3 style=\"color:#c678dd;margin:20px 0 12px 0;font-size:14px;\">🎁 BENEFITS</h3>\n<ul style=\"margin:0;padding-left:20px;color:#e0e0e0;font-size:12px;\">\n<li><strong>Visual consistency</strong> - History looks identical to real-time</li>\n<li><strong>Single source of truth</strong> - No more diverging code paths</li>\n<li><strong>Easier maintenance</strong> - Fix/improve in one place</li>\n<li><strong>Full prompts</strong> - See complete prompts in history</li>\n<li><strong>Rich results</strong> - Shell output, diffs, code blocks preserved</li>\n</ul>\n\n<h3 style=\"color:#e5c07b;margin:20px 0 12px 0;font-size:14px;\">⚠️ CONSIDERATIONS</h3>\n<ul style=\"margin:0;padding-left:20px;color:#e0e0e0;font-size:12px;\">\n<li><strong>Storage size</strong> - Storing full results increases kontext size</li>\n<li><strong>Page load time</strong> - More data to render on refresh</li>\n<li><strong>Breaking change</strong> - Old kontexts won't have rich data</li>\n</ul>\n\n<p style=\"color:#7f848e;margin:20px 0 0 0;font-size:11px;\">Recommendation: Start with the quick truncation fix, then do full refactor as a separate flow.</p>\n</div>",
"requestedAt": "2026-01-10T10:15:00.000Z",
"requestId": "297cbdb5-973d-404b-b699-ab8bd9415517",
"choices": [
{
"label": "Quick fix first",
"value": "Just fix the truncation issue for now - remove the 100 char limit from sanitizePrompt()",
"primary": true
},
{
"label": "Start full refactor",
"value": "Begin the full refactor to unify real-time and history rendering",
"primary": false
},
{
"label": "Add to backlog",
"value": "Add the full refactor to VIBE.md backlog for later",
"primary": false
}
],
"turnTiming": {
"totalMs": 47042,
"ttfeMs": 42,
"thinkingMs": 47000,
"toolExecutionMs": 0,
"toolCallCount": 0,
"thinkingPct": 100,
"toolsPct": 0,
"ttfePct": 0
}
},
"createdBy": "claude",
"createdAt": "2026-01-09T23:14:36.519Z",
"updatedAt": "2026-01-09T23:14:42.833Z",
"requestId": "297cbdb5-973d-404b-b699-ab8bd9415517",
"scope": "vibetools",
"tags": [
"console-history",
"refactor",
"architecture"
],
"sessionId": "ses_df705a8d-ea1",
"flowId": "flow_01KEHQ5A7ZX7YDB8KG1NP2GE68",
"flowLinks": [
{
"flowId": "flow_01KEHQ5A7ZX7YDB8KG1NP2GE68",
"edgeType": "evidence",
"createdAt": "2026-01-09T23:14:36.519Z"
}
]
}