fix(webui): show generic tool arguments in activity

This commit is contained in:
chengyongru
2026-07-07 15:41:45 +08:00
committed by Xubin Ren
parent 3f33ff3143
commit 0f88927364
2 changed files with 55 additions and 1 deletions
@@ -986,7 +986,7 @@ function describeTraceLine(line: string): TraceDescription {
};
}
if (name) {
return { kind: "tool", label: "Using", detail: name };
return { kind: "tool", label: "Using", detail: genericToolTraceDetail(name, args) };
}
if (/done|complete|success/i.test(trimmed)) {
return { kind: "done", label: "Done", detail: trimmed };
@@ -1148,6 +1148,35 @@ function formatTraceUrl(url: URL): string {
return `${host}${path}`;
}
function genericToolTraceDetail(name: string, args: string): string {
const preview = previewGenericToolArgs(args);
return preview ? `${name} ${preview}` : name;
}
function previewGenericToolArgs(args: string): string {
const compactArgs = args.trim();
if (!compactArgs) return "";
try {
return previewGenericArgsObject(JSON.parse(compactArgs) as unknown);
} catch {
return compactArgs.replace(/^["']|["']$/g, "");
}
}
function previewGenericArgsObject(argsObject: unknown): string {
if (!argsObject || typeof argsObject !== "object" || Array.isArray(argsObject)) {
return previewScalar(argsObject) ?? "";
}
const record = argsObject as Record<string, unknown>;
const entries: string[] = [];
for (const key of ["query", "glob", "pattern", "path", "file_path", "url", "name", "id", "title"]) {
const preview = previewScalar(record[key]);
if (preview) entries.push(`${key}: ${preview}`);
if (entries.length >= 2) return entries.join(" · ");
}
return entries.join(" · ");
}
function previewTraceDetail(args: string, fallback: string): string {
const compactArgs = args.trim();
if (!compactArgs) return fallback;
@@ -767,6 +767,31 @@ describe("AgentActivityCluster", () => {
expect(screen.getByText("url: http://localhost:3000/dashboard")).toBeInTheDocument();
});
it("shows readable argument previews for generic tool traces", () => {
render(
<AgentActivityCluster
messages={[{
id: "t-generic-tools",
role: "tool",
kind: "trace",
content: 'grep({"pattern":"dream_cursor"})',
traces: [
'find_files({"query":"thread","glob":"*.tsx"})',
'list_dir({"path":"memory"})',
'grep({"pattern":"dream_cursor"})',
],
createdAt: 1,
}]}
isTurnStreaming
hasBodyBelow={false}
/>,
);
expect(screen.getByText("find_files query: thread · glob: *.tsx")).toBeInTheDocument();
expect(screen.getByText("list_dir path: memory")).toBeInTheDocument();
expect(screen.getByText("grep pattern: dream_cursor")).toBeInTheDocument();
});
it("summarizes long shell traces instead of dumping scripts", () => {
const command = [
"cat << 'EOF' | bash",