Files
openclaw/src/agents/tool-display.ts

90 lines
2.3 KiB
TypeScript

import { redactToolDetail } from "../logging/redact.js";
import { shortenHomeInString } from "../utils.js";
import {
defaultTitle,
formatToolDetailText,
formatDetailKey,
normalizeToolName,
resolveToolVerbAndDetailForArgs,
} from "./tool-display-common.js";
import { TOOL_DISPLAY_CONFIG } from "./tool-display-config.js";
export type ToolDisplay = {
name: string;
emoji: string;
title: string;
label: string;
verb?: string;
detail?: string;
};
const FALLBACK = TOOL_DISPLAY_CONFIG.fallback ?? { emoji: "🧩" };
const TOOL_MAP = TOOL_DISPLAY_CONFIG.tools ?? {};
const DETAIL_LABEL_OVERRIDES: Record<string, string> = {
agentId: "agent",
sessionKey: "session",
targetId: "target",
targetUrl: "url",
nodeId: "node",
requestId: "request",
messageId: "message",
threadId: "thread",
channelId: "channel",
guildId: "guild",
userId: "user",
runTimeoutSeconds: "timeout",
timeoutSeconds: "timeout",
includeTools: "tools",
pollQuestion: "poll",
maxChars: "max chars",
};
const MAX_DETAIL_ENTRIES = 8;
export function resolveToolDisplay(params: {
name?: string;
args?: unknown;
meta?: string;
}): ToolDisplay {
const name = normalizeToolName(params.name);
const key = name.toLowerCase();
const spec = TOOL_MAP[key];
const emoji = spec?.emoji ?? FALLBACK.emoji ?? "🧩";
const title = spec?.title ?? defaultTitle(name);
const label = spec?.label ?? title;
let { verb, detail } = resolveToolVerbAndDetailForArgs({
toolKey: key,
args: params.args,
meta: params.meta,
spec,
fallbackDetailKeys: FALLBACK.detailKeys,
detailMode: "summary",
detailMaxEntries: MAX_DETAIL_ENTRIES,
detailFormatKey: (raw) => formatDetailKey(raw, DETAIL_LABEL_OVERRIDES),
});
if (detail) {
detail = shortenHomeInString(detail);
}
return {
name,
emoji,
title,
label,
verb,
detail,
};
}
export function formatToolDetail(display: ToolDisplay): string | undefined {
const detailRaw = display.detail ? redactToolDetail(display.detail) : undefined;
return formatToolDetailText(detailRaw);
}
export function formatToolSummary(display: ToolDisplay): string {
const detail = formatToolDetail(display);
return detail
? `${display.emoji} ${display.label}: ${detail}`
: `${display.emoji} ${display.label}`;
}