Skip to content

Commit 6978494

Browse files
authored
feat: Add initial task mode setting (#1313)
## Problem New tasks always revert to Plan mode, forcing users who prefer other modes to switch every time. ## Changes 1. Add defaultInitialTaskMode setting with "Plan" (default) and "Last used" options 2. Track last-used execution mode when creating tasks via lastUsedInitialTaskMode 3. Use persisted mode for preview session initialization and TaskInput fallback ## How did you test this? Manually
1 parent 091398a commit 6978494

5 files changed

Lines changed: 68 additions & 4 deletions

File tree

apps/code/src/renderer/features/sessions/service/service.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -660,8 +660,15 @@ export class SessionService {
660660
sessionStoreSetters.setSession(session);
661661

662662
try {
663-
const { customInstructions: previewCustomInstructions } =
664-
useSettingsStore.getState();
663+
const {
664+
customInstructions: previewCustomInstructions,
665+
defaultInitialTaskMode,
666+
lastUsedInitialTaskMode,
667+
} = useSettingsStore.getState();
668+
const initialMode =
669+
defaultInitialTaskMode === "last_used"
670+
? lastUsedInitialTaskMode
671+
: "plan";
665672
const result = await trpcClient.agent.start.mutate({
666673
taskId: PREVIEW_TASK_ID,
667674
taskRunId,
@@ -670,7 +677,7 @@ export class SessionService {
670677
apiHost: auth.apiHost,
671678
projectId: auth.projectId,
672679
adapter: params.adapter,
673-
permissionMode: "plan",
680+
permissionMode: initialMode,
674681
customInstructions: previewCustomInstructions || undefined,
675682
});
676683

apps/code/src/renderer/features/settings/components/sections/GeneralSettings.tsx

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { SettingRow } from "@features/settings/components/SettingRow";
33
import {
44
type AutoConvertLongText,
55
type CompletionSound,
6+
type DefaultInitialTaskMode,
67
type DiffOpenMode,
78
type SendMessagesWith,
89
useSettingsStore,
@@ -101,6 +102,7 @@ export function GeneralSettings() {
101102
completionSound,
102103
completionVolume,
103104
autoConvertLongText,
105+
defaultInitialTaskMode,
104106
diffOpenMode,
105107
sendMessagesWith,
106108
hedgehogMode,
@@ -110,6 +112,7 @@ export function GeneralSettings() {
110112
setCompletionSound,
111113
setCompletionVolume,
112114
setAutoConvertLongText,
115+
setDefaultInitialTaskMode,
113116
setDiffOpenMode,
114117
setSendMessagesWith,
115118
setHedgehogMode,
@@ -315,6 +318,18 @@ export function GeneralSettings() {
315318
[diffOpenMode, setDiffOpenMode],
316319
);
317320

321+
const handleDefaultInitialTaskModeChange = useCallback(
322+
(value: DefaultInitialTaskMode) => {
323+
track(ANALYTICS_EVENTS.SETTING_CHANGED, {
324+
setting_name: "default_initial_task_mode",
325+
new_value: value,
326+
old_value: defaultInitialTaskMode,
327+
});
328+
setDefaultInitialTaskMode(value);
329+
},
330+
[defaultInitialTaskMode, setDefaultInitialTaskMode],
331+
);
332+
318333
const handleSendMessagesWithChange = useCallback(
319334
(value: SendMessagesWith) => {
320335
track(ANALYTICS_EVENTS.SETTING_CHANGED, {
@@ -522,6 +537,25 @@ export function GeneralSettings() {
522537
Input
523538
</Text>
524539

540+
<SettingRow
541+
label="Initial task mode"
542+
description="Choose whether new tasks always start in Plan mode or remember your last-used mode"
543+
>
544+
<Select.Root
545+
value={defaultInitialTaskMode}
546+
onValueChange={(value) =>
547+
handleDefaultInitialTaskModeChange(value as DefaultInitialTaskMode)
548+
}
549+
size="1"
550+
>
551+
<Select.Trigger style={{ minWidth: "100px" }} />
552+
<Select.Content>
553+
<Select.Item value="plan">Plan</Select.Item>
554+
<Select.Item value="last_used">Last used</Select.Item>
555+
</Select.Content>
556+
</Select.Root>
557+
</SettingRow>
558+
525559
<SettingRow
526560
label="Send messages with"
527561
description="Choose which key combination sends messages. Use Shift+Enter for new lines"

apps/code/src/renderer/features/settings/stores/settingsStore.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { WorkspaceMode } from "@main/services/workspace/schemas";
2+
import type { ExecutionMode } from "@shared/types";
23
import { electronStorage } from "@utils/electronStorage";
34
import { create } from "zustand";
45
import { persist } from "zustand/middleware";
@@ -9,6 +10,7 @@ export type SendMessagesWith = "enter" | "cmd+enter";
910
export type CompletionSound = "none" | "guitar" | "danilo" | "revi" | "meep";
1011
export type AgentAdapter = "claude" | "codex";
1112
export type AutoConvertLongText = "off" | "1000" | "2500" | "5000" | "10000";
13+
export type DefaultInitialTaskMode = "plan" | "last_used";
1214

1315
export interface HintState {
1416
count: number;
@@ -36,6 +38,8 @@ interface SettingsStore {
3638
preventSleepWhileRunning: boolean;
3739
debugLogsCloudRuns: boolean;
3840
customInstructions: string;
41+
defaultInitialTaskMode: DefaultInitialTaskMode;
42+
lastUsedInitialTaskMode: ExecutionMode;
3943
diffOpenMode: DiffOpenMode;
4044
hedgehogMode: boolean;
4145
mcpAppsDisabledServers: string[];
@@ -68,6 +72,8 @@ interface SettingsStore {
6872
setPreventSleepWhileRunning: (enabled: boolean) => void;
6973
setDebugLogsCloudRuns: (enabled: boolean) => void;
7074
setCustomInstructions: (instructions: string) => void;
75+
setDefaultInitialTaskMode: (mode: DefaultInitialTaskMode) => void;
76+
setLastUsedInitialTaskMode: (mode: ExecutionMode) => void;
7177
setDiffOpenMode: (mode: DiffOpenMode) => void;
7278
setHedgehogMode: (enabled: boolean) => void;
7379
setMcpAppsDisabledServers: (servers: string[]) => void;
@@ -95,6 +101,8 @@ export const useSettingsStore = create<SettingsStore>()(
95101
preventSleepWhileRunning: false,
96102
debugLogsCloudRuns: false,
97103
customInstructions: "",
104+
defaultInitialTaskMode: "plan",
105+
lastUsedInitialTaskMode: "plan",
98106
diffOpenMode: "auto",
99107
hedgehogMode: false,
100108
mcpAppsDisabledServers: [],
@@ -163,6 +171,10 @@ export const useSettingsStore = create<SettingsStore>()(
163171
setDebugLogsCloudRuns: (enabled) => set({ debugLogsCloudRuns: enabled }),
164172
setCustomInstructions: (instructions) =>
165173
set({ customInstructions: instructions }),
174+
setDefaultInitialTaskMode: (mode) =>
175+
set({ defaultInitialTaskMode: mode }),
176+
setLastUsedInitialTaskMode: (mode) =>
177+
set({ lastUsedInitialTaskMode: mode }),
166178
setDiffOpenMode: (mode) => set({ diffOpenMode: mode }),
167179
setHedgehogMode: (enabled) => set({ hedgehogMode: enabled }),
168180
setMcpAppsDisabledServers: (servers) =>
@@ -191,6 +203,8 @@ export const useSettingsStore = create<SettingsStore>()(
191203
preventSleepWhileRunning: state.preventSleepWhileRunning,
192204
debugLogsCloudRuns: state.debugLogsCloudRuns,
193205
customInstructions: state.customInstructions,
206+
defaultInitialTaskMode: state.defaultInitialTaskMode,
207+
lastUsedInitialTaskMode: state.lastUsedInitialTaskMode,
194208
diffOpenMode: state.diffOpenMode,
195209
hedgehogMode: state.hedgehogMode,
196210
hints: state.hints,

apps/code/src/renderer/features/task-detail/components/TaskInput.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ export function TaskInput() {
4747
allowBypassPermissions,
4848
setLastUsedEnvironment,
4949
getLastUsedEnvironment,
50+
defaultInitialTaskMode,
51+
lastUsedInitialTaskMode,
5052
} = useSettingsStore();
5153

5254
const editorRef = useRef<MessageEditorHandle>(null);
@@ -137,9 +139,11 @@ export function TaskInput() {
137139
// Get current values from preview session config options for task creation.
138140
// Defaults ensure values are always passed even before the preview session loads.
139141
const currentModel = modelOption?.currentValue;
142+
const modeFallback =
143+
defaultInitialTaskMode === "last_used" ? lastUsedInitialTaskMode : "plan";
140144
const currentExecutionMode =
141145
getCurrentModeFromConfigOptions(modeOption ? [modeOption] : undefined) ??
142-
"plan";
146+
modeFallback;
143147
const currentReasoningLevel = thoughtOption?.currentValue;
144148

145149
const branchForTaskCreation =

apps/code/src/renderer/features/task-detail/hooks/useTaskCreation.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
contentToXml,
55
extractFilePaths,
66
} from "@features/message-editor/utils/content";
7+
import { useSettingsStore } from "@features/settings/stores/settingsStore";
78
import { useCreateTask } from "@features/tasks/hooks/useTasks";
89
import { useConnectivity } from "@hooks/useConnectivity";
910
import type { WorkspaceMode } from "@main/services/workspace/schemas";
@@ -135,6 +136,10 @@ export function useTaskCreation({
135136
environmentId,
136137
});
137138

139+
if (executionMode) {
140+
useSettingsStore.getState().setLastUsedInitialTaskMode(executionMode);
141+
}
142+
138143
const taskService = get<TaskService>(RENDERER_TOKENS.TaskService);
139144
const result = await taskService.createTask(input, (output) => {
140145
invalidateTasks(output.task);

0 commit comments

Comments
 (0)