Ver Fonte

fix(tui): show skill name in mini tool output (#38250)

Simon Klee há 3 semanas atrás
pai
commit
ca6da05d07
2 ficheiros alterados com 38 adições e 3 exclusões
  1. 5 2
      packages/tui/src/mini/tool.ts
  2. 33 1
      packages/tui/test/mini/tool.test.ts

+ 5 - 2
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 {

+ 33 - 1
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")