diff --git a/webui/src/components/thread/AgentActivityCluster.tsx b/webui/src/components/thread/AgentActivityCluster.tsx index 7a848b95..0c9f3bcb 100644 --- a/webui/src/components/thread/AgentActivityCluster.tsx +++ b/webui/src/components/thread/AgentActivityCluster.tsx @@ -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; + 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; diff --git a/webui/src/tests/agent-activity-cluster.test.tsx b/webui/src/tests/agent-activity-cluster.test.tsx index 776f6dcd..9e10bfa3 100644 --- a/webui/src/tests/agent-activity-cluster.test.tsx +++ b/webui/src/tests/agent-activity-cluster.test.tsx @@ -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( + , + ); + + 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",