Skip to content

Commit 29d084f

Browse files
author
Brendan Gray
committed
v1.6.8: UI polish — title bar search, panel shadows, chat separators, status bar groups; fix cloud model garbling (revert Fix 2A)
1 parent 11117d0 commit 29d084f

5 files changed

Lines changed: 42 additions & 23 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "guide-ide",
3-
"version": "1.6.7",
3+
"version": "1.6.8",
44
"description": "guIDE - AI-Powered Offline IDE with local LLM, RAG, MCP tools, browser automation, and integrated terminal",
55
"author": {
66
"name": "Brendan Gray",

src/components/Chat/ChatPanel.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2992,6 +2992,8 @@ ${e.message}`,
29922992
<Zap size={10} className={autoMode ? 'text-[#ffd700]' : ''} />
29932993
<span className="hidden sm:inline">Auto</span>
29942994
</button>
2995+
{/* Auto/Plan separator */}
2996+
<div className="w-px h-3.5 flex-shrink-0 mx-0.5" style={{ backgroundColor: 'rgba(255,255,255,0.12)' }} />
29952997
{/* Plan Mode toggle — inline */}
29962998
<button
29972999
className={`flex items-center gap-0.5 text-[11px] px-1 py-0.5 rounded transition-colors ${
@@ -3007,6 +3009,8 @@ ${e.message}`,
30073009
<FileCode size={10} className={planMode ? 'text-white' : ''} />
30083010
<span className="hidden sm:inline">Plan</span>
30093011
</button>
3012+
{/* Plan/Model separator */}
3013+
<div className="w-px h-3.5 flex-shrink-0 mx-0.5" style={{ backgroundColor: 'rgba(255,255,255,0.12)' }} />
30103014
{/* Model picker — inline */}
30113015
<button
30123016
className="flex items-center gap-1 text-[11px] text-[#858585] hover:text-[#cccccc] px-1 py-0.5 rounded hover:bg-[#4c4c4c] transition-colors chat-dropdown-panel max-w-[120px]"

src/components/Chat/hooks/useChatStreaming.ts

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -164,26 +164,12 @@ export function useChatStreaming(): ChatStreamingState {
164164
iterationStartOffsetRef.current = streamBufferRef.current.length;
165165
});
166166

167-
// Anti-hallucination: backend detected fake tool results
167+
// Anti-hallucination: backend detected fake tool results, or tool-call iteration wipe.
168+
// The backend (agenticChat.js) already routes any planning text to llm-thinking-token
169+
// BEFORE sending llm-replace-last, so we just wipe this iteration's slot here.
168170
const cleanupReplace = api.onLlmReplaceLast?.((cleanedText: string) => {
169171
if (streamEpochRef.current !== activeEpochRef.current) return;
170172
const prefix = streamBufferRef.current.slice(0, iterationStartOffsetRef.current);
171-
// When cleanedText is empty (tool-call iteration wipe), the streamed planning text
172-
// would vanish abruptly from the main chat. Promote it to a thinking segment so it
173-
// transitions visually rather than disappearing — prevents the jarring flash/blank effect.
174-
if (!cleanedText) {
175-
const iterationText = streamBufferRef.current.slice(iterationStartOffsetRef.current).trim();
176-
if (iterationText.length > 10) {
177-
// Avoid duplication: backend may have already sent this text as llm-thinking-token.
178-
// Only push if last thinking segment doesn't already start with the same content.
179-
const lastSeg = thinkingSegmentsRef.current[thinkingSegmentsRef.current.length - 1] || '';
180-
const firstChunk = iterationText.substring(0, 80);
181-
if (!lastSeg.includes(firstChunk)) {
182-
thinkingSegmentsRef.current.push(iterationText);
183-
scheduleThinkingUpdate();
184-
}
185-
}
186-
}
187173
// Preserve text from prior iterations — only replace current iteration's portion
188174
streamBufferRef.current = prefix + cleanedText;
189175
// Jump display to buffer end — corrections show immediately, no typewriter delay

src/components/Layout/Layout.tsx

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -376,14 +376,39 @@ export const Layout: React.FC = () => {
376376
return (
377377
<div className="flex flex-col h-screen overflow-hidden" style={{ backgroundColor: 'var(--theme-bg)', color: 'var(--theme-foreground)' }}>
378378
{/* Title Bar with Menu */}
379-
<div className="h-[40px] flex items-center select-none flex-shrink-0 relative z-50 pt-[2px]"
379+
<div className="h-[34px] flex items-center select-none flex-shrink-0 relative z-50"
380380
style={{ backgroundColor: 'var(--theme-title-bar)', WebkitAppRegion: 'drag' } as any}>
381381
<div className="flex items-center text-[12px]" style={{ color: 'var(--theme-foreground)', opacity: 0.8, WebkitAppRegion: 'no-drag' } as any}>
382382
<span className="px-2 flex items-center" title="guIDE by Brendan Gray">
383383
<img src="zzz.png" alt="guIDE" className="w-5 h-5" style={{ filter: 'brightness(1.2)' }} />
384384
</span>
385385
<MenuBar onAction={handleMenuAction} />
386386
</div>
387+
{/* Centered VS Code-style project search bar */}
388+
<div
389+
className="absolute left-1/2 -translate-x-1/2 flex items-center"
390+
style={{ WebkitAppRegion: 'no-drag' } as any}
391+
>
392+
<button
393+
className="flex items-center gap-2 h-[22px] rounded transition-all px-3 hover:opacity-100"
394+
style={{
395+
backgroundColor: 'var(--theme-input-bg, rgba(255,255,255,0.06))',
396+
border: '1px solid var(--theme-border, rgba(255,255,255,0.10))',
397+
color: 'var(--theme-foreground-muted)',
398+
width: 'clamp(220px, 30vw, 440px)',
399+
opacity: 0.75,
400+
}}
401+
onClick={() => handleMenuAction('command-palette')}
402+
title="Search files, commands, and more (Ctrl+P)"
403+
aria-label="Open command palette"
404+
>
405+
<Search size={11} className="flex-shrink-0 opacity-60" />
406+
<span className="truncate flex-1 text-left text-[11px]">
407+
{rootPath ? rootPath.split(/[\/\\]/).pop() : 'Search files by name...'}
408+
</span>
409+
<kbd className="text-[10px] opacity-35 flex-shrink-0 ml-1 font-sans">Ctrl+P</kbd>
410+
</button>
411+
</div>
387412
<div className="flex-1" />
388413
{/* VS Code–style layout toggle buttons */}
389414
<div className="flex items-center gap-0.5 mr-2" style={{ WebkitAppRegion: 'no-drag' } as any}>
@@ -572,7 +597,7 @@ export const Layout: React.FC = () => {
572597
) : (
573598
<>
574599
{/* Sidebar — always mounted so panels stay alive; width animates open/close */}
575-
<div className="flex flex-col flex-shrink-0 overflow-hidden" style={{ width: sidebarVisible ? sidebarWidth : 0, backgroundColor: 'var(--theme-sidebar)', borderRight: sidebarVisible ? '1px solid var(--theme-sidebar-border)' : 'none', transition: 'width 200ms cubic-bezier(0.4,0,0.2,1)' }}>
600+
<div className="flex flex-col flex-shrink-0 overflow-hidden" style={{ width: sidebarVisible ? sidebarWidth : 0, backgroundColor: 'var(--theme-sidebar)', borderRight: sidebarVisible ? '1px solid var(--theme-sidebar-border)' : 'none', transition: 'width 200ms cubic-bezier(0.4,0,0.2,1)', boxShadow: sidebarVisible ? '2px 0 8px rgba(0,0,0,0.28)' : 'none' }}>
576601
<div className="h-[30px] flex items-center px-4 text-[11px] font-semibold uppercase tracking-wider flex-shrink-0" style={{ color: 'var(--theme-foreground-subtle)', borderBottom: '1px solid var(--theme-sidebar-border)' }}>
577602
{sidebarView === 'explorer' && 'Explorer'}
578603
{sidebarView === 'search' && 'Search'}
@@ -705,7 +730,7 @@ export const Layout: React.FC = () => {
705730
{chatVisible && (
706731
<>
707732
<div className="w-[4px] cursor-col-resize bg-transparent hover:bg-[#007acc] active:bg-[#007acc] transition-colors flex-shrink-0" onMouseDown={() => startResize('chat')} />
708-
<div className="flex-shrink-0 border-l border-[#252526] overflow-hidden" style={{ width: chatWidth }}>
733+
<div className="flex-shrink-0 border-l border-[#252526] overflow-hidden" style={{ width: chatWidth, boxShadow: '-2px 0 8px rgba(0,0,0,0.28)' }}>
709734
<ChatPanel
710735
rootPath={rootPath}
711736
currentFile={currentFile}

src/components/Layout/StatusBar.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,16 +244,18 @@ export const StatusBar: React.FC<StatusBarProps> = ({
244244
</div>
245245
)}
246246

247+
{/* Editor info group separator */}
248+
<div className="w-px h-3 flex-shrink-0 mx-0.5" style={{ backgroundColor: 'rgba(255,255,255,0.10)' }} />
247249
{/* Cursor position */}
248250
<div className="cursor-pointer hover:bg-[#ffffff10] px-1 rounded flex-shrink-0 whitespace-nowrap">
249251
Ln {cursorPosition.line}, Col {cursorPosition.column}
250252
</div>
251-
252253
{/* Language */}
253254
<div className="cursor-pointer hover:bg-[#ffffff10] px-1 rounded capitalize flex-shrink-0">
254255
{language}
255256
</div>
256-
257+
{/* AI status group separator */}
258+
<div className="w-px h-3 flex-shrink-0 mx-0.5" style={{ backgroundColor: 'rgba(255,255,255,0.10)' }} />
257259
{/* LLM Status */}
258260
<div className="flex items-center gap-1 cursor-pointer hover:bg-[#ffffff10] px-1 rounded min-w-0 flex-shrink"
259261
title={llmStatus.modelInfo ? `${llmStatus.modelInfo.name}\nContext: ${llmStatus.modelInfo.contextSize || '?'} tokens\nGPU Layers: ${llmStatus.modelInfo.gpuLayers || '?'}\nBackend: ${llmStatus.modelInfo.gpuBackend || '?'}${llmStatus.modelInfo.flashAttention ? '\nFlash Attention: ON' : ''}` : llmStatus.message}>
@@ -266,6 +268,8 @@ export const StatusBar: React.FC<StatusBarProps> = ({
266268
)}
267269
</div>
268270

271+
{/* Actions group separator */}
272+
<div className="w-px h-3 flex-shrink-0 mx-0.5" style={{ backgroundColor: 'rgba(255,255,255,0.10)' }} />
269273
{/* Voice Command */}
270274
{onAction && (
271275
<VoiceCommandButton onAction={onAction} onChatMessage={onChatMessage} />

0 commit comments

Comments
 (0)