feat(FN-2241): add review level selection in task creation and editing

- Extend core task types/store and dashboard API route handling to persist task reviewLevel
- Add review level controls to TaskForm, NewTaskModal, and TaskDetailModal flows
- Improve workflow step selector presentation in WorkflowResultsTab and styles for clearer review settings UX
- Document the new review level behavior and add route/form/modal tests to cover create and edit scenarios
This commit is contained in:
Fusion
2026-04-22 09:23:57 -07:00
committed by gsxdsm
parent d6b6bd790a
commit 435fb60c98
13 changed files with 413 additions and 88 deletions

View File

@@ -33,6 +33,7 @@ export function NewTaskModal({ isOpen, onClose, projectId, tasks, onCreateTask,
const [hasDirtyState, setHasDirtyState] = useState(false);
const [selectedWorkflowSteps, setSelectedWorkflowSteps] = useState<string[]>([]);
const [workflowStepsExplicitlySet, setWorkflowStepsExplicitlySet] = useState(false);
const [reviewLevel, setReviewLevel] = useState<number | undefined>(undefined);
// Agent assignment state
const [selectedAgentId, setSelectedAgentId] = useState<string | null>(null);
@@ -142,9 +143,10 @@ export function NewTaskModal({ isOpen, onClose, projectId, tasks, onCreateTask,
planningModel !== "" ||
thinkingLevel !== "" ||
selectedWorkflowSteps.length > 0 ||
selectedAgentId !== null;
selectedAgentId !== null ||
reviewLevel !== undefined;
setHasDirtyState(isDirty);
}, [description, dependencies, pendingImages, executorModel, validatorModel, planningModel, thinkingLevel, selectedWorkflowSteps, selectedAgentId]);
}, [description, dependencies, pendingImages, executorModel, validatorModel, planningModel, thinkingLevel, selectedWorkflowSteps, selectedAgentId, reviewLevel]);
const handleClose = useCallback(() => {
if (hasDirtyState) {
@@ -166,6 +168,7 @@ export function NewTaskModal({ isOpen, onClose, projectId, tasks, onCreateTask,
setWorkflowStepsExplicitlySet(false);
setSelectedAgentId(null);
setShowAgentPicker(false);
setReviewLevel(undefined);
setHasDirtyState(false);
onClose();
}, [hasDirtyState, onClose, pendingImages]);
@@ -197,6 +200,7 @@ export function NewTaskModal({ isOpen, onClose, projectId, tasks, onCreateTask,
planningModelProvider: planningModel && planningSlashIdx !== -1 ? planningModel.slice(0, planningSlashIdx) : undefined,
planningModelId: planningModel && planningSlashIdx !== -1 ? planningModel.slice(planningSlashIdx + 1) : undefined,
thinkingLevel: thinkingLevel !== "" ? thinkingLevel as "minimal" | "low" | "medium" | "high" : undefined,
reviewLevel,
});
// Upload pending images as attachments
@@ -229,6 +233,7 @@ export function NewTaskModal({ isOpen, onClose, projectId, tasks, onCreateTask,
setWorkflowStepsExplicitlySet(false);
setSelectedAgentId(null);
setShowAgentPicker(false);
setReviewLevel(undefined);
addToast(`Created ${task.id}`, "success");
onClose();
@@ -436,6 +441,8 @@ export function NewTaskModal({ isOpen, onClose, projectId, tasks, onCreateTask,
onPlanningModelChange={setPlanningModel}
thinkingLevel={thinkingLevel}
onThinkingLevelChange={setThinkingLevel}
reviewLevel={reviewLevel}
onReviewLevelChange={setReviewLevel}
renderBelowPrimary={quickFields}
hideDependencies={true}
/>