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
16 changes: 13 additions & 3 deletions src/claude/runClaude.ts
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ export async function runClaude(credentials: Credentials, options: StartOptions
// Forward messages to the queue
// Permission modes: Use the unified 7-mode type, mapping happens at SDK boundary in claudeRemote.ts
let currentPermissionMode: PermissionMode | undefined = options.permissionMode;
const cliPermissionMode = options.permissionMode; // Remember CLI's explicit permission mode (e.g., --yolo)
let currentModel = options.model; // Track current model state
let currentFallbackModel: string | undefined = undefined; // Track current fallback model
let currentCustomSystemPrompt: string | undefined = undefined; // Track current custom system prompt
Expand All @@ -250,11 +251,20 @@ export async function runClaude(credentials: Credentials, options: StartOptions
session.onUserMessage((message) => {

// Resolve permission mode from meta - pass through as-is, mapping happens at SDK boundary
// If CLI was started with explicit mode (e.g., --yolo), don't let "default" messages override it
let messagePermissionMode: PermissionMode | undefined = currentPermissionMode;
if (message.meta?.permissionMode) {
messagePermissionMode = message.meta.permissionMode;
currentPermissionMode = messagePermissionMode;
logger.debug(`[loop] Permission mode updated from user message to: ${currentPermissionMode}`);
const incomingMode = message.meta.permissionMode as PermissionMode;
// Only override CLI's explicit mode if message has a non-default mode
// This ensures --yolo persists unless mobile explicitly changes to a different mode
if (cliPermissionMode && incomingMode === 'default') {
messagePermissionMode = cliPermissionMode;
logger.debug(`[loop] Keeping CLI permission mode (${cliPermissionMode}) instead of message's "default"`);
} else {
messagePermissionMode = incomingMode;
currentPermissionMode = messagePermissionMode;
logger.debug(`[loop] Permission mode updated from user message to: ${currentPermissionMode}`);
}
} else {
logger.debug(`[loop] User message received with no permission mode override, using current: ${currentPermissionMode}`);
}
Expand Down
2 changes: 2 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -491,6 +491,8 @@ ${chalk.bold('To clean up runaway processes:')} Use ${chalk.cyan('happy doctor c
} else if (arg === '--yolo') {
// Shortcut for --dangerously-skip-permissions
unknownArgs.push('--dangerously-skip-permissions')
// Also set internal permissionMode for PermissionHandler (fixes #206)
options.permissionMode = 'bypassPermissions'
} else if (arg === '--started-by') {
options.startedBy = args[++i] as 'daemon' | 'terminal'
} else if (arg === '--js-runtime') {
Expand Down