Skip to content
Open
Show file tree
Hide file tree
Changes from 3 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
10 changes: 8 additions & 2 deletions gui/src/pages/config/components/ToolPoliciesGroup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,14 @@ import {
ChevronDownIcon,
WrenchScrewdriverIcon,
} from "@heroicons/react/24/outline";
import { Tool } from "core";
import { useMemo, useState } from "react";
import ToggleSwitch from "../../../components/gui/Switch";
import { ToolTip } from "../../../components/gui/Tooltip";
import { Card } from "../../../components/ui";
import { useAppDispatch, useAppSelector } from "../../../redux/hooks";
import { toggleToolGroupSetting } from "../../../redux/slices/uiSlice";
import { isEditTool } from "../../../util/toolCallState";
import { ToolPolicyItem } from "./ToolPolicyItem";

interface ToolPoliciesGroupProps {
Expand All @@ -28,9 +30,13 @@ export function ToolPoliciesGroup({
const dispatch = useAppDispatch();
const [isExpanded, setIsExpanded] = useState(false);

const availableTools = useAppSelector((state) => state.config.config.tools);
const availableTools = useAppSelector(
(state) => state.config.config.tools as Tool[],
);
const tools = useMemo(() => {
return availableTools.filter((t) => t.group === groupName);
return availableTools
.filter((t) => t.group === groupName)
.filter((t) => !isEditTool(t.function.name));
}, [availableTools, groupName]);

const toolGroupSettings = useAppSelector(
Expand Down
39 changes: 6 additions & 33 deletions gui/src/pages/config/components/ToolPolicyItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ import {
import { useFontSize } from "../../../components/ui/font";
import { useAppSelector } from "../../../redux/hooks";
import { addTool, setToolPolicy } from "../../../redux/slices/uiSlice";
import { isEditTool } from "../../../util/toolCallState";

interface ToolPolicyItemProps {
tool: Tool;
Expand All @@ -29,22 +28,12 @@ interface ToolPolicyItemProps {

export function ToolPolicyItem(props: ToolPolicyItemProps) {
const dispatch = useDispatch();
const toolPolicy = useAppSelector(
const policy = useAppSelector(
(state) => state.ui.toolSettings[props.tool.function.name],
);
const [isExpanded, setIsExpanded] = useState(false);
const mode = useAppSelector((state) => state.session.mode);

const autoAcceptEditToolDiffs = useAppSelector(
(state) => state.config.config.ui?.autoAcceptEditToolDiffs,
);
const isAutoAcceptedToolCall =
isEditTool(props.tool.function.name) && autoAcceptEditToolDiffs;

const policy = isAutoAcceptedToolCall
? "allowedWithoutPermission"
: toolPolicy;

useEffect(() => {
if (!policy) {
dispatch(addTool(props.tool));
Expand All @@ -64,7 +53,6 @@ export function ToolPolicyItem(props: ToolPolicyItemProps) {
const fontSize = useFontSize(-2);

const disabled =
isAutoAcceptedToolCall ||
!props.isGroupEnabled ||
(mode === "plan" &&
props.tool.group === BUILT_IN_GROUP_NAME &&
Expand Down Expand Up @@ -112,19 +100,6 @@ export function ToolPolicyItem(props: ToolPolicyItemProps) {
<InformationCircleIcon className="h-3 w-3 flex-shrink-0 cursor-help text-yellow-500" />
</ToolTip>
) : null}
{isAutoAcceptedToolCall ? (
<ToolTip
place="bottom"
className="flex flex-wrap items-center"
content={
<p className="m-0 p-0">
Auto-Accept Agent Edits setting is on
</p>
}
>
<InformationCircleIcon className="h-3 w-3 flex-shrink-0 cursor-help text-yellow-500" />
</ToolTip>
) : null}
{props.tool.faviconUrl && (
<img
src={props.tool.faviconUrl}
Expand Down Expand Up @@ -164,13 +139,11 @@ export function ToolPolicyItem(props: ToolPolicyItemProps) {
data-tooltip-id={disabled ? disabledTooltipId : undefined}
>
<span className="text-xs">
{isAutoAcceptedToolCall
? "Automatic"
: disabled || policy === "disabled"
? "Excluded"
: policy === "allowedWithoutPermission"
? "Automatic"
: "Ask First"}
{disabled || policy === "disabled"
? "Excluded"
: policy === "allowedWithoutPermission"
? "Automatic"
: "Ask First"}
</span>
<ChevronDownIcon className="h-3 w-3" />
</ListboxButton>
Expand Down
10 changes: 2 additions & 8 deletions gui/src/redux/thunks/evaluateToolPolicies.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,9 @@ async function evaluateToolPolicy(
activeTools: Tool[],
toolCallState: ToolCallState,
toolPolicies: ToolPolicies,
autoAcceptEditToolDiffs: boolean | undefined,
): Promise<EvaluatedPolicy> {
// allow edit tool calls without permission if auto-accept is enabled
if (
isEditTool(toolCallState.toolCall.function.name) &&
autoAcceptEditToolDiffs
) {
// allow edit tool calls without permission
if (isEditTool(toolCallState.toolCall.function.name)) {
return { policy: "allowedWithoutPermission", toolCallState };
}

Expand Down Expand Up @@ -83,7 +79,6 @@ export async function evaluateToolPolicies(
activeTools: Tool[],
generatedToolCalls: ToolCallState[],
toolPolicies: ToolPolicies,
autoAcceptEditToolDiffs: boolean | undefined,
): Promise<EvaluatedPolicy[]> {
// Check if ALL tool calls are auto-approved using dynamic evaluation
const policyResults = await Promise.all(
Expand All @@ -93,7 +88,6 @@ export async function evaluateToolPolicies(
activeTools,
toolCallState,
toolPolicies,
autoAcceptEditToolDiffs,
),
),
);
Expand Down
1 change: 0 additions & 1 deletion gui/src/redux/thunks/streamNormalInput.ts
Original file line number Diff line number Diff line change
Expand Up @@ -317,7 +317,6 @@ export const streamNormalInput = createAsyncThunk<
activeTools,
generatedCalls3,
toolPolicies,
state3.config.config.ui?.autoAcceptEditToolDiffs,
);
const anyRequireApproval = policies.find(
({ policy }) => policy === "allowedWithPermission",
Expand Down
Loading