diff --git a/.changeset/sdk-readonly-not-overridden-by-rule.md b/.changeset/sdk-readonly-not-overridden-by-rule.md
new file mode 100644
index 000000000..b8efc88ec
--- /dev/null
+++ b/.changeset/sdk-readonly-not-overridden-by-rule.md
@@ -0,0 +1,5 @@
+---
+'@workflowbuilder/sdk': minor
+---
+
+Form-wide readonly mode is no longer overridden by a local uischema `rule`. Every JSON Form control now stays non-editable while `config.readonly` is `true`, even when a rule with an `ENABLE` effect applies to it.
diff --git a/packages/sdk/src/features/json-form/controls/ai-tools-control/ai-tools-control.tsx b/packages/sdk/src/features/json-form/controls/ai-tools-control/ai-tools-control.tsx
index cc11d8182..54db3c0b4 100644
--- a/packages/sdk/src/features/json-form/controls/ai-tools-control/ai-tools-control.tsx
+++ b/packages/sdk/src/features/json-form/controls/ai-tools-control/ai-tools-control.tsx
@@ -9,15 +9,19 @@ import styles from './ai-tools-control.module.css';
import { FormControlWithLabel } from '../../../../components/form/form-control-with-label/form-control-with-label';
import { closeModal } from '../../../modals/stores/use-modal-store';
+import { useIsControlEditable } from '../../hooks/use-is-control-editable';
import type { AiAgentTool, AiToolsControlProps } from '../../types/controls';
import { createControlRenderer } from '../../utils/rendering';
import { createAiTool, hasAnyValue } from './create-ai-tool';
import { openAddToolModal } from './open-add-tool-modal';
import { toolOptions } from './select-options';
-function AiToolsControl({ path, handleChange, data, enabled, uischema }: AiToolsControlProps) {
+function AiToolsControl(props: AiToolsControlProps) {
+ const { path, handleChange, data } = props;
+ const isEditable = useIsControlEditable(props);
+
const { t } = useTranslation(undefined, { keyPrefix: 'aiTools' });
- const isDisabled = !enabled || uischema.disabled === true;
+
const handleSubmit = useCallback(
(change: AiAgentTool) => {
if (hasAnyValue(change)) {
@@ -61,7 +65,7 @@ function AiToolsControl({ path, handleChange, data, enabled, uischema }: AiTools
variant: 'secondary',
className: styles['selected-tool-button'],
onClick: () => openEditorModal(toolData),
- disabled: isDisabled,
+ disabled: !isEditable,
};
return (
@@ -75,14 +79,14 @@ function AiToolsControl({ path, handleChange, data, enabled, uischema }: AiTools
) : (
)}
- onRemoveTool(toolData.id)} disabled={isDisabled}>
+ onRemoveTool(toolData.id)} disabled={!isEditable}>
);
})}
-