← Back to Kontasks
Konsole-Konui Coupling Analysis
Analysis of tight coupling between konsole and konui services with decoupling recommendations
Output
🔗 Konsole-Konui Coupling Analysis
11 coupling points identified — tight HTTP APIs + shared file state
Coupling Points by Severity
| Coupling | Severity | Location |
|---|---|---|
| Hardcoded konsole URL | TIGHT | konsole-client.ts:12, router.ts:~850 |
| SSE event format dependency | TIGHT | streaming.ts, console-ui.ts |
| Session file state | TIGHT | konui/data/konsole-sessions/*.txt |
| In-memory event buffering | MEDIUM | streaming.ts (DashboardStreamManager) |
| Prompt wrapping/injection | MEDIUM | router.ts (400+ lines injected) |
| Request ID persistence | MEDIUM | localStorage + konui memory |
| Startup order dependency | MEDIUM | bin/kon-start-* |
| Health check logic | LOOSE | konsole-client.ts |
| Quick Turn routing | LOOSE | router.ts → konsole /api/quick-turn |
| Stream cleanup lifecycle | LOOSE | streaming.ts (10-min expiry) |
What Breaks on Restart?
| Scenario | Impact | Recovery |
|---|---|---|
| Konsole restarts mid-turn | SSE closes, events lost, context lost | 10-30s, kontask still completes |
| Konui restarts mid-turn | Buffered events lost | Browser reconnects, polling fallback |
| Both restart | All state lost | New session required |
Decoupling Roadmap
Priority 1: Critical (1-2 hours)
- Extract konsole URL to env var — enables multi-machine
- Add startup dependency check — konui waits for konsole health
Priority 2: High (4-6 hours)
- Externalize event buffering — Redis or JSONL files, survives restarts
- Decouple SSE event format — adapter layer for independent evolution
Priority 3: Medium (2-4 hours)
- Add circuit breaker pattern
- Persist request metadata to files
- Optional local Claude fallback if konsole down
Architecture Options
| Option | Effort | Benefit |
|---|---|---|
| Keep current + Priority 1 | 1-2h | Eliminates most gotchas |
| Add message queue (Redis) | 8-12h | Full restart resilience |
| Full service split | 2-3 days | True multi-machine deployment |
💡 Recommendation
Do Priority 1 immediately (1-2h) — extracts konsole URL to config and adds startup health check. This eliminates most production gotchas with minimal effort. Then assess if Priority 2 is needed based on restart frequency.
What's Next?
Choose an action:
Quick Actions
Original Request
No layout configured
Details
Type
General
Status
Completed
Scope
vibetools
Tags
konsolekonuiarchitecturedecoupling
Created
5 Jan 2026, 2:38 pm
Updated
5 Jan 2026, 2:38 pm
Timing
⏱️ 280.0s
37 tools
● TTFE 2%
● Thinking 0%
● Tools 98%
Created By
claude
Raw Data
{
"id": "ac0523a4-bfb4-4d37-ac3c-73ba824a870c",
"type": "general",
"status": "completed",
"title": "Konsole-Konui Coupling Analysis",
"description": "Analysis of tight coupling between konsole and konui services with decoupling recommendations",
"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;\">🔗 Konsole-Konui Coupling Analysis</h2>\n\n<p style=\"color:#9ca3af;font-family:sans-serif;margin:0 0 16px 0;\"><strong>11 coupling points identified</strong> — tight HTTP APIs + shared file state</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;\">Coupling Points by Severity</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;\">Coupling</th>\n<th style=\"padding:8px;text-align:left;color:#fff;\">Severity</th>\n<th style=\"padding:8px;text-align:left;color:#fff;\">Location</th>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">Hardcoded konsole URL</td>\n<td style=\"padding:8px;color:#e06c75;font-weight:bold;\">TIGHT</td>\n<td style=\"padding:8px;color:#61afef;\">konsole-client.ts:12, router.ts:~850</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">SSE event format dependency</td>\n<td style=\"padding:8px;color:#e06c75;font-weight:bold;\">TIGHT</td>\n<td style=\"padding:8px;color:#61afef;\">streaming.ts, console-ui.ts</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">Session file state</td>\n<td style=\"padding:8px;color:#e06c75;font-weight:bold;\">TIGHT</td>\n<td style=\"padding:8px;color:#61afef;\">konui/data/konsole-sessions/*.txt</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">In-memory event buffering</td>\n<td style=\"padding:8px;color:#f97316;font-weight:bold;\">MEDIUM</td>\n<td style=\"padding:8px;color:#61afef;\">streaming.ts (DashboardStreamManager)</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">Prompt wrapping/injection</td>\n<td style=\"padding:8px;color:#f97316;font-weight:bold;\">MEDIUM</td>\n<td style=\"padding:8px;color:#61afef;\">router.ts (400+ lines injected)</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">Request ID persistence</td>\n<td style=\"padding:8px;color:#f97316;font-weight:bold;\">MEDIUM</td>\n<td style=\"padding:8px;color:#61afef;\">localStorage + konui memory</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">Startup order dependency</td>\n<td style=\"padding:8px;color:#f97316;font-weight:bold;\">MEDIUM</td>\n<td style=\"padding:8px;color:#61afef;\">bin/kon-start-*</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">Health check logic</td>\n<td style=\"padding:8px;color:#98c379;\">LOOSE</td>\n<td style=\"padding:8px;color:#61afef;\">konsole-client.ts</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">Quick Turn routing</td>\n<td style=\"padding:8px;color:#98c379;\">LOOSE</td>\n<td style=\"padding:8px;color:#61afef;\">router.ts → konsole /api/quick-turn</td>\n</tr>\n<tr>\n<td style=\"padding:8px;color:#e0e0e0;\">Stream cleanup lifecycle</td>\n<td style=\"padding:8px;color:#98c379;\">LOOSE</td>\n<td style=\"padding:8px;color:#61afef;\">streaming.ts (10-min expiry)</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;\">What Breaks on Restart?</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;\">Scenario</th>\n<th style=\"padding:8px;text-align:left;color:#fff;\">Impact</th>\n<th style=\"padding:8px;text-align:left;color:#fff;\">Recovery</th>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">Konsole restarts mid-turn</td>\n<td style=\"padding:8px;color:#e06c75;\">SSE closes, events lost, context lost</td>\n<td style=\"padding:8px;color:#98c379;\">10-30s, kontask still completes</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">Konui restarts mid-turn</td>\n<td style=\"padding:8px;color:#f97316;\">Buffered events lost</td>\n<td style=\"padding:8px;color:#98c379;\">Browser reconnects, polling fallback</td>\n</tr>\n<tr>\n<td style=\"padding:8px;color:#e0e0e0;\">Both restart</td>\n<td style=\"padding:8px;color:#e06c75;\">All state lost</td>\n<td style=\"padding:8px;color:#f97316;\">New session required</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;\">Decoupling Roadmap</h3>\n\n<div style=\"margin-bottom:16px;\">\n<h4 style=\"color:#e06c75;margin:0 0 8px 0;\">Priority 1: Critical (1-2 hours)</h4>\n<ul style=\"margin:0;padding-left:20px;line-height:1.8;color:#e0e0e0;\">\n<li><strong style=\"color:#98c379;\">Extract konsole URL to env var</strong> — enables multi-machine</li>\n<li><strong style=\"color:#98c379;\">Add startup dependency check</strong> — konui waits for konsole health</li>\n</ul>\n</div>\n\n<div style=\"margin-bottom:16px;\">\n<h4 style=\"color:#f97316;margin:0 0 8px 0;\">Priority 2: High (4-6 hours)</h4>\n<ul style=\"margin:0;padding-left:20px;line-height:1.8;color:#e0e0e0;\">\n<li><strong style=\"color:#61afef;\">Externalize event buffering</strong> — Redis or JSONL files, survives restarts</li>\n<li><strong style=\"color:#61afef;\">Decouple SSE event format</strong> — adapter layer for independent evolution</li>\n</ul>\n</div>\n\n<div>\n<h4 style=\"color:#98c379;margin:0 0 8px 0;\">Priority 3: Medium (2-4 hours)</h4>\n<ul style=\"margin:0;padding-left:20px;line-height:1.8;color:#e0e0e0;\">\n<li>Add circuit breaker pattern</li>\n<li>Persist request metadata to files</li>\n<li>Optional local Claude fallback if konsole down</li>\n</ul>\n</div>\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;\">Architecture Options</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;\">Option</th>\n<th style=\"padding:8px;text-align:left;color:#fff;\">Effort</th>\n<th style=\"padding:8px;text-align:left;color:#fff;\">Benefit</th>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">Keep current + Priority 1</td>\n<td style=\"padding:8px;color:#98c379;\">1-2h</td>\n<td style=\"padding:8px;color:#e0e0e0;\">Eliminates most gotchas</td>\n</tr>\n<tr style=\"border-bottom:1px solid #444;\">\n<td style=\"padding:8px;color:#e0e0e0;\">Add message queue (Redis)</td>\n<td style=\"padding:8px;color:#f97316;\">8-12h</td>\n<td style=\"padding:8px;color:#e0e0e0;\">Full restart resilience</td>\n</tr>\n<tr>\n<td style=\"padding:8px;color:#e0e0e0;\">Full service split</td>\n<td style=\"padding:8px;color:#e06c75;\">2-3 days</td>\n<td style=\"padding:8px;color:#e0e0e0;\">True multi-machine deployment</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;\">💡 Recommendation</h4>\n<p style=\"color:#e0e0e0;margin:0;line-height:1.6;\">Do <strong>Priority 1</strong> immediately (1-2h) — extracts konsole URL to config and adds startup health check. This eliminates most production gotchas with minimal effort. Then assess if Priority 2 is needed based on restart frequency.</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:35:00.000Z",
"requestId": "52469a4a-2693-430a-9dd9-1b7f4da4ac3e",
"choices": [
{
"label": "Implement Priority 1",
"value": "Implement Priority 1 decoupling: extract konsole URL to env var and add startup health check",
"primary": true
},
{
"label": "Add to backlog",
"value": "Add konsole-konui decoupling to VIBE.md backlog"
},
{
"label": "Deep dive coupling",
"value": "Show me the specific code locations for each coupling point"
}
],
"turnTiming": {
"totalMs": 280021,
"ttfeMs": 5815,
"thinkingMs": 0,
"toolExecutionMs": 300267,
"toolCallCount": 37,
"thinkingPct": 0,
"toolsPct": 98,
"ttfePct": 2
}
},
"createdBy": "claude",
"createdAt": "2026-01-05T04:38:00.133Z",
"updatedAt": "2026-01-05T04:38:06.165Z",
"requestId": "52469a4a-2693-430a-9dd9-1b7f4da4ac3e",
"scope": "vibetools",
"tags": [
"konsole",
"konui",
"architecture",
"decoupling"
],
"targetUser": "claude"
}