{
const target = allFolders.find((f) => f.id === folderId)
if (!target) return
const isOpen = folders.some((f) => f.id === folderId)
try {
const detail = isOpen
? target
: await addFolderToWorkspaceById(folderId)
setTabFolder(ownTab.id, detail.id, detail.path)
toast.success(t("toasts.folderChanged", { name: detail.name }))
} catch (err) {
console.error(
"[ConversationContextBar] switch folder failed:",
err
)
toast.error(t("toasts.openFolderFailed"))
}
}}
labelEmpty={t("noFolders")}
labelSearch={t("searchFolder")}
/>
{
const taskId = `checkout-${ownFolder.id}-${Date.now()}`
addTask(taskId, tBd("tasks.checkoutTo", { branchName }))
updateTask(taskId, { status: "running" })
try {
await gitCheckout(ownFolder.path, branchName)
setBranch(ownFolder.id, branchName)
await refreshFolder(ownFolder.id)
updateTask(taskId, { status: "completed" })
} catch (err) {
const msg = err instanceof Error ? err.message : String(err)
updateTask(taskId, { status: "failed", error: msg })
toast.error(msg)
}
}}
/>
)
})
ConversationContextBar.displayName = "ConversationContextBar"
// ============================================================================
// FolderPicker
// ============================================================================
interface FolderPickerProps {
folders: { id: number; name: string; path: string }[]
currentFolderId: number
currentFolderName: string
editable: boolean
onSelect: (folderId: number) => void | Promise