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
16 changes: 15 additions & 1 deletion components/home-page-content.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -83,9 +83,23 @@ export function HomePageContent({
localStorage.removeItem('newly-created-repo')
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []) // Run only on mount

// Check for URL query parameters for owner and repo
useEffect(() => {
const urlOwner = searchParams.get('owner')
const urlRepo = searchParams.get('repo')

if (urlOwner && urlOwner !== selectedOwner) {
setSelectedOwnerState(urlOwner)
setSelectedOwner(urlOwner)
}
if (urlRepo && urlRepo !== selectedRepo) {
setSelectedRepoState(urlRepo)
setSelectedRepo(urlRepo)
}
}, [searchParams, selectedOwner, selectedRepo])

// Wrapper functions to update both state and cookies
const handleOwnerChange = (owner: string) => {
setSelectedOwnerState(owner)
Expand Down
23 changes: 23 additions & 0 deletions components/task-details.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import {
StopCircle,
MoreVertical,
X,
Plus,
} from 'lucide-react'
import { cn } from '@/lib/utils'
import { useState, useEffect, useRef, useCallback } from 'react'
Expand Down Expand Up @@ -64,6 +65,7 @@ import { Drawer, DrawerContent, DrawerHeader, DrawerTitle } from '@/components/u
import { Checkbox } from '@/components/ui/checkbox'
import { Label } from '@/components/ui/label'
import { useRouter } from 'next/navigation'
import Link from 'next/link'
import BrowserbaseIcon from '@/components/icons/browserbase-icon'
import Context7Icon from '@/components/icons/context7-icon'
import ConvexIcon from '@/components/icons/convex-icon'
Expand Down Expand Up @@ -1367,6 +1369,27 @@ export function TaskDetails({ task, maxSandboxDuration = 300 }: TaskDetailsProps
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem
onClick={() => {
// Extract owner and repo from repoUrl
const repoUrl = task.repoUrl || ''
const match = repoUrl.match(/github\.com\/([^/]+)\/([^/]+?)(\.git)?$/)
const owner = match?.[1] || ''
const repo = match?.[2] || ''

// Build the URL with query parameters
const params = new URLSearchParams()
if (owner) params.set('owner', owner)
if (repo) params.set('repo', repo)
if (task.selectedAgent) params.set('agent', task.selectedAgent)
if (task.selectedModel) params.set('model', task.selectedModel)

router.push(`/?${params.toString()}`)
}}
>
<Plus className="h-4 w-4 mr-2" />
New Task
</DropdownMenuItem>
<DropdownMenuItem onClick={() => setShowTryAgainDialog(true)}>
<RotateCcw className="h-4 w-4 mr-2" />
Try Again
Expand Down
51 changes: 37 additions & 14 deletions components/task-form.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import { ConnectorDialog } from '@/components/connectors/manage-connectors'
import { toast } from 'sonner'
import { useAtom } from 'jotai'
import { taskPromptAtom } from '@/lib/atoms/task'
import { useSearchParams } from 'next/navigation'

interface GitHubRepo {
name: string
Expand Down Expand Up @@ -213,24 +214,45 @@ export function TaskForm({
}
}

// Get URL search params
const searchParams = useSearchParams()

// Load saved agent, model, and options on mount, and focus the prompt input
useEffect(() => {
const savedAgent = localStorage.getItem('last-selected-agent')
// Check URL params first
const urlAgent = searchParams?.get('agent')
const urlModel = searchParams?.get('model')

if (
savedAgent &&
CODING_AGENTS.some((agent) => agent.value === savedAgent && !('isDivider' in agent && agent.isDivider))
urlAgent &&
CODING_AGENTS.some((agent) => agent.value === urlAgent && !('isDivider' in agent && agent.isDivider))
) {
setSelectedAgent(savedAgent)

// Load saved model for this agent
const savedModel = localStorage.getItem(`last-selected-model-${savedAgent}`)
const agentModels = AGENT_MODELS[savedAgent as keyof typeof AGENT_MODELS]
if (savedModel && agentModels?.some((model) => model.value === savedModel)) {
setSelectedModel(savedModel)
} else {
const defaultModel = DEFAULT_MODELS[savedAgent as keyof typeof DEFAULT_MODELS]
if (defaultModel) {
setSelectedModel(defaultModel)
setSelectedAgent(urlAgent)
if (urlModel) {
const agentModels = AGENT_MODELS[urlAgent as keyof typeof AGENT_MODELS]
if (agentModels?.some((model) => model.value === urlModel)) {
setSelectedModel(urlModel)
}
}
} else {
// Fall back to localStorage
const savedAgent = localStorage.getItem('last-selected-agent')
if (
savedAgent &&
CODING_AGENTS.some((agent) => agent.value === savedAgent && !('isDivider' in agent && agent.isDivider))
) {
setSelectedAgent(savedAgent)

// Load saved model for this agent
const savedModel = localStorage.getItem(`last-selected-model-${savedAgent}`)
const agentModels = AGENT_MODELS[savedAgent as keyof typeof AGENT_MODELS]
if (savedModel && agentModels?.some((model) => model.value === savedModel)) {
setSelectedModel(savedModel)
} else {
const defaultModel = DEFAULT_MODELS[savedAgent as keyof typeof DEFAULT_MODELS]
if (defaultModel) {
setSelectedModel(defaultModel)
}
}
}
}
Expand All @@ -241,6 +263,7 @@ export function TaskForm({
if (textareaRef.current) {
textareaRef.current.focus()
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])

// Update model when agent changes
Expand Down
Loading