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:
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).
Bug Description
When creating a new session, ACP correctly merges user-provided
hooksandmcpServersfrom_meta.claudeCode.optionswith its own internal values. However,disallowedToolsis overwritten rather than merged.Root Cause
In
src/acp-agent.ts, user-provided options are spread at line 1000:But then ACP's internal
disallowedToolsunconditionally overwrites the user's value at line 1108:Any
disallowedToolspassed via_meta.claudeCode.optionsare silently lost.Expected Behavior
disallowedToolsshould be merged with user-provided values, matching the established pattern used forhooks(lines 1017-1047) andmcpServers(line 1004):Proposed Fix
The
NewSessionMetaJSDoc should also be updated to document thatdisallowedToolsis merged (likehooksandmcpServers).