Skip to content
Closed
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
5 changes: 4 additions & 1 deletion cli/src/claude/runClaude.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import { formatMessageWithAttachments } from '@/utils/attachmentFormatter';
import { normalizeClaudeSessionModel } from './model';
import { normalizeClaudeSessionEffort } from './effort';
import { getInvokedCwd } from '@/utils/invokedCwd';
import { readClaudeSettings } from '@/claude/utils/claudeSettings';

export interface StartOptions {
model?: string
Expand Down Expand Up @@ -151,7 +152,9 @@ export async function runClaude(options: StartOptions = {}): Promise<void> {
}));

// Forward messages to the queue
let currentPermissionMode: PermissionMode = options.permissionMode ?? 'default';
const claudeSettings = readClaudeSettings();
const claudeDefaultMode = claudeSettings?.permissions?.defaultMode as PermissionMode | undefined;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[MAJOR] Validate permissions.defaultMode before using it as a HAPI permission mode.

This cast turns arbitrary settings.json content into PermissionMode. HAPI's Claude modes are default | acceptEdits | bypassPermissions | plan, so values such as the PR's auto example can flow into the message queue and then to Claude as --permission-mode <value>. That can break remote startup or leave HAPI's permission handler in an unsupported mode.

Suggested fix:

const configuredDefaultMode = claudeSettings?.permissions?.defaultMode;
const parsedDefaultMode = PermissionModeSchema.safeParse(configuredDefaultMode);
const claudeDefaultMode: PermissionMode | undefined =
    parsedDefaultMode.success && isPermissionModeAllowedForFlavor(parsedDefaultMode.data, 'claude')
        ? parsedDefaultMode.data as PermissionMode
        : undefined;

If Claude settings can use aliases such as auto, normalize those aliases before this validation.

let currentPermissionMode: PermissionMode = options.permissionMode ?? claudeDefaultMode ?? 'default';
let currentModel: SessionModel = initialModel;
let currentEffort: SessionEffort = initialEffort;
let currentFallbackModel: string | undefined = undefined; // Track current fallback model
Expand Down
Loading