diff --git a/src/components/agent-selector.tsx b/src/components/agent-selector.tsx index 5ff794f6..147bc7e2 100644 --- a/src/components/agent-selector.tsx +++ b/src/components/agent-selector.tsx @@ -40,6 +40,14 @@ export default function AgentSelector(props: AgentSelectorProps) { return filtered }) + createEffect(() => { + const list = availableAgents() + if (list.length === 0) return + if (!list.some((agent) => agent.name === props.currentAgent)) { + void props.onAgentChange(list[0].name) + } + }) + createEffect(() => { if (instanceAgents().length === 0) { fetchAgents(props.instanceId).catch(console.error) diff --git a/src/components/folder-selection-view.tsx b/src/components/folder-selection-view.tsx index 91486e73..49712284 100644 --- a/src/components/folder-selection-view.tsx +++ b/src/components/folder-selection-view.tsx @@ -3,6 +3,7 @@ import { Folder, Clock, Trash2, FolderPlus, Settings, ChevronDown, ChevronUp } f import { recentFolders, removeRecentFolder, preferences, updateLastUsedBinary } from "../stores/preferences" import OpenCodeBinarySelector from "./opencode-binary-selector" import EnvironmentVariablesEditor from "./environment-variables-editor" +import Kbd from "./kbd" interface FolderSelectionViewProps { onSelectFolder: (folder?: string, binaryPath?: string) => void @@ -14,35 +15,38 @@ const FolderSelectionView: Component = (props) => { const [focusMode, setFocusMode] = createSignal<"recent" | "new" | null>("recent") const [showAdvanced, setShowAdvanced] = createSignal(false) const [selectedBinary, setSelectedBinary] = createSignal(preferences().lastUsedBinary || "opencode") - + let recentListRef: HTMLDivElement | undefined + const folders = () => recentFolders() - + // Update selected binary when preferences change createEffect(() => { - const lastUsed = preferences().lastUsedBinary - if (lastUsed && lastUsed !== selectedBinary()) { - setSelectedBinary(lastUsed) - } - }) - + const lastUsed = preferences().lastUsedBinary + if (lastUsed && lastUsed !== selectedBinary()) { + setSelectedBinary(lastUsed) + } + }) + function scrollToIndex(index: number) { - const element = document.querySelector(`[data-folder-index="${index}"]`) + const element = recentListRef?.querySelector(`[data-folder-index="${index}"]`) if (element) { element.scrollIntoView({ block: "nearest", behavior: "auto" }) } } + function handleKeyDown(e: KeyboardEvent) { const folderList = folders() - - if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) { + + if ((e.metaKey || e.ctrlKey) && !e.shiftKey && e.key.toLowerCase() === "n") { e.preventDefault() handleBrowse() return } - + if (folderList.length === 0) return + if (e.key === "ArrowDown") { e.preventDefault() const newIndex = Math.min(selectedIndex() + 1, folderList.length - 1) @@ -154,21 +158,22 @@ const FolderSelectionView: Component = (props) => { } return ( -
-
-
-
+
+
+
+

Welcome to OpenCode

Select a folder to start coding with AI

+ +
-
0} fallback={ -
+
@@ -177,22 +182,27 @@ const FolderSelectionView: Component = (props) => {
} > -
-
-

Recent Folders

-

- {folders().length} {folders().length === 1 ? "folder" : "folders"} available -

-
-
- - {(folder, index) => ( -
+
+
+

Recent Folders

+

+ {folders().length} {folders().length === 1 ? "folder" : "folders"} available +

+
+
(recentListRef = el)} + > + + {(folder, index) => ( +
+
-
+

Browse for Folder

Select any folder on your computer

@@ -254,9 +264,7 @@ const FolderSelectionView: Component = (props) => { {props.isLoading ? "Opening..." : "Browse Folders"}
- - Cmd+Enter - +
@@ -297,7 +305,7 @@ const FolderSelectionView: Component = (props) => {
-