From 96b1b586f95c00c1530eb3cb87134e8917d0ab5e Mon Sep 17 00:00:00 2001 From: cliffhall Date: Fri, 6 Feb 2026 16:30:23 -0500 Subject: [PATCH] Manage display of "Run as Task" checkbox on Tools Tab * In ToolsTab.tsx - define ExtendedTool interface for augmenting with execution, meta, icons - in hasMeta function, - cast tool as ExtendedTool - add getTaskSupport function - returns forbidden if input is not a tool - returns the setting of execution.taskSupport if set and valid - returns optional otherwise - in useEffect map callback - set runAsTask to true if getTaskSupport returns "required", else false - in IconDisplay instances cast tool as ExtendedTool instead of as WithIcons - hide "Run as Task" checkbox if getTaskSupport returns "forbidden" for the selected tool - disable the "Run as Task" checkbox if getTaskSupport returns "required" * In ToolsTab.test.tsx - added unit test - "should show/hide/disable run-as-task checkbox based on taskSupport" - tests checkbox checked and disabled states for "forbidden", "required", and "optional" states --- client/src/components/ToolsTab.tsx | 75 +++++++++++++------ .../components/__tests__/ToolsTab.test.tsx | 55 ++++++++++++++ 2 files changed, 109 insertions(+), 21 deletions(-) diff --git a/client/src/components/ToolsTab.tsx b/client/src/components/ToolsTab.tsx index 9e1b5d56b..69bcdd353 100644 --- a/client/src/components/ToolsTab.tsx +++ b/client/src/components/ToolsTab.tsx @@ -50,11 +50,40 @@ import { hasValidMetaName, hasValidMetaPrefix, isReservedMetaKey, -} from "@/utils/metaUtils"; +} from "../utils/metaUtils"; + +/** + * Extended Tool type that includes optional fields used by the inspector. + */ +interface ExtendedTool extends Tool, WithIcons { + _meta?: Record; + execution?: { + taskSupport?: "forbidden" | "required" | "optional"; + }; +} // Type guard to safely detect the optional _meta field without using `any` -const hasMeta = (tool: Tool): tool is Tool & { _meta: unknown } => - typeof (tool as { _meta?: unknown })._meta !== "undefined"; +const hasMeta = ( + tool: Tool, +): tool is ExtendedTool & { _meta: Record } => + typeof (tool as ExtendedTool)._meta !== "undefined"; + +// Type guard to detect execution.taskSupport +const getTaskSupport = ( + tool: Tool | null, +): "forbidden" | "required" | "optional" => { + if (!tool) return "forbidden"; + const extendedTool = tool as ExtendedTool; + const taskSupport = extendedTool.execution?.taskSupport; + if ( + taskSupport === "forbidden" || + taskSupport === "required" || + taskSupport === "optional" + ) { + return taskSupport; + } + return "optional"; +}; const ToolsTab = ({ tools, @@ -131,7 +160,8 @@ const ToolsTab = ({ ]; }); setParams(Object.fromEntries(params)); - setRunAsTask(false); + const taskSupport = getTaskSupport(selectedTool); + setRunAsTask(taskSupport === "required"); // Reset validation errors when switching tools setHasValidationErrors(false); @@ -170,7 +200,7 @@ const ToolsTab = ({ renderItem={(tool) => (
- +
{tool.name} @@ -191,7 +221,7 @@ const ToolsTab = ({
{selectedTool && ( )} @@ -659,21 +689,24 @@ const ToolsTab = ({
)} -
- - setRunAsTask(checked) - } - /> - -
+ {getTaskSupport(selectedTool) !== "forbidden" && ( +
+ + setRunAsTask(checked) + } + disabled={getTaskSupport(selectedTool) === "required"} + /> + +
+ )}