Skip to content

Commit f54e16c

Browse files
committed
feat: persist task dialog model selections
1 parent b9542ae commit f54e16c

File tree

3 files changed

+86
-8
lines changed

3 files changed

+86
-8
lines changed

frontend/src/components/console/project/start-develop-task-dialog.tsx

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { useState, useEffect, useMemo, useRef } from "react"
1616
import { useNavigate } from "react-router-dom"
1717
import { toast } from "sonner"
1818
import { TaskConcurrentLimitDialog } from "@/components/console/task/task-concurrent-limit-dialog"
19+
import { readStoredTaskDialogParams, writeStoredTaskDialogParams } from "@/components/console/task/task-dialog-params-storage"
1920

2021
interface StartDevelopTaskDialogProps {
2122
open: boolean
@@ -111,8 +112,15 @@ export default function StartDevelopTaskDialog({
111112
const justOpened = !prevOpenRef.current
112113
prevOpenRef.current = true
113114
if (justOpened) {
115+
const storedParams = readStoredTaskDialogParams()
114116
setUserMessage('')
115-
setSelectedModelId(selectPreferredTaskModel(models, subscription))
117+
setSelectedModelId(
118+
storedParams.modelId
119+
&& models.some((model) => model.id === storedParams.modelId)
120+
&& canUseModelBySubscription(models.find((model) => model.id === storedParams.modelId), subscription)
121+
? storedParams.modelId
122+
: selectPreferredTaskModel(models, subscription)
123+
)
116124
setSelectedBranch('main')
117125
}
118126
fetchBranches()
@@ -155,6 +163,12 @@ export default function StartDevelopTaskDialog({
155163
return
156164
}
157165

166+
const storedParams = readStoredTaskDialogParams()
167+
writeStoredTaskDialogParams({
168+
...storedParams,
169+
modelId: selectedModelId,
170+
})
171+
158172
setSubmitting(true)
159173

160174
// 创建任务
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
const TASK_PARAM_STORAGE_KEY = "task_input_dialog_params";
2+
3+
export interface StoredTaskDialogParams {
4+
modelId?: string;
5+
hostId?: string;
6+
imageId?: string;
7+
}
8+
9+
export function readStoredTaskDialogParams(): StoredTaskDialogParams {
10+
try {
11+
const raw = window.localStorage.getItem(TASK_PARAM_STORAGE_KEY);
12+
if (!raw) {
13+
return {};
14+
}
15+
16+
const parsed = JSON.parse(raw) as StoredTaskDialogParams;
17+
return {
18+
modelId: typeof parsed.modelId === "string" ? parsed.modelId : undefined,
19+
hostId: typeof parsed.hostId === "string" ? parsed.hostId : undefined,
20+
imageId: typeof parsed.imageId === "string" ? parsed.imageId : undefined,
21+
};
22+
} catch {
23+
return {};
24+
}
25+
}
26+
27+
export function writeStoredTaskDialogParams(params: StoredTaskDialogParams) {
28+
try {
29+
window.localStorage.setItem(TASK_PARAM_STORAGE_KEY, JSON.stringify(params));
30+
} catch {
31+
// ignore storage write failures
32+
}
33+
}

frontend/src/components/console/task/task-input.tsx

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip
3030
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
3131
import { Empty, EmptyDescription, EmptyHeader, EmptyMedia } from "@/components/ui/empty";
3232
import { defaultSkills } from "@/utils/config";
33+
import { readStoredTaskDialogParams, writeStoredTaskDialogParams } from "./task-dialog-params-storage";
3334

3435

3536
interface SkillItemProps {
@@ -210,16 +211,39 @@ export function TaskInput({ repos, onTaskCreated }: TaskInputProps) {
210211
};
211212

212213
const setDefaultConfig = () => {
213-
setSelectedModelId(selectPreferredTaskModel(models, subscription))
214-
setSelectedHostId(selectHost(hosts, true))
214+
const storedParams = readStoredTaskDialogParams();
215+
const defaultModelId = selectPreferredTaskModel(models, subscription);
216+
const nextModelId = (
217+
storedParams.modelId
218+
&& models.some((model) => model.id === storedParams.modelId)
219+
&& canUseModelBySubscription(models.find((model) => model.id === storedParams.modelId), subscription)
220+
)
221+
? storedParams.modelId
222+
: defaultModelId;
223+
224+
setSelectedModelId(nextModelId);
215225

216226
if (user.role === ConstsUserRole.UserRoleSubAccount) {
217-
setSelectedHostId(selectHost(hosts, true))
218-
setSelectedImageId(selectImage(images, true));
219-
} else {
220-
setSelectedHostId(selectHost(hosts, false))
221-
setSelectedImageId(selectImage(images, false));
227+
const nextHostId = (
228+
storedParams.hostId === "public_host"
229+
|| hosts.some((host) => host.id === storedParams.hostId && host.status === ConstsHostStatus.HostStatusOnline)
230+
)
231+
? (storedParams.hostId || "public_host")
232+
: selectHost(hosts, true);
233+
const nextImageId = (
234+
storedParams.imageId
235+
&& images.some((image) => image.id === storedParams.imageId)
236+
)
237+
? storedParams.imageId
238+
: selectImage(images, true);
239+
240+
setSelectedHostId(nextHostId);
241+
setSelectedImageId(nextImageId);
242+
return;
222243
}
244+
245+
setSelectedHostId(selectHost(hosts, false));
246+
setSelectedImageId(selectImage(images, false));
223247
};
224248

225249
const adaptedModelForTool = (): boolean => {
@@ -265,6 +289,13 @@ export function TaskInput({ repos, onTaskCreated }: TaskInputProps) {
265289
return;
266290
}
267291

292+
const storedParams = readStoredTaskDialogParams();
293+
writeStoredTaskDialogParams({
294+
modelId: selectedModelId,
295+
hostId: user.role === ConstsUserRole.UserRoleSubAccount ? selectedHostId : storedParams.hostId,
296+
imageId: user.role === ConstsUserRole.UserRoleSubAccount ? selectedImageId : storedParams.imageId,
297+
});
298+
268299
executeTask();
269300
};
270301

0 commit comments

Comments
 (0)