Skip to content

[Bug] User-provided disallowedTools in _meta.claudeCode.options silently overwritten #294

@blimmer

Description

@blimmer

Bug Description

When creating a new session, ACP correctly merges user-provided hooks and mcpServers from _meta.claudeCode.options with its own internal values. However, disallowedTools is overwritten rather than merged.

Root Cause

In src/acp-agent.ts, user-provided options are spread at line 1000:

...userProvidedOptions,

But then ACP's internal disallowedTools unconditionally overwrites the user's value at line 1108:

options.disallowedTools = disallowedTools;

Any disallowedTools passed via _meta.claudeCode.options are silently lost.

Expected Behavior

disallowedTools should be merged with user-provided values, matching the established pattern used for hooks (lines 1017-1047) and mcpServers (line 1004):

// mcpServers merge pattern (line 1004):
mcpServers: { ...(userProvidedOptions?.mcpServers || {}), ...mcpServers },

// hooks merge pattern (lines 1017-1047):
hooks: {
  ...userProvidedOptions?.hooks,
  PreToolUse: [
    ...(userProvidedOptions?.hooks?.PreToolUse || []),
    // ...ACP's hooks
  ],
  // ...
}

Proposed Fix

// Before:
options.disallowedTools = disallowedTools;

// After:
options.disallowedTools = [...(userProvidedOptions?.disallowedTools || []), ...disallowedTools];

The NewSessionMeta JSDoc should also be updated to document that disallowedTools is merged (like hooks and mcpServers).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions