From c3e0184167add5ef961be29f335a4c524700ec09 Mon Sep 17 00:00:00 2001 From: Arjun <6592213+arkml@users.noreply.github.com> Date: Wed, 11 Feb 2026 18:01:16 +0530 Subject: [PATCH 1/8] fix onboarding losing focus --- .../src/components/onboarding-modal.tsx | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/apps/x/apps/renderer/src/components/onboarding-modal.tsx b/apps/x/apps/renderer/src/components/onboarding-modal.tsx index 6a1290dc..d8d344db 100644 --- a/apps/x/apps/renderer/src/components/onboarding-modal.tsx +++ b/apps/x/apps/renderer/src/components/onboarding-modal.tsx @@ -78,6 +78,7 @@ export function OnboardingModal({ open, onComplete }: OnboardingModalProps) { // Granola state const [granolaEnabled, setGranolaEnabled] = useState(false) const [granolaLoading, setGranolaLoading] = useState(true) + const [showMoreProviders, setShowMoreProviders] = useState(false) // Composio/Slack state const [composioApiKeyOpen, setComposioApiKeyOpen] = useState(false) @@ -445,8 +446,8 @@ export function OnboardingModal({ open, onComplete }: OnboardingModalProps) { startConnect('google', clientId) }, [startConnect]) - // Step indicator component - const StepIndicator = () => ( + // Step indicator + const renderStepIndicator = () => (
{[0, 1, 2].map((step) => (
{ - const [showMoreProviders, setShowMoreProviders] = useState(false) - + const renderLlmSetupStep = () => { const primaryProviders: Array<{ id: LlmProviderFlavor; name: string; description: string }> = [ { id: "openai", name: "OpenAI", description: "Use your OpenAI API key" }, { id: "anthropic", name: "Anthropic", description: "Use your Anthropic API key" }, @@ -745,7 +744,7 @@ export function OnboardingModal({ open, onComplete }: OnboardingModalProps) { } // Step 1: Connect Accounts - const AccountConnectionStep = () => ( + const renderAccountConnectionStep = () => (
Connect Your Accounts @@ -796,7 +795,7 @@ export function OnboardingModal({ open, onComplete }: OnboardingModalProps) { ) // Step 2: Completion - const CompletionStep = () => { + const renderCompletionStep = () => { const hasConnections = connectedProviders.length > 0 || granolaEnabled || slackConnected return ( @@ -877,10 +876,10 @@ export function OnboardingModal({ open, onComplete }: OnboardingModalProps) { onPointerDownOutside={(e) => e.preventDefault()} onEscapeKeyDown={(e) => e.preventDefault()} > - - {currentStep === 0 && } - {currentStep === 1 && } - {currentStep === 2 && } + {renderStepIndicator()} + {currentStep === 0 && renderLlmSetupStep()} + {currentStep === 1 && renderAccountConnectionStep()} + {currentStep === 2 && renderCompletionStep()} From 6c9ccc0f95dbc9dd4b1e0f07e83bae0ea2eaf9a9 Mon Sep 17 00:00:00 2001 From: Arjun <6592213+arkml@users.noreply.github.com> Date: Thu, 12 Feb 2026 11:40:55 +0530 Subject: [PATCH 2/8] fixed ollama --- apps/x/packages/core/src/models/models.ts | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/x/packages/core/src/models/models.ts b/apps/x/packages/core/src/models/models.ts index 482931df..ab332fb6 100644 --- a/apps/x/packages/core/src/models/models.ts +++ b/apps/x/packages/core/src/models/models.ts @@ -39,11 +39,17 @@ export function createProvider(config: z.infer): ProviderV2 { baseURL, headers, }); - case "ollama": + case "ollama": { + // ollama-ai-provider-v2 expects baseURL to include /api + let ollamaURL = baseURL; + if (ollamaURL && !ollamaURL.replace(/\/+$/, '').endsWith('/api')) { + ollamaURL = ollamaURL.replace(/\/+$/, '') + '/api'; + } return createOllama({ - baseURL, + baseURL: ollamaURL, headers, }); + } case "openai-compatible": return createOpenAICompatible({ name: "openai-compatible", @@ -65,10 +71,12 @@ export function createProvider(config: z.infer): ProviderV2 { export async function testModelConnection( providerConfig: z.infer, model: string, - timeoutMs: number = 8000, + timeoutMs?: number, ): Promise<{ success: boolean; error?: string }> { + const isLocal = providerConfig.flavor === "ollama" || providerConfig.flavor === "openai-compatible"; + const effectiveTimeout = timeoutMs ?? (isLocal ? 60000 : 8000); const controller = new AbortController(); - const timeout = setTimeout(() => controller.abort(), timeoutMs); + const timeout = setTimeout(() => controller.abort(), effectiveTimeout); try { const provider = createProvider(providerConfig); const languageModel = provider.languageModel(model); From b905a197470f26905c16be53ffd41feaabf3c2ac Mon Sep 17 00:00:00 2001 From: tusharmagar Date: Thu, 12 Feb 2026 16:43:02 +0530 Subject: [PATCH 3/8] fix: traffic light placeholder --- apps/x/apps/renderer/src/App.tsx | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/apps/x/apps/renderer/src/App.tsx b/apps/x/apps/renderer/src/App.tsx index bc9bb6cc..f5868166 100644 --- a/apps/x/apps/renderer/src/App.tsx +++ b/apps/x/apps/renderer/src/App.tsx @@ -125,6 +125,8 @@ const graphPalette = [ { hue: 0, sat: 72, light: 52 }, ] +const MACOS_TRAFFIC_LIGHTS_RESERVED_PX = 12 + 12 * 3 + 8 * 2 + const clampNumber = (value: number, min: number, max: number) => Math.min(max, Math.max(min, value)) @@ -461,32 +463,29 @@ function viewStatesEqual(a: ViewState, b: ViewState): boolean { return true // both graph } -/** Traffic light placeholders + toggle button + back/forward nav, fixed next to macOS traffic lights */ +/** Sidebar toggle + back/forward nav */ function FixedSidebarToggle({ onNavigateBack, onNavigateForward, canNavigateBack, canNavigateForward, + leftInsetPx, }: { onNavigateBack: () => void onNavigateForward: () => void canNavigateBack: boolean canNavigateForward: boolean + leftInsetPx: number }) { const { toggleSidebar } = useSidebar() return (
- {/* Placeholder dots that show through when traffic lights are hidden (window unfocused) */} -
-
-
-
-
+ ) } /** Main content header that adjusts padding based on sidebar state */ -function ContentHeader({ children }: { children: React.ReactNode }) { +function ContentHeader({ + children, + onNavigateBack, + onNavigateForward, + canNavigateBack, + canNavigateForward, + collapsedLeftPaddingPx, +}: { + children: React.ReactNode + onNavigateBack?: () => void + onNavigateForward?: () => void + canNavigateBack?: boolean + canNavigateForward?: boolean + collapsedLeftPaddingPx?: number +}) { const { state } = useSidebar() const isCollapsed = state === "collapsed" return ( @@ -523,9 +558,35 @@ function ContentHeader({ children }: { children: React.ReactNode }) { "titlebar-drag-region flex h-10 shrink-0 items-center gap-2 border-b border-border px-3 bg-sidebar transition-[padding] duration-200 ease-linear", // When the sidebar is collapsed the content area shifts left, so we need enough left padding // to avoid overlapping the fixed traffic-lights/toggle/back/forward controls. - isCollapsed && "pl-[168px]" + isCollapsed && !collapsedLeftPaddingPx && "pl-[168px]" )} + style={isCollapsed && collapsedLeftPaddingPx ? { paddingLeft: collapsedLeftPaddingPx } : undefined} > + {!isCollapsed && onNavigateBack && onNavigateForward ? ( +
+ + +
+ ) : null} + {onNavigateBack && onNavigateForward ? ( +