Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions ui/desktop/src/agent/UpdateAgent.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { useConfig, FixedExtensionEntry } from '../components/ConfigContext';

Check warning on line 1 in ui/desktop/src/agent/UpdateAgent.tsx

View workflow job for this annotation

GitHub Actions / Lint Electron Desktop App

'FixedExtensionEntry' is defined but never used. Allowed unused vars must match /^_/u
import { getApiUrl, getSecretKey } from '../config';
import { ExtensionConfig } from '../api';
import { toast } from 'react-toastify';
import React, { useState } from 'react';

Check warning on line 5 in ui/desktop/src/agent/UpdateAgent.tsx

View workflow job for this annotation

GitHub Actions / Lint Electron Desktop App

'React' is defined but never used. Allowed unused vars must match /^_/u
import { initializeAgent as startAgent, replaceWithShims } from './utils';
import {
ToastError,
Expand Down Expand Up @@ -33,7 +33,7 @@
console.error('Failed to initialize agent:', error);
ToastError({
title: 'Failed to initialize agent',
errorMessage: error instanceof Error ? error.message : 'Unknown error',
traceback: error instanceof Error ? error.message : 'Unknown error',
});
return false;
}
Expand Down Expand Up @@ -131,7 +131,7 @@
ToastError({
title: extension.name,
msg: 'Failed to add extension',
errorMessage: errorMsg,
traceback: errorMsg,
});
}
return response;
Expand Down Expand Up @@ -167,7 +167,7 @@
ToastError({
title: extension.name,
msg: 'Failed to add extension',
errorMessage: data.message,
traceback: data.message,
});

return response;
Expand All @@ -178,7 +178,7 @@
ToastError({
title: extension.name,
msg: 'Failed to add extension',
errorMessage: error.message,
traceback: error.message,
});
throw error;
}
Expand Down
21 changes: 21 additions & 0 deletions ui/desktop/src/agent/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { getApiUrl, getSecretKey } from '../config';

interface initializeAgentProps {
model: string;
provider: string;
}

export async function initializeAgent({ model, provider }: initializeAgentProps) {
const response = await fetch(getApiUrl('/agent'), {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Secret-Key': getSecretKey(),
},
body: JSON.stringify({
provider: provider.toLowerCase().replace(/ /g, '_'),
model: model,
}),
});
return response;
}
121 changes: 64 additions & 57 deletions ui/desktop/src/components/BottomMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { ModelRadioList } from './settings/models/ModelRadioList';
import { Document, ChevronUp, ChevronDown } from './icons';
import type { View } from '../App';
import { BottomMenuModeSelection } from './BottomMenuModeSelection';
import ModelsBottomBar from './settings_v2/models/subcomponents/ModelsBottomBar';

export default function BottomMenu({
hasMessages,
Expand Down Expand Up @@ -76,71 +77,77 @@ export default function BottomMenu({
{/* Goose Mode Selector Dropdown */}
<BottomMenuModeSelection />

{/* Model Selector Dropdown - Only in development */}
<div className="relative flex items-center ml-auto mr-4" ref={dropdownRef}>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I love all the red. My only Q is whether this is changing the functionality without process.env.ALPHA being checked?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

saved it :) nice catch

<div
className="flex items-center cursor-pointer"
onClick={() => setIsModelMenuOpen(!isModelMenuOpen)}
>
<span>{(currentModel?.alias ?? currentModel?.name) || 'Select Model'}</span>
{isModelMenuOpen ? (
<ChevronDown className="w-4 h-4 ml-1" />
) : (
<ChevronUp className="w-4 h-4 ml-1" />
)}
</div>
{/* Model Selector Dropdown */}
{process.env.ALPHA ? (
<ModelsBottomBar dropdownRef={dropdownRef} setView={setView} />
) : (
<div className="relative flex items-center ml-auto mr-4" ref={dropdownRef}>
<div
className="flex items-center cursor-pointer"
onClick={() => setIsModelMenuOpen(!isModelMenuOpen)}
>
<span>{(currentModel?.alias ?? currentModel?.name) || 'Select Model'}</span>
{isModelMenuOpen ? (
<ChevronDown className="w-4 h-4 ml-1" />
) : (
<ChevronUp className="w-4 h-4 ml-1" />
)}
</div>

{/* Dropdown Menu */}
{isModelMenuOpen && (
<div className="absolute bottom-[24px] right-0 w-[300px] bg-bgApp rounded-lg border border-borderSubtle">
<div className="">
<ModelRadioList
className="divide-y divide-borderSubtle"
renderItem={({ model, isSelected, onSelect }) => (
<label key={model.alias ?? model.name} className="block cursor-pointer">
<div
className="flex items-center justify-between p-2 text-textStandard hover:bg-bgSubtle transition-colors"
onClick={onSelect}
>
<div>
<p className="text-sm ">{model.alias ?? model.name}</p>
<p className="text-xs text-textSubtle">{model.subtext ?? model.provider}</p>
</div>
<div className="relative">
<input
type="radio"
name="recentModels"
value={model.name}
checked={isSelected}
onChange={onSelect}
className="peer sr-only"
/>
<div
className="h-4 w-4 rounded-full border border-gray-400 dark:border-gray-500
{/* Dropdown Menu */}
{isModelMenuOpen && (
<div className="absolute bottom-[24px] right-0 w-[300px] bg-bgApp rounded-lg border border-borderSubtle">
<div className="">
<ModelRadioList
className="divide-y divide-borderSubtle"
renderItem={({ model, isSelected, onSelect }) => (
<label key={model.alias ?? model.name} className="block cursor-pointer">
<div
className="flex items-center justify-between p-2 text-textStandard hover:bg-bgSubtle transition-colors"
onClick={onSelect}
>
<div>
<p className="text-sm ">{model.alias ?? model.name}</p>
<p className="text-xs text-textSubtle">
{model.subtext ?? model.provider}
</p>
</div>
<div className="relative">
<input
type="radio"
name="recentModels"
value={model.name}
checked={isSelected}
onChange={onSelect}
className="peer sr-only"
/>
<div
className="h-4 w-4 rounded-full border border-gray-400 dark:border-gray-500
peer-checked:border-[6px] peer-checked:border-black dark:peer-checked:border-white
peer-checked:bg-white dark:peer-checked:bg-black
transition-all duration-200 ease-in-out"
></div>
></div>
</div>
</div>
</div>
</label>
)}
/>
<div
className="flex items-center justify-between text-textStandard p-2 cursor-pointer hover:bg-bgStandard
</label>
)}
/>
<div
className="flex items-center justify-between text-textStandard p-2 cursor-pointer hover:bg-bgStandard
border-t border-borderSubtle mt-2"
onClick={() => {
setIsModelMenuOpen(false);
setView('settings');
}}
>
<span className="text-sm">Tools and Settings</span>
<Sliders className="w-5 h-5 ml-2 rotate-90" />
onClick={() => {
setIsModelMenuOpen(false);
setView('settings');
}}
>
<span className="text-sm">Tools and Settings</span>
<Sliders className="w-5 h-5 ml-2 rotate-90" />
</div>
</div>
</div>
</div>
)}
</div>
)}
</div>
)}
</div>
);
}
81 changes: 2 additions & 79 deletions ui/desktop/src/components/settings_v2/SettingsView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,8 @@ import { ScrollArea } from '../ui/scroll-area';
import BackButton from '../ui/BackButton';
import type { View } from '../../App';
import { useConfig } from '../ConfigContext';
import { Button } from '../ui/button';
import { Plus, Sliders } from 'lucide-react';
import ExtensionsSection from './extensions/ExtensionsSection';
import { AddModelButton } from './models/AddModelButton';

interface ModelOption {
id: string;
name: string;
description: string;
selected: boolean;
}

// Mock data - replace with actual data source
const defaultModelOptions: ModelOption[] = [
{
id: 'gpt-4',
name: 'GPT-4',
description: 'Most capable model, best for complex tasks',
selected: true,
},
{
id: 'gpt-3.5',
name: 'GPT-3.5',
description: 'Fast and efficient for most tasks',
selected: false,
},
];
import ModelsSection from './models/ModelsSection';

export type SettingsViewOptions = {
extensionId?: string;
Expand All @@ -45,21 +20,10 @@ export default function SettingsView({
setView: (view: View) => void;
viewOptions: SettingsViewOptions;
}) {
const [modelOptions, setModelOptions] = React.useState<ModelOption[]>(defaultModelOptions);

const { config } = useConfig();

console.log(config);

const handleModelSelect = (selectedId: string) => {
setModelOptions(
modelOptions.map((model) => ({
...model,
selected: model.id === selectedId,
}))
);
};

return (
<div className="h-screen w-full">
<div className="relative flex items-center h-[36px] w-full bg-bgSubtle"></div>
Expand All @@ -74,48 +38,7 @@ export default function SettingsView({
<div className="flex-1 pt-[20px]">
<div className="space-y-8">
{/* Models Section */}
<section id="models">
<div className="flex justify-between items-center mb-6 px-8">
<h1 className="text-3xl font-medium text-textStandard">Models</h1>
</div>
<div className="px-8">
<div className="space-y-2">
{modelOptions.map((model, index) => (
<React.Fragment key={model.id}>
<div className="flex items-center justify-between py-3">
<div className="space-y-1">
<h3 className="font-medium text-textStandard">{model.name}</h3>
<p className="text-sm text-textSubtle">{model.description}</p>
</div>
<input
type="radio"
name="model"
checked={model.selected}
onChange={() => handleModelSelect(model.id)}
className="h-4 w-4 text-white accent-[#393838] bg-[#393838] border-[#393838] checked:bg-[#393838] focus:ring-0 focus:ring-offset-0"
/>
</div>
{index < modelOptions.length - 1 && (
<div className="h-px bg-borderSubtle" />
)}
</React.Fragment>
))}
</div>
<div className="flex gap-4 pt-4 w-full">
<AddModelButton />
<Button
className="flex items-center gap-2 flex-1 justify-center text-textSubtle bg-white dark:bg-black hover:bg-subtle dark:border dark:border-gray-500 dark:hover:border-gray-400"
onClick={() => {
setView('ConfigureProviders');
}}
>
<Sliders className="h-4 w-4 rotate-90" />
Configure Providers
</Button>
</div>
</div>
</section>

<ModelsSection setView={setView} />
{/* Extensions Section */}
<ExtensionsSection />
</div>
Expand Down
21 changes: 0 additions & 21 deletions ui/desktop/src/components/settings_v2/models/AddModelButton.tsx

This file was deleted.

Loading
Loading