diff --git a/apps/code/src/renderer/features/command-center/components/CommandCenterPanel.tsx b/apps/code/src/renderer/features/command-center/components/CommandCenterPanel.tsx index 41c5046d4..9206b47b1 100644 --- a/apps/code/src/renderer/features/command-center/components/CommandCenterPanel.tsx +++ b/apps/code/src/renderer/features/command-center/components/CommandCenterPanel.tsx @@ -1,3 +1,4 @@ +import { TaskInput } from "@features/task-detail/components/TaskInput"; import { ArrowsOut, Plus, X } from "@phosphor-icons/react"; import { Flex, Text } from "@radix-ui/themes"; import type { Task } from "@shared/types"; @@ -16,6 +17,48 @@ interface CommandCenterPanelProps { function EmptyCell({ cellIndex }: { cellIndex: number }) { const [selectorOpen, setSelectorOpen] = useState(false); + const [isCreating, setIsCreating] = useState(false); + const assignTask = useCommandCenterStore((s) => s.assignTask); + + const handleTaskCreated = useCallback( + (task: Task) => { + assignTask(cellIndex, task.id); + }, + [assignTask, cellIndex], + ); + + if (isCreating) { + return ( + + + + New task + + + + + + + + ); + } return ( @@ -24,6 +67,7 @@ function EmptyCell({ cellIndex }: { cellIndex: number }) { cellIndex={cellIndex} open={selectorOpen} onOpenChange={setSelectorOpen} + onNewTask={() => setIsCreating(true)} > - {availableTasks.length > 0 && ( - <> - - {availableTasks.map((task) => ( - - ))} - + + +
+ {availableTasks.length === 0 ? ( +
+ No available tasks +
+ ) : ( + availableTasks.map((task) => ( + + )) )}
diff --git a/apps/code/src/renderer/features/task-detail/components/TaskInput.tsx b/apps/code/src/renderer/features/task-detail/components/TaskInput.tsx index 8ae765df9..c43bda422 100644 --- a/apps/code/src/renderer/features/task-detail/components/TaskInput.tsx +++ b/apps/code/src/renderer/features/task-detail/components/TaskInput.tsx @@ -33,7 +33,11 @@ import { type WorkspaceMode, WorkspaceModeSelect } from "./WorkspaceModeSelect"; const DOT_FILL = "var(--gray-6)"; -export function TaskInput() { +interface TaskInputProps { + onTaskCreated?: (task: import("@shared/types").Task) => void; +} + +export function TaskInput({ onTaskCreated }: TaskInputProps = {}) { const { cloudRegion } = useAuthStore(); const trpcReact = useTRPC(); const { view } = useNavigationStore(); @@ -172,6 +176,7 @@ export function TaskInput() { executionMode: currentExecutionMode, model: currentModel, reasoningLevel: currentReasoningLevel, + onTaskCreated, environmentId: selectedEnvironment, sandboxEnvironmentId: effectiveWorkspaceMode === "cloud" && selectedCloudEnvId diff --git a/apps/code/src/renderer/features/task-detail/hooks/useTaskCreation.ts b/apps/code/src/renderer/features/task-detail/hooks/useTaskCreation.ts index 3e3a39979..62c769a15 100644 --- a/apps/code/src/renderer/features/task-detail/hooks/useTaskCreation.ts +++ b/apps/code/src/renderer/features/task-detail/hooks/useTaskCreation.ts @@ -12,7 +12,7 @@ import type { WorkspaceMode } from "@main/services/workspace/schemas"; import { get } from "@renderer/di/container"; import { RENDERER_TOKENS } from "@renderer/di/tokens"; import { toast } from "@renderer/utils/toast"; -import type { ExecutionMode } from "@shared/types"; +import type { ExecutionMode, Task } from "@shared/types"; import { useNavigationStore } from "@stores/navigationStore"; import { logger } from "@utils/logger"; import { useCallback, useState } from "react"; @@ -34,6 +34,7 @@ interface UseTaskCreationOptions { reasoningLevel?: string; environmentId?: string | null; sandboxEnvironmentId?: string; + onTaskCreated?: (task: Task) => void; } interface UseTaskCreationReturn { @@ -100,6 +101,7 @@ export function useTaskCreation({ reasoningLevel, environmentId, sandboxEnvironmentId, + onTaskCreated, }: UseTaskCreationOptions): UseTaskCreationReturn { const [isCreatingTask, setIsCreatingTask] = useState(false); const { navigateToTask } = useNavigationStore(); @@ -154,7 +156,11 @@ export function useTaskCreation({ const taskService = get(RENDERER_TOKENS.TaskService); const result = await taskService.createTask(input, (output) => { invalidateTasks(output.task); - navigateToTask(output.task); + if (onTaskCreated) { + onTaskCreated(output.task); + } else { + navigateToTask(output.task); + } editor.clear(); log.info("Task ready, navigated early", { taskId: output.task.id }); }); @@ -191,6 +197,7 @@ export function useTaskCreation({ sandboxEnvironmentId, invalidateTasks, navigateToTask, + onTaskCreated, ]); return {