fix(webui): show generic tool arguments in activity
This commit is contained in:
@@ -986,7 +986,7 @@ function describeTraceLine(line: string): TraceDescription {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
if (name) {
|
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)) {
|
if (/done|complete|success/i.test(trimmed)) {
|
||||||
return { kind: "done", label: "Done", detail: trimmed };
|
return { kind: "done", label: "Done", detail: trimmed };
|
||||||
@@ -1148,6 +1148,35 @@ function formatTraceUrl(url: URL): string {
|
|||||||
return `${host}${path}`;
|
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 {
|
function previewTraceDetail(args: string, fallback: string): string {
|
||||||
const compactArgs = args.trim();
|
const compactArgs = args.trim();
|
||||||
if (!compactArgs) return fallback;
|
if (!compactArgs) return fallback;
|
||||||
|
|||||||
@@ -767,6 +767,31 @@ describe("AgentActivityCluster", () => {
|
|||||||
expect(screen.getByText("url: http://localhost:3000/dashboard")).toBeInTheDocument();
|
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", () => {
|
it("summarizes long shell traces instead of dumping scripts", () => {
|
||||||
const command = [
|
const command = [
|
||||||
"cat << 'EOF' | bash",
|
"cat << 'EOF' | bash",
|
||||||
|
|||||||
Reference in New Issue
Block a user