@tecet/ollm 0.1.4-b → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/README.md +3 -410
- package/package.json +2 -2
- package/docs/Context/CheckpointFlowDiagram.md +0 -673
- package/docs/Context/ContextArchitecture.md +0 -898
- package/docs/Context/ContextCompression.md +0 -1102
- package/docs/Context/ContextManagment.md +0 -750
- package/docs/Context/Index.md +0 -209
- package/docs/Context/README.md +0 -390
- package/docs/DevelopmentRoadmap/Index.md +0 -238
- package/docs/DevelopmentRoadmap/OLLM-CLI_Releases.md +0 -419
- package/docs/DevelopmentRoadmap/PlanedFeatures.md +0 -448
- package/docs/DevelopmentRoadmap/README.md +0 -174
- package/docs/DevelopmentRoadmap/Roadmap.md +0 -572
- package/docs/DevelopmentRoadmap/RoadmapVisual.md +0 -372
- package/docs/Hooks/Architecture.md +0 -885
- package/docs/Hooks/Index.md +0 -244
- package/docs/Hooks/KeyboardShortcuts.md +0 -248
- package/docs/Hooks/Protocol.md +0 -817
- package/docs/Hooks/README.md +0 -403
- package/docs/Hooks/UserGuide.md +0 -1483
- package/docs/Hooks/VisualGuide.md +0 -598
- package/docs/Index.md +0 -506
- package/docs/Installation.md +0 -586
- package/docs/Introduction.md +0 -367
- package/docs/LLM Models/Index.md +0 -239
- package/docs/LLM Models/LLM_GettingStarted.md +0 -748
- package/docs/LLM Models/LLM_Index.md +0 -701
- package/docs/LLM Models/LLM_MemorySystem.md +0 -337
- package/docs/LLM Models/LLM_ModelCompatibility.md +0 -499
- package/docs/LLM Models/LLM_ModelsArchitecture.md +0 -933
- package/docs/LLM Models/LLM_ModelsCommands.md +0 -839
- package/docs/LLM Models/LLM_ModelsConfiguration.md +0 -1094
- package/docs/LLM Models/LLM_ModelsList.md +0 -1071
- package/docs/LLM Models/LLM_ModelsList.md.backup +0 -400
- package/docs/LLM Models/README.md +0 -355
- package/docs/MCP/MCP_Architecture.md +0 -1086
- package/docs/MCP/MCP_Commands.md +0 -1111
- package/docs/MCP/MCP_GettingStarted.md +0 -590
- package/docs/MCP/MCP_Index.md +0 -524
- package/docs/MCP/MCP_Integration.md +0 -866
- package/docs/MCP/MCP_Marketplace.md +0 -160
- package/docs/MCP/README.md +0 -415
- package/docs/Prompts System/Architecture.md +0 -760
- package/docs/Prompts System/Index.md +0 -223
- package/docs/Prompts System/PromptsRouting.md +0 -1047
- package/docs/Prompts System/PromptsTemplates.md +0 -1102
- package/docs/Prompts System/README.md +0 -389
- package/docs/Prompts System/SystemPrompts.md +0 -856
- package/docs/Quickstart.md +0 -535
- package/docs/Tools/Architecture.md +0 -884
- package/docs/Tools/GettingStarted.md +0 -624
- package/docs/Tools/Index.md +0 -216
- package/docs/Tools/ManifestReference.md +0 -141
- package/docs/Tools/README.md +0 -440
- package/docs/Tools/UserGuide.md +0 -773
- package/docs/Troubleshooting.md +0 -1265
- package/docs/UI&Settings/Architecture.md +0 -729
- package/docs/UI&Settings/ColorASCII.md +0 -34
- package/docs/UI&Settings/Commands.md +0 -755
- package/docs/UI&Settings/Configuration.md +0 -872
- package/docs/UI&Settings/Index.md +0 -293
- package/docs/UI&Settings/Keybinds.md +0 -372
- package/docs/UI&Settings/README.md +0 -278
- package/docs/UI&Settings/Terminal.md +0 -637
- package/docs/UI&Settings/Themes.md +0 -604
- package/docs/UI&Settings/UIGuide.md +0 -550
|
@@ -1,729 +0,0 @@
|
|
|
1
|
-
# User Interface Architecture
|
|
2
|
-
|
|
3
|
-
**Last Updated:** January 26, 2026
|
|
4
|
-
|
|
5
|
-
This document provides complete technical documentation of the User Interface architecture, including React + Ink integration, component hierarchy, state management, theme system, and terminal integration.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Table of Contents
|
|
10
|
-
|
|
11
|
-
- [System Overview](#system-overview)
|
|
12
|
-
- [Technology Stack](#technology-stack)
|
|
13
|
-
- [Layout Architecture](#layout-architecture)
|
|
14
|
-
- [Component Hierarchy](#component-hierarchy)
|
|
15
|
-
- [State Management](#state-management)
|
|
16
|
-
- [Theme System](#theme-system)
|
|
17
|
-
- [Terminal Integration](#terminal-integration)
|
|
18
|
-
- [Focus Management](#focus-management)
|
|
19
|
-
- [Rendering Optimization](#rendering-optimization)
|
|
20
|
-
- [Best Practices](#best-practices)
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## System Overview
|
|
25
|
-
|
|
26
|
-
The OLLM CLI UI is a terminal-based interface built with React + Ink. The layout consists of three main areas: Header Bar, Main Content Area (with optional Side Panel), and Status Bar.
|
|
27
|
-
|
|
28
|
-
### Core Principles
|
|
29
|
-
|
|
30
|
-
1. **Terminal-First** - Designed for terminal environments
|
|
31
|
-
2. **Keyboard-Driven** - All features accessible via keyboard
|
|
32
|
-
3. **Responsive** - Adapts to terminal size changes
|
|
33
|
-
4. **Performant** - Efficient rendering and state updates
|
|
34
|
-
5. **Accessible** - Screen reader compatible, high contrast support
|
|
35
|
-
|
|
36
|
-
---
|
|
37
|
-
|
|
38
|
-
## Technology Stack
|
|
39
|
-
|
|
40
|
-
### Core Technologies
|
|
41
|
-
|
|
42
|
-
**React + Ink:**
|
|
43
|
-
|
|
44
|
-
- React 19.2.3 for component model
|
|
45
|
-
- Ink 6.6.0 for terminal rendering
|
|
46
|
-
- Functional components with hooks
|
|
47
|
-
- Context API for state management
|
|
48
|
-
|
|
49
|
-
**Terminal Rendering:**
|
|
50
|
-
|
|
51
|
-
- ANSI escape codes for formatting
|
|
52
|
-
- Flexbox-like layout system
|
|
53
|
-
- Component-based architecture
|
|
54
|
-
|
|
55
|
-
**State Management:**
|
|
56
|
-
|
|
57
|
-
- React Context for global state
|
|
58
|
-
- Local state with useState/useReducer
|
|
59
|
-
- Event-driven updates
|
|
60
|
-
|
|
61
|
-
---
|
|
62
|
-
|
|
63
|
-
## Layout Architecture
|
|
64
|
-
|
|
65
|
-
### Layout Structure
|
|
66
|
-
|
|
67
|
-
```
|
|
68
|
-
┌─────────────────────────────────────────────────────────────────┐
|
|
69
|
-
│ HEADER BAR (SystemBar) │
|
|
70
|
-
│ Model | Context | Mode | Clock │
|
|
71
|
-
├─────────────────────────────────────────────────────────────────┤
|
|
72
|
-
│ │
|
|
73
|
-
│ ┌─────────────────────┬─────────────────────────────────────┐ │
|
|
74
|
-
│ │ │ │ │
|
|
75
|
-
│ │ MAIN CONTENT │ SIDE PANEL (Optional) │ │
|
|
76
|
-
│ │ (Chat/Tabs) │ (Tools/Hooks/Files/MCP/Settings) │ │
|
|
77
|
-
│ │ │ │ │
|
|
78
|
-
│ │ - Chat History │ - Tab Navigation │ │
|
|
79
|
-
│ │ - Input Area │ - Tab Content │ │
|
|
80
|
-
│ │ │ - Actions │ │
|
|
81
|
-
│ │ │ │ │
|
|
82
|
-
│ └─────────────────────┴─────────────────────────────────────┘ │
|
|
83
|
-
│ │
|
|
84
|
-
├─────────────────────────────────────────────────────────────────┤
|
|
85
|
-
│ STATUS BAR │
|
|
86
|
-
│ Status | Keybind Hints | Notifications │
|
|
87
|
-
└─────────────────────────────────────────────────────────────────┘
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### Flexbox-Style Layout
|
|
91
|
-
|
|
92
|
-
```typescript
|
|
93
|
-
// Root Container
|
|
94
|
-
<Box flexDirection="column" height="100%" width="100%">
|
|
95
|
-
{/* Header Bar - Fixed height */}
|
|
96
|
-
<Box flexShrink={0} height={1} borderStyle="single" borderBottom>
|
|
97
|
-
<SystemBar />
|
|
98
|
-
</Box>
|
|
99
|
-
|
|
100
|
-
{/* Main Content - Flexible */}
|
|
101
|
-
<Box flexGrow={1} flexDirection="row">
|
|
102
|
-
{/* Left Column - Chat */}
|
|
103
|
-
<Box flexGrow={1} flexDirection="column" minWidth="60%">
|
|
104
|
-
<ChatTab />
|
|
105
|
-
</Box>
|
|
106
|
-
|
|
107
|
-
{/* Right Column - Side Panel (toggleable) */}
|
|
108
|
-
{sidePanelVisible && (
|
|
109
|
-
<Box flexShrink={0} width="40%" borderLeft>
|
|
110
|
-
<SidePanel />
|
|
111
|
-
</Box>
|
|
112
|
-
)}
|
|
113
|
-
</Box>
|
|
114
|
-
|
|
115
|
-
{/* Status Bar - Fixed height */}
|
|
116
|
-
<Box flexShrink={0} height={1} borderStyle="single" borderTop>
|
|
117
|
-
<StatusBar />
|
|
118
|
-
</Box>
|
|
119
|
-
</Box>
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
---
|
|
123
|
-
|
|
124
|
-
## Component Hierarchy
|
|
125
|
-
|
|
126
|
-
### Component Tree
|
|
127
|
-
|
|
128
|
-
```mermaid
|
|
129
|
-
graph TB
|
|
130
|
-
App[App.tsx]
|
|
131
|
-
App --> SystemBar[SystemBar]
|
|
132
|
-
App --> MainContent[Main Content]
|
|
133
|
-
App --> StatusBar[StatusBar]
|
|
134
|
-
|
|
135
|
-
SystemBar --> ModelDisplay[Model Display]
|
|
136
|
-
SystemBar --> ContextSection[Context Section]
|
|
137
|
-
SystemBar --> ModeDisplay[Mode Display]
|
|
138
|
-
SystemBar --> Clock[Clock]
|
|
139
|
-
|
|
140
|
-
MainContent --> ChatTab[Chat Tab]
|
|
141
|
-
MainContent --> SidePanel[Side Panel]
|
|
142
|
-
|
|
143
|
-
ChatTab --> ChatHistory[Chat History]
|
|
144
|
-
ChatTab --> ChatInput[Chat Input]
|
|
145
|
-
|
|
146
|
-
ChatHistory --> Message[Message]
|
|
147
|
-
Message --> ReasoningBox[Reasoning Box]
|
|
148
|
-
Message --> ToolCall[Tool Call]
|
|
149
|
-
|
|
150
|
-
SidePanel --> TabBar[Tab Bar]
|
|
151
|
-
SidePanel --> TabContent[Tab Content]
|
|
152
|
-
|
|
153
|
-
TabContent --> ToolsTab[Tools Tab]
|
|
154
|
-
TabContent --> HooksTab[Hooks Tab]
|
|
155
|
-
TabContent --> FilesTab[Files Tab]
|
|
156
|
-
TabContent --> MCPTab[MCP Tab]
|
|
157
|
-
TabContent --> SettingsTab[Settings Tab]
|
|
158
|
-
|
|
159
|
-
style App fill:#e1f5ff
|
|
160
|
-
style SystemBar fill:#fff4e1
|
|
161
|
-
style MainContent fill:#f0f0f0
|
|
162
|
-
style StatusBar fill:#fff4e1
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
### Component Locations
|
|
166
|
-
|
|
167
|
-
| Component | File Path |
|
|
168
|
-
| ------------- | --------------------------------------------------------- |
|
|
169
|
-
| App (Root) | `packages/cli/src/ui/App.tsx` |
|
|
170
|
-
| SystemBar | `packages/cli/src/ui/components/layout/SystemBar.tsx` |
|
|
171
|
-
| StatusBar | `packages/cli/src/ui/components/layout/StatusBar.tsx` |
|
|
172
|
-
| SidePanel | `packages/cli/src/ui/components/layout/SidePanel.tsx` |
|
|
173
|
-
| TabBar | `packages/cli/src/ui/components/layout/TabBar.tsx` |
|
|
174
|
-
| ChatTab | `packages/cli/src/ui/components/tabs/ChatTab.tsx` |
|
|
175
|
-
| ChatHistory | `packages/cli/src/ui/components/chat/ChatHistory.tsx` |
|
|
176
|
-
| Message | `packages/cli/src/ui/components/chat/Message.tsx` |
|
|
177
|
-
| ChatInputArea | `packages/cli/src/ui/components/layout/ChatInputArea.tsx` |
|
|
178
|
-
| ToolsTab | `packages/cli/src/ui/components/tabs/ToolsTab.tsx` |
|
|
179
|
-
| HooksTab | `packages/cli/src/ui/components/tabs/HooksTab.tsx` |
|
|
180
|
-
| FilesTab | `packages/cli/src/ui/components/tabs/FilesTab.tsx` |
|
|
181
|
-
| MCPTab | `packages/cli/src/ui/components/tabs/MCPTab.tsx` |
|
|
182
|
-
| SettingsTab | `packages/cli/src/ui/components/tabs/SettingsTab.tsx` |
|
|
183
|
-
|
|
184
|
-
---
|
|
185
|
-
|
|
186
|
-
## State Management
|
|
187
|
-
|
|
188
|
-
### Context Architecture
|
|
189
|
-
|
|
190
|
-
```mermaid
|
|
191
|
-
graph TB
|
|
192
|
-
App[App Component]
|
|
193
|
-
|
|
194
|
-
App --> UIContext[UIContext]
|
|
195
|
-
App --> ChatContext[ChatContext]
|
|
196
|
-
App --> FocusContext[FocusContext]
|
|
197
|
-
App --> InputRouting[InputRoutingContext]
|
|
198
|
-
App --> Terminal1[TerminalContext]
|
|
199
|
-
App --> Terminal2[Terminal2Context]
|
|
200
|
-
|
|
201
|
-
UIContext --> Theme[Theme State]
|
|
202
|
-
UIContext --> SidePanel[Side Panel State]
|
|
203
|
-
UIContext --> ActiveTab[Active Tab State]
|
|
204
|
-
|
|
205
|
-
ChatContext --> Messages[Messages State]
|
|
206
|
-
ChatContext --> Input[Input State]
|
|
207
|
-
ChatContext --> Streaming[Streaming State]
|
|
208
|
-
|
|
209
|
-
FocusContext --> FocusManager[Focus Manager]
|
|
210
|
-
FocusContext --> ActiveElement[Active Element]
|
|
211
|
-
|
|
212
|
-
style App fill:#e1f5ff
|
|
213
|
-
style UIContext fill:#fff4e1
|
|
214
|
-
style ChatContext fill:#fff4e1
|
|
215
|
-
style FocusContext fill:#fff4e1
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### Context Providers
|
|
219
|
-
|
|
220
|
-
#### UIContext
|
|
221
|
-
|
|
222
|
-
**Location:** `packages/cli/src/ui/contexts/UIContext.tsx`
|
|
223
|
-
|
|
224
|
-
**State:**
|
|
225
|
-
|
|
226
|
-
```typescript
|
|
227
|
-
interface UIState {
|
|
228
|
-
theme: Theme;
|
|
229
|
-
sidePanelVisible: boolean;
|
|
230
|
-
activeRightPanel: string;
|
|
231
|
-
// ... other UI state
|
|
232
|
-
}
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
**Actions:**
|
|
236
|
-
|
|
237
|
-
```typescript
|
|
238
|
-
interface UIActions {
|
|
239
|
-
setTheme: (theme: Theme) => void;
|
|
240
|
-
toggleSidePanel: () => void;
|
|
241
|
-
setActiveRightPanel: (panel: string) => void;
|
|
242
|
-
// ... other actions
|
|
243
|
-
}
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
#### ChatContext
|
|
247
|
-
|
|
248
|
-
**Location:** `packages/cli/src/features/context/ChatContext.tsx`
|
|
249
|
-
|
|
250
|
-
**State:**
|
|
251
|
-
|
|
252
|
-
```typescript
|
|
253
|
-
interface ChatState {
|
|
254
|
-
messages: Message[];
|
|
255
|
-
input: string;
|
|
256
|
-
isStreaming: boolean;
|
|
257
|
-
currentMessageId: string | null;
|
|
258
|
-
// ... other chat state
|
|
259
|
-
}
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
**Actions:**
|
|
263
|
-
|
|
264
|
-
```typescript
|
|
265
|
-
interface ChatActions {
|
|
266
|
-
addMessage: (message: Message) => void;
|
|
267
|
-
updateMessage: (id: string, updates: Partial<Message>) => void;
|
|
268
|
-
setInput: (input: string) => void;
|
|
269
|
-
sendMessage: () => void;
|
|
270
|
-
// ... other actions
|
|
271
|
-
}
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
#### FocusContext
|
|
275
|
-
|
|
276
|
-
**Location:** `packages/cli/src/ui/contexts/FocusContext.tsx`
|
|
277
|
-
|
|
278
|
-
**State:**
|
|
279
|
-
|
|
280
|
-
```typescript
|
|
281
|
-
interface FocusState {
|
|
282
|
-
activeElement: FocusableElement;
|
|
283
|
-
focusHistory: FocusableElement[];
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
type FocusableElement = 'chat-input' | 'side-panel' | 'file-explorer' | 'dialog';
|
|
287
|
-
```
|
|
288
|
-
|
|
289
|
-
**Actions:**
|
|
290
|
-
|
|
291
|
-
```typescript
|
|
292
|
-
interface FocusActions {
|
|
293
|
-
setFocus: (element: FocusableElement) => void;
|
|
294
|
-
cycleFocus: (direction: 'forward' | 'backward') => void;
|
|
295
|
-
restoreFocus: () => void;
|
|
296
|
-
}
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
---
|
|
300
|
-
|
|
301
|
-
## Message Rendering Architecture
|
|
302
|
-
|
|
303
|
-
### Line-Based Rendering System
|
|
304
|
-
|
|
305
|
-
**IMPORTANT:** OLLM CLI uses a **line-based rendering system** for chat history, not React component trees.
|
|
306
|
-
|
|
307
|
-
**Rendering Flow:**
|
|
308
|
-
|
|
309
|
-
```mermaid
|
|
310
|
-
sequenceDiagram
|
|
311
|
-
participant CM as ChatContext
|
|
312
|
-
participant CH as ChatHistory
|
|
313
|
-
participant BL as buildChatLines()
|
|
314
|
-
participant Render as Ink Render
|
|
315
|
-
|
|
316
|
-
CM->>CM: Update message state
|
|
317
|
-
CM->>CH: messages prop updated
|
|
318
|
-
CH->>BL: buildChatLines(messages)
|
|
319
|
-
BL->>BL: Convert messages to text lines
|
|
320
|
-
BL->>BL: Apply message.expanded state
|
|
321
|
-
BL-->>CH: AnsiLine[]
|
|
322
|
-
CH->>Render: Render lines as Text
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
**Key Insight:** Component-level state in `Message.tsx` or child components does NOT affect rendering. The actual rendering happens in the `buildChatLines()` utility function.
|
|
326
|
-
|
|
327
|
-
### Collapsible Content System
|
|
328
|
-
|
|
329
|
-
**State Control:** `message.expanded` field (boolean)
|
|
330
|
-
|
|
331
|
-
**Collapsible Elements:**
|
|
332
|
-
|
|
333
|
-
- Reasoning blocks (thinking process)
|
|
334
|
-
- Tool calls with large arguments
|
|
335
|
-
- Diffs with many lines
|
|
336
|
-
- Long outputs
|
|
337
|
-
|
|
338
|
-
**Behavior:**
|
|
339
|
-
|
|
340
|
-
```typescript
|
|
341
|
-
// ChatHistory.tsx
|
|
342
|
-
const isExpanded = message.expanded === true;
|
|
343
|
-
|
|
344
|
-
if (showReasoning && message.reasoning) {
|
|
345
|
-
if (isExpanded) {
|
|
346
|
-
// Show full reasoning content
|
|
347
|
-
addLine([{ text: message.reasoning.content, ... }]);
|
|
348
|
-
} else {
|
|
349
|
-
addLine([{ text: 'Reasoning: (collapsed)', ... }]);
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
```
|
|
353
|
-
|
|
354
|
-
### Reasoning Box Behavior
|
|
355
|
-
|
|
356
|
-
**States:**
|
|
357
|
-
|
|
358
|
-
1. **Streaming (expanded: true, complete: false)**
|
|
359
|
-
- Reasoning shows EXPANDED with full content
|
|
360
|
-
- Content streams in real-time
|
|
361
|
-
- User can see the thinking process
|
|
362
|
-
|
|
363
|
-
2. **Complete (expanded: false, complete: true)**
|
|
364
|
-
- Auto-collapses to summary view
|
|
365
|
-
- Shows "Reasoning: (collapsed)"
|
|
366
|
-
- Saves screen space
|
|
367
|
-
|
|
368
|
-
3. **Historical Messages**
|
|
369
|
-
- Completed reasoning blocks start COLLAPSED
|
|
370
|
-
- Shows summary line only
|
|
371
|
-
|
|
372
|
-
**Implementation:**
|
|
373
|
-
|
|
374
|
-
```typescript
|
|
375
|
-
// ChatContext.tsx - Message Creation
|
|
376
|
-
const assistantMsg = addMessage({
|
|
377
|
-
role: 'assistant',
|
|
378
|
-
content: '',
|
|
379
|
-
expanded: true, // Start expanded to show reasoning
|
|
380
|
-
});
|
|
381
|
-
|
|
382
|
-
// ChatContext.tsx - On Completion
|
|
383
|
-
if (msg.reasoning) {
|
|
384
|
-
updates.reasoning = {
|
|
385
|
-
...msg.reasoning,
|
|
386
|
-
complete: true,
|
|
387
|
-
};
|
|
388
|
-
updates.expanded = false; // Auto-collapse when complete
|
|
389
|
-
}
|
|
390
|
-
```
|
|
391
|
-
|
|
392
|
-
---
|
|
393
|
-
|
|
394
|
-
## Theme System
|
|
395
|
-
|
|
396
|
-
### Theme Architecture
|
|
397
|
-
|
|
398
|
-
```mermaid
|
|
399
|
-
graph LR
|
|
400
|
-
TM[ThemeManager]
|
|
401
|
-
SS[SettingsService]
|
|
402
|
-
UC[UIContext]
|
|
403
|
-
Comp[Components]
|
|
404
|
-
|
|
405
|
-
TM -->|load theme| UC
|
|
406
|
-
SS -->|get/set theme| TM
|
|
407
|
-
UC -->|provide theme| Comp
|
|
408
|
-
Comp -->|use theme colors| Render[Rendered UI]
|
|
409
|
-
|
|
410
|
-
style TM fill:#fff4e1
|
|
411
|
-
style SS fill:#f0f0f0
|
|
412
|
-
style UC fill:#e1f5ff
|
|
413
|
-
```
|
|
414
|
-
|
|
415
|
-
### Theme Structure
|
|
416
|
-
|
|
417
|
-
```typescript
|
|
418
|
-
interface Theme {
|
|
419
|
-
name: string;
|
|
420
|
-
bg: {
|
|
421
|
-
primary: string; // Main background
|
|
422
|
-
secondary: string; // Secondary background
|
|
423
|
-
tertiary: string; // Tertiary background
|
|
424
|
-
};
|
|
425
|
-
text: {
|
|
426
|
-
primary: string; // Main text color
|
|
427
|
-
secondary: string; // Secondary text color
|
|
428
|
-
accent: string; // Accent/highlight color
|
|
429
|
-
};
|
|
430
|
-
role: {
|
|
431
|
-
user: string; // User message color
|
|
432
|
-
assistant: string; // Assistant message color
|
|
433
|
-
system: string; // System message color
|
|
434
|
-
tool: string; // Tool call color
|
|
435
|
-
};
|
|
436
|
-
status: {
|
|
437
|
-
success: string; // Success state color
|
|
438
|
-
warning: string; // Warning state color
|
|
439
|
-
error: string; // Error state color
|
|
440
|
-
info: string; // Info state color
|
|
441
|
-
};
|
|
442
|
-
border: {
|
|
443
|
-
primary: string; // Primary border color
|
|
444
|
-
secondary: string; // Secondary border color
|
|
445
|
-
active: string; // Active border color
|
|
446
|
-
style: string; // Border style (round, single, double)
|
|
447
|
-
};
|
|
448
|
-
diff: {
|
|
449
|
-
added: string; // Added lines in diff
|
|
450
|
-
removed: string; // Removed lines in diff
|
|
451
|
-
};
|
|
452
|
-
}
|
|
453
|
-
```
|
|
454
|
-
|
|
455
|
-
### Built-in Themes
|
|
456
|
-
|
|
457
|
-
1. **solarized-dark** (Default) - Precision theme for reduced eye strain
|
|
458
|
-
2. **neon-dark** - Balanced dark theme
|
|
459
|
-
3. **dracula-dark** - High-contrast theme
|
|
460
|
-
4. **nord-dark** - Arctic, north-bluish palette
|
|
461
|
-
5. **monokai-dark** - Vibrant, high-contrast theme
|
|
462
|
-
6. **solarized-dark-2** - Alternative Solarized variant
|
|
463
|
-
|
|
464
|
-
### Theme Application
|
|
465
|
-
|
|
466
|
-
```typescript
|
|
467
|
-
// Accessing theme in components
|
|
468
|
-
const { state: uiState } = useUI();
|
|
469
|
-
const { theme } = uiState;
|
|
470
|
-
|
|
471
|
-
// Using theme colors
|
|
472
|
-
<Text color={theme.text.primary}>Content</Text>
|
|
473
|
-
<Box borderColor={theme.border.active}>Focused</Box>
|
|
474
|
-
```
|
|
475
|
-
|
|
476
|
-
---
|
|
477
|
-
|
|
478
|
-
## Terminal Integration
|
|
479
|
-
|
|
480
|
-
### Terminal Architecture
|
|
481
|
-
|
|
482
|
-
```mermaid
|
|
483
|
-
graph TB
|
|
484
|
-
TC[TerminalContext]
|
|
485
|
-
PTY[PTY Process]
|
|
486
|
-
Xterm[xterm.js Headless]
|
|
487
|
-
Ser[terminalSerializer]
|
|
488
|
-
Comp[Terminal2 Component]
|
|
489
|
-
|
|
490
|
-
TC -->|spawn| PTY
|
|
491
|
-
TC -->|create| Xterm
|
|
492
|
-
PTY -->|data| Xterm
|
|
493
|
-
Xterm -->|buffer| Ser
|
|
494
|
-
Ser -->|AnsiLine[]| TC
|
|
495
|
-
TC -->|output| Comp
|
|
496
|
-
Comp -->|render| UI[Terminal UI]
|
|
497
|
-
|
|
498
|
-
style TC fill:#fff4e1
|
|
499
|
-
style PTY fill:#f0f0f0
|
|
500
|
-
style Xterm fill:#f0f0f0
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
### PTY Integration
|
|
504
|
-
|
|
505
|
-
**Process Spawning:**
|
|
506
|
-
|
|
507
|
-
```typescript
|
|
508
|
-
const isWindows = os.platform() === 'win32';
|
|
509
|
-
const shell = isWindows ? 'powershell.exe' : 'bash';
|
|
510
|
-
|
|
511
|
-
pty.spawn(shell, shellArgs, {
|
|
512
|
-
name: 'xterm-color',
|
|
513
|
-
cols: 80,
|
|
514
|
-
rows: 30,
|
|
515
|
-
cwd: process.cwd(),
|
|
516
|
-
env: process.env,
|
|
517
|
-
});
|
|
518
|
-
```
|
|
519
|
-
|
|
520
|
-
### ANSI Rendering
|
|
521
|
-
|
|
522
|
-
**Token Structure:**
|
|
523
|
-
|
|
524
|
-
```typescript
|
|
525
|
-
interface AnsiToken {
|
|
526
|
-
text: string;
|
|
527
|
-
bold: boolean;
|
|
528
|
-
italic: boolean;
|
|
529
|
-
underline: boolean;
|
|
530
|
-
dim: boolean;
|
|
531
|
-
inverse: boolean;
|
|
532
|
-
fg: string; // Hex color
|
|
533
|
-
bg: string; // Hex color
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
type AnsiLine = AnsiToken[];
|
|
537
|
-
```
|
|
538
|
-
|
|
539
|
-
**Serialization Process:**
|
|
540
|
-
|
|
541
|
-
1. Read xterm.js buffer cells
|
|
542
|
-
2. Extract cell attributes (bold, italic, colors)
|
|
543
|
-
3. Group consecutive cells with same attributes
|
|
544
|
-
4. Convert to structured tokens
|
|
545
|
-
5. Emit as array of lines
|
|
546
|
-
|
|
547
|
-
---
|
|
548
|
-
|
|
549
|
-
## Focus Management
|
|
550
|
-
|
|
551
|
-
### Focus System
|
|
552
|
-
|
|
553
|
-
```mermaid
|
|
554
|
-
stateDiagram-v2
|
|
555
|
-
[*] --> ChatInput
|
|
556
|
-
ChatInput --> SidePanel: Tab
|
|
557
|
-
SidePanel --> FileExplorer: Tab
|
|
558
|
-
FileExplorer --> Dialog: Open Dialog
|
|
559
|
-
Dialog --> ChatInput: Close Dialog
|
|
560
|
-
ChatInput --> SidePanel: Ctrl+P
|
|
561
|
-
SidePanel --> ChatInput: Ctrl+Space
|
|
562
|
-
```
|
|
563
|
-
|
|
564
|
-
### Focusable Elements
|
|
565
|
-
|
|
566
|
-
1. **Chat Input** - Main input area
|
|
567
|
-
2. **Side Panel** - Side panel tabs and content
|
|
568
|
-
3. **File Explorer** - File tree navigation
|
|
569
|
-
4. **Dialogs** - Modal dialogs (when open)
|
|
570
|
-
|
|
571
|
-
### Focus Indicators
|
|
572
|
-
|
|
573
|
-
- Border highlight (theme-dependent)
|
|
574
|
-
- Cursor visibility
|
|
575
|
-
- Keybind hints update
|
|
576
|
-
|
|
577
|
-
### Focus API
|
|
578
|
-
|
|
579
|
-
```typescript
|
|
580
|
-
interface FocusManager {
|
|
581
|
-
setFocus: (element: FocusableElement) => void;
|
|
582
|
-
cycleFocus: (direction: 'forward' | 'backward') => void;
|
|
583
|
-
restoreFocus: () => void;
|
|
584
|
-
hasFocus: (element: FocusableElement) => boolean;
|
|
585
|
-
}
|
|
586
|
-
```
|
|
587
|
-
|
|
588
|
-
---
|
|
589
|
-
|
|
590
|
-
## Rendering Optimization
|
|
591
|
-
|
|
592
|
-
### Performance Strategies
|
|
593
|
-
|
|
594
|
-
**1. Virtual Scrolling**
|
|
595
|
-
|
|
596
|
-
- Only render visible messages
|
|
597
|
-
- Lazy load older messages
|
|
598
|
-
- Pagination for long conversations
|
|
599
|
-
|
|
600
|
-
**2. Message Pagination**
|
|
601
|
-
|
|
602
|
-
- Keep last 100 messages in memory
|
|
603
|
-
- Older messages in session storage
|
|
604
|
-
- Load on demand when scrolling
|
|
605
|
-
|
|
606
|
-
**3. Efficient Updates**
|
|
607
|
-
|
|
608
|
-
- React reconciliation for minimal updates
|
|
609
|
-
- Memoization for expensive computations
|
|
610
|
-
- Debounced state updates
|
|
611
|
-
|
|
612
|
-
**4. Layout Optimization**
|
|
613
|
-
|
|
614
|
-
- Fixed-size components where possible
|
|
615
|
-
- Avoid unnecessary re-renders
|
|
616
|
-
- Use React.memo for pure components
|
|
617
|
-
|
|
618
|
-
### Memory Management
|
|
619
|
-
|
|
620
|
-
**Chat History:**
|
|
621
|
-
|
|
622
|
-
```typescript
|
|
623
|
-
// Keep recent messages in memory
|
|
624
|
-
const recentMessages = messages.slice(-100);
|
|
625
|
-
|
|
626
|
-
// Store older messages
|
|
627
|
-
const olderMessages = messages.slice(0, -100);
|
|
628
|
-
sessionStorage.setItem('older-messages', JSON.stringify(olderMessages));
|
|
629
|
-
```
|
|
630
|
-
|
|
631
|
-
**File Explorer:**
|
|
632
|
-
|
|
633
|
-
```typescript
|
|
634
|
-
// Lazy load directory contents
|
|
635
|
-
const loadDirectory = async (path: string) => {
|
|
636
|
-
if (expandedDirs.has(path)) return;
|
|
637
|
-
const contents = await fs.readdir(path);
|
|
638
|
-
setExpandedDirs((prev) => new Set([...prev, path]));
|
|
639
|
-
};
|
|
640
|
-
```
|
|
641
|
-
|
|
642
|
-
---
|
|
643
|
-
|
|
644
|
-
## Responsive Behavior
|
|
645
|
-
|
|
646
|
-
### Terminal Size Adaptation
|
|
647
|
-
|
|
648
|
-
**Minimum Size:** 80x24 (columns x rows)
|
|
649
|
-
**Recommended:** 120x40
|
|
650
|
-
|
|
651
|
-
**Behavior:**
|
|
652
|
-
|
|
653
|
-
- Side panel auto-hides on narrow terminals (< 100 columns)
|
|
654
|
-
- Chat history scrolls on short terminals (< 30 rows)
|
|
655
|
-
- Input area shrinks on very short terminals
|
|
656
|
-
|
|
657
|
-
### Overflow Handling
|
|
658
|
-
|
|
659
|
-
```typescript
|
|
660
|
-
// Chat History
|
|
661
|
-
<Box flexDirection="column" overflow="hidden">
|
|
662
|
-
<Box flexGrow={1} overflowY="auto">
|
|
663
|
-
{/* Scrollable content */}
|
|
664
|
-
</Box>
|
|
665
|
-
</Box>
|
|
666
|
-
|
|
667
|
-
// Side Panel Content
|
|
668
|
-
<Box flexGrow={1} overflowY="auto" overflowX="hidden">
|
|
669
|
-
{/* Scrollable, wrapped content */}
|
|
670
|
-
</Box>
|
|
671
|
-
```
|
|
672
|
-
|
|
673
|
-
---
|
|
674
|
-
|
|
675
|
-
## Best Practices
|
|
676
|
-
|
|
677
|
-
### Component Design
|
|
678
|
-
|
|
679
|
-
1. **Functional Components** - Use hooks, not classes
|
|
680
|
-
2. **Single Responsibility** - One component, one purpose
|
|
681
|
-
3. **Composition** - Build complex UIs from simple components
|
|
682
|
-
4. **Props Validation** - Use TypeScript interfaces
|
|
683
|
-
5. **Error Boundaries** - Handle errors gracefully
|
|
684
|
-
|
|
685
|
-
### State Management
|
|
686
|
-
|
|
687
|
-
1. **Context for Global State** - Use Context API for shared state
|
|
688
|
-
2. **Local State for UI** - Use useState for component-specific state
|
|
689
|
-
3. **Derived State** - Use useMemo for computed values
|
|
690
|
-
4. **Side Effects** - Use useEffect for side effects
|
|
691
|
-
5. **Event Handlers** - Keep handlers simple and focused
|
|
692
|
-
|
|
693
|
-
### Performance
|
|
694
|
-
|
|
695
|
-
1. **Memoization** - Use React.memo for pure components
|
|
696
|
-
2. **Lazy Loading** - Load content on demand
|
|
697
|
-
3. **Debouncing** - Debounce expensive operations
|
|
698
|
-
4. **Virtual Scrolling** - Render only visible items
|
|
699
|
-
5. **Profiling** - Use React DevTools to identify bottlenecks
|
|
700
|
-
|
|
701
|
-
### Accessibility
|
|
702
|
-
|
|
703
|
-
1. **Keyboard Navigation** - All features accessible via keyboard
|
|
704
|
-
2. **Focus Indicators** - Clear visual focus indicators
|
|
705
|
-
3. **Screen Reader Support** - Text-based UI, ANSI formatting
|
|
706
|
-
4. **Color Contrast** - High contrast themes available
|
|
707
|
-
5. **Status Messages** - Clear, descriptive status messages
|
|
708
|
-
|
|
709
|
-
---
|
|
710
|
-
|
|
711
|
-
## File Locations
|
|
712
|
-
|
|
713
|
-
| Category | Files |
|
|
714
|
-
| ------------ | --------------------------------------------------- |
|
|
715
|
-
| **Root** | `packages/cli/src/ui/App.tsx` |
|
|
716
|
-
| **Layout** | `packages/cli/src/ui/components/layout/` |
|
|
717
|
-
| **Chat** | `packages/cli/src/ui/components/chat/` |
|
|
718
|
-
| **Tabs** | `packages/cli/src/ui/components/tabs/` |
|
|
719
|
-
| **Contexts** | `packages/cli/src/ui/contexts/` |
|
|
720
|
-
| **Hooks** | `packages/cli/src/ui/hooks/` |
|
|
721
|
-
| **Utils** | `packages/cli/src/ui/utils/` |
|
|
722
|
-
| **Themes** | `packages/cli/src/config/themes.ts` |
|
|
723
|
-
| **Terminal** | `packages/cli/src/ui/contexts/Terminal*Context.tsx` |
|
|
724
|
-
|
|
725
|
-
---
|
|
726
|
-
|
|
727
|
-
**Last Updated:** January 26, 2026
|
|
728
|
-
**Version:** 0.1.0
|
|
729
|
-
**Status:** Active Development
|