diff --git a/packages/tui/src/mini/tool.ts b/packages/tui/src/mini/tool.ts index dd41193526ba..a51d0d79ae14 100644 --- a/packages/tui/src/mini/tool.ts +++ b/packages/tui/src/mini/tool.ts @@ -49,6 +49,7 @@ type PatchFile = { } type ToolInput = ToolDict & { + id?: string path?: string pattern?: string url?: string @@ -67,6 +68,7 @@ type ToolInput = ToolDict & { } type ToolMetadata = ToolDict & { + name?: string count?: number matches?: number diff?: string @@ -416,9 +418,10 @@ function runTask(p: ToolProps): ToolInline { } function runSkill(p: ToolProps): ToolInline { + const name = p.metadata.name ?? p.input.id ?? "" return { icon: "→", - title: `Skill "${p.input.name ?? ""}"`, + title: `Skill "${name}"`, } } @@ -819,7 +822,7 @@ function scrollLspStart(p: ToolProps): string { } function scrollSkillStart(p: ToolProps): string { - return `→ Skill "${p.input.name ?? ""}"` + return `→ Skill "${p.metadata.name ?? p.input.id ?? ""}"` } function scrollGlobStart(p: ToolProps): string { diff --git a/packages/tui/test/mini/tool.test.ts b/packages/tui/test/mini/tool.test.ts index 5f9d1860f68a..4ebd16c8168a 100644 --- a/packages/tui/test/mini/tool.test.ts +++ b/packages/tui/test/mini/tool.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "bun:test" -import { normalizeTool, toolOutputText, toolPath } from "../../src/mini/tool" +import { normalizeTool, toolInlineInfo, toolOutputText, toolPath, toolScroll } from "../../src/mini/tool" describe("Mini tool presentation", () => { test("uses V2 shell output without the model-facing status", () => { @@ -73,6 +73,38 @@ describe("Mini tool presentation", () => { ).toMatchObject({ name: "subagent", state: { input: { agent: "explore" } } }) }) + test("renders the skill name from structured metadata with the input id as fallback", () => { + const skill = (structured: { name?: string }) => ({ + type: "tool" as const, + id: "call-skill", + name: "skill", + state: { + status: "completed" as const, + input: { id: "tigerstyle" }, + structured, + content: [], + }, + time: { created: 1, ran: 1, completed: 2 }, + }) + + expect(toolInlineInfo(skill({ name: "effect" })).title).toBe('Skill "effect"') + expect(toolInlineInfo(skill({})).title).toBe('Skill "tigerstyle"') + expect( + toolScroll("start", { + directory: "/work/project", + raw: "", + name: "skill", + input: { id: "tigerstyle" }, + meta: { name: "effect" }, + state: {}, + status: "completed", + error: "", + output: "", + time: {}, + }), + ).toBe('→ Skill "effect"') + }) + test("keeps segment-safe contained tool paths relative", () => { expect(toolPath("..cache/result.txt", { directory: "/work/project" })).toBe("..cache/result.txt") expect(toolPath("../shared/result.txt", { directory: "/work/project" })).toBe("/work/shared/result.txt")