From f26cecc4ee931ed3a370b029590312983de63add Mon Sep 17 00:00:00 2001 From: Charles Vien Date: Fri, 20 Mar 2026 16:18:28 -0700 Subject: [PATCH] Add initial task mode setting --- .../features/sessions/service/service.ts | 13 +++++-- .../components/sections/GeneralSettings.tsx | 34 +++++++++++++++++++ .../features/settings/stores/settingsStore.ts | 14 ++++++++ .../task-detail/components/TaskInput.tsx | 6 +++- .../task-detail/hooks/useTaskCreation.ts | 5 +++ 5 files changed, 68 insertions(+), 4 deletions(-) diff --git a/apps/code/src/renderer/features/sessions/service/service.ts b/apps/code/src/renderer/features/sessions/service/service.ts index 5303baaec..5962c8d38 100644 --- a/apps/code/src/renderer/features/sessions/service/service.ts +++ b/apps/code/src/renderer/features/sessions/service/service.ts @@ -660,8 +660,15 @@ export class SessionService { sessionStoreSetters.setSession(session); try { - const { customInstructions: previewCustomInstructions } = - useSettingsStore.getState(); + const { + customInstructions: previewCustomInstructions, + defaultInitialTaskMode, + lastUsedInitialTaskMode, + } = useSettingsStore.getState(); + const initialMode = + defaultInitialTaskMode === "last_used" + ? lastUsedInitialTaskMode + : "plan"; const result = await trpcClient.agent.start.mutate({ taskId: PREVIEW_TASK_ID, taskRunId, @@ -670,7 +677,7 @@ export class SessionService { apiHost: auth.apiHost, projectId: auth.projectId, adapter: params.adapter, - permissionMode: "plan", + permissionMode: initialMode, customInstructions: previewCustomInstructions || undefined, }); diff --git a/apps/code/src/renderer/features/settings/components/sections/GeneralSettings.tsx b/apps/code/src/renderer/features/settings/components/sections/GeneralSettings.tsx index 572b019dc..f08d9ec2c 100644 --- a/apps/code/src/renderer/features/settings/components/sections/GeneralSettings.tsx +++ b/apps/code/src/renderer/features/settings/components/sections/GeneralSettings.tsx @@ -3,6 +3,7 @@ import { SettingRow } from "@features/settings/components/SettingRow"; import { type AutoConvertLongText, type CompletionSound, + type DefaultInitialTaskMode, type DiffOpenMode, type SendMessagesWith, useSettingsStore, @@ -101,6 +102,7 @@ export function GeneralSettings() { completionSound, completionVolume, autoConvertLongText, + defaultInitialTaskMode, diffOpenMode, sendMessagesWith, hedgehogMode, @@ -110,6 +112,7 @@ export function GeneralSettings() { setCompletionSound, setCompletionVolume, setAutoConvertLongText, + setDefaultInitialTaskMode, setDiffOpenMode, setSendMessagesWith, setHedgehogMode, @@ -315,6 +318,18 @@ export function GeneralSettings() { [diffOpenMode, setDiffOpenMode], ); + const handleDefaultInitialTaskModeChange = useCallback( + (value: DefaultInitialTaskMode) => { + track(ANALYTICS_EVENTS.SETTING_CHANGED, { + setting_name: "default_initial_task_mode", + new_value: value, + old_value: defaultInitialTaskMode, + }); + setDefaultInitialTaskMode(value); + }, + [defaultInitialTaskMode, setDefaultInitialTaskMode], + ); + const handleSendMessagesWithChange = useCallback( (value: SendMessagesWith) => { track(ANALYTICS_EVENTS.SETTING_CHANGED, { @@ -522,6 +537,25 @@ export function GeneralSettings() { Input + + + handleDefaultInitialTaskModeChange(value as DefaultInitialTaskMode) + } + size="1" + > + + + Plan + Last used + + + + void; setDebugLogsCloudRuns: (enabled: boolean) => void; setCustomInstructions: (instructions: string) => void; + setDefaultInitialTaskMode: (mode: DefaultInitialTaskMode) => void; + setLastUsedInitialTaskMode: (mode: ExecutionMode) => void; setDiffOpenMode: (mode: DiffOpenMode) => void; setHedgehogMode: (enabled: boolean) => void; setMcpAppsDisabledServers: (servers: string[]) => void; @@ -95,6 +101,8 @@ export const useSettingsStore = create()( preventSleepWhileRunning: false, debugLogsCloudRuns: false, customInstructions: "", + defaultInitialTaskMode: "plan", + lastUsedInitialTaskMode: "plan", diffOpenMode: "auto", hedgehogMode: false, mcpAppsDisabledServers: [], @@ -163,6 +171,10 @@ export const useSettingsStore = create()( setDebugLogsCloudRuns: (enabled) => set({ debugLogsCloudRuns: enabled }), setCustomInstructions: (instructions) => set({ customInstructions: instructions }), + setDefaultInitialTaskMode: (mode) => + set({ defaultInitialTaskMode: mode }), + setLastUsedInitialTaskMode: (mode) => + set({ lastUsedInitialTaskMode: mode }), setDiffOpenMode: (mode) => set({ diffOpenMode: mode }), setHedgehogMode: (enabled) => set({ hedgehogMode: enabled }), setMcpAppsDisabledServers: (servers) => @@ -191,6 +203,8 @@ export const useSettingsStore = create()( preventSleepWhileRunning: state.preventSleepWhileRunning, debugLogsCloudRuns: state.debugLogsCloudRuns, customInstructions: state.customInstructions, + defaultInitialTaskMode: state.defaultInitialTaskMode, + lastUsedInitialTaskMode: state.lastUsedInitialTaskMode, diffOpenMode: state.diffOpenMode, hedgehogMode: state.hedgehogMode, hints: state.hints, 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 87353c4ff..fa443d497 100644 --- a/apps/code/src/renderer/features/task-detail/components/TaskInput.tsx +++ b/apps/code/src/renderer/features/task-detail/components/TaskInput.tsx @@ -47,6 +47,8 @@ export function TaskInput() { allowBypassPermissions, setLastUsedEnvironment, getLastUsedEnvironment, + defaultInitialTaskMode, + lastUsedInitialTaskMode, } = useSettingsStore(); const editorRef = useRef(null); @@ -137,9 +139,11 @@ export function TaskInput() { // Get current values from preview session config options for task creation. // Defaults ensure values are always passed even before the preview session loads. const currentModel = modelOption?.currentValue; + const modeFallback = + defaultInitialTaskMode === "last_used" ? lastUsedInitialTaskMode : "plan"; const currentExecutionMode = getCurrentModeFromConfigOptions(modeOption ? [modeOption] : undefined) ?? - "plan"; + modeFallback; const currentReasoningLevel = thoughtOption?.currentValue; const branchForTaskCreation = 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 887612e98..bd214838a 100644 --- a/apps/code/src/renderer/features/task-detail/hooks/useTaskCreation.ts +++ b/apps/code/src/renderer/features/task-detail/hooks/useTaskCreation.ts @@ -4,6 +4,7 @@ import { contentToXml, extractFilePaths, } from "@features/message-editor/utils/content"; +import { useSettingsStore } from "@features/settings/stores/settingsStore"; import { useCreateTask } from "@features/tasks/hooks/useTasks"; import { useConnectivity } from "@hooks/useConnectivity"; import type { WorkspaceMode } from "@main/services/workspace/schemas"; @@ -135,6 +136,10 @@ export function useTaskCreation({ environmentId, }); + if (executionMode) { + useSettingsStore.getState().setLastUsedInitialTaskMode(executionMode); + } + const taskService = get(RENDERER_TOKENS.TaskService); const result = await taskService.createTask(input, (output) => { invalidateTasks(output.task);