Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions sources/components/AgentInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -290,9 +290,12 @@ export const AgentInput = React.memo(React.forwardRef<MultiTextInputHandle, Agen

const hasText = props.value.trim().length > 0;

// Check if this is a Codex or Gemini session
const isCodex = props.metadata?.flavor === 'codex';
const isGemini = props.metadata?.flavor === 'gemini';
// Determine agent flavor for UI decisions (permission modes, labels, etc).
// In a live session we can use `metadata.flavor`, but in `/new` we don't have session metadata yet,
// so we fall back to the explicitly selected `agentType`.
const flavor = props.metadata?.flavor ?? props.agentType ?? null;
const isCodex = flavor === 'codex';
const isGemini = flavor === 'gemini';

// Calculate context warning
const contextWarning = props.usageData?.contextSize
Expand Down
34 changes: 17 additions & 17 deletions sources/sync/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -302,7 +302,6 @@ export const storage = create<StorageState>()((set, get) => {
applySessions: (sessions: (Omit<Session, 'presence'> & { presence?: "online" | number })[]) => set((state) => {
// Load drafts and permission modes if sessions are empty (initial load)
const savedDrafts = Object.keys(state.sessions).length === 0 ? sessionDrafts : {};
const savedPermissionModes = Object.keys(state.sessions).length === 0 ? sessionPermissionModes : {};

// Merge new sessions with existing ones
const mergedSessions: Record<string, Session> = { ...state.sessions };
Expand All @@ -316,12 +315,15 @@ export const storage = create<StorageState>()((set, get) => {
const existingDraft = state.sessions[session.id]?.draft;
const savedDraft = savedDrafts[session.id];
const existingPermissionMode = state.sessions[session.id]?.permissionMode;
const savedPermissionMode = savedPermissionModes[session.id];
const savedPermissionMode = sessionPermissionModes[session.id];
const resolvedPermissionMode = existingPermissionMode && existingPermissionMode !== 'default'
? existingPermissionMode
: (savedPermissionMode || session.permissionMode || existingPermissionMode || 'default');
mergedSessions[session.id] = {
...session,
presence,
draft: existingDraft || savedDraft || session.draft || null,
permissionMode: existingPermissionMode || savedPermissionMode || session.permissionMode || 'default'
permissionMode: resolvedPermissionMode
};
});

Expand Down Expand Up @@ -780,6 +782,16 @@ export const storage = create<StorageState>()((set, get) => {
}),
updateSessionPermissionMode: (sessionId: string, mode: 'default' | 'acceptEdits' | 'bypassPermissions' | 'plan' | 'read-only' | 'safe-yolo' | 'yolo') => set((state) => {
const session = state.sessions[sessionId];
// Persist permission modes even if the session isn't loaded yet.
// This is important for newly created sessions where we want the first render
// to show the intended permission mode, even if applySessions runs later.
if (mode !== 'default') {
sessionPermissionModes[sessionId] = mode;
} else {
delete sessionPermissionModes[sessionId];
}
saveSessionPermissionModes(sessionPermissionModes);

if (!session) return state;

// Update the session with the new permission mode
Expand All @@ -791,17 +803,6 @@ export const storage = create<StorageState>()((set, get) => {
}
};

// Collect all permission modes for persistence
const allModes: Record<string, PermissionMode> = {};
Object.entries(updatedSessions).forEach(([id, sess]) => {
if (sess.permissionMode && sess.permissionMode !== 'default') {
allModes[id] = sess.permissionMode;
}
});

// Persist permission modes (only non-default values to save space)
saveSessionPermissionModes(allModes);

// No need to rebuild sessionListViewData since permission mode doesn't affect the list display
return {
...state,
Expand Down Expand Up @@ -928,9 +929,8 @@ export const storage = create<StorageState>()((set, get) => {
delete drafts[sessionId];
saveSessionDrafts(drafts);

const modes = loadSessionPermissionModes();
delete modes[sessionId];
saveSessionPermissionModes(modes);
delete sessionPermissionModes[sessionId];
saveSessionPermissionModes(sessionPermissionModes);

// Rebuild sessionListViewData without the deleted session
const sessionListViewData = buildSessionListViewData(remainingSessions);
Expand Down