feat(ui): improve write_stdin, terminate_session, list_sessions rendering in ChatRow

- Add proper UI cases for write_stdin showing session ID and input chars
- Add terminate_session rendering with termination status
- Add list_sessions rendering with sessions table
- Add i18n translations for all stdin operations
This commit is contained in:
Hannes Rudolph 2026-01-27 18:37:41 -07:00
parent cb28f75fff
commit 56da141bd9
2 changed files with 83 additions and 0 deletions

View file

@ -71,6 +71,7 @@ import {
Split,
ArrowRight,
Check,
OctagonX,
} from "lucide-react"
import { cn } from "@/lib/utils"
import { PathTooltip } from "../ui/PathTooltip"
@ -992,6 +993,80 @@ export const ChatRowContent = ({
)}
</>
)
case "write_stdin": {
const stdinTool = tool as any
const sessionId = stdinTool.session_id
const chars = stdinTool.chars || ""
const displayChars = chars.length > 30 ? chars.slice(0, 30) + "..." : chars
const escapedChars = displayChars.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t")
return (
<>
<div style={headerStyle}>
<TerminalSquare className="size-4" aria-label="Terminal stdin icon" />
<span style={{ fontWeight: "bold" }}>
{chars
? t("chat:stdinOperations.sentToSession", {
sessionId,
chars: escapedChars,
})
: t("chat:stdinOperations.polledSession", { sessionId })}
</span>
</div>
{stdinTool.content && (
<div className="pl-6">
<CodeAccordian
code={stdinTool.content}
language="shell-session"
isExpanded={isExpanded}
onToggleExpand={handleToggleExpand}
/>
</div>
)}
</>
)
}
case "terminate_session": {
const terminateTool = tool as any
const sessionId = terminateTool.session_id
return (
<>
<div style={headerStyle}>
<OctagonX className="size-4" aria-label="Terminate session icon" />
<span style={{ fontWeight: "bold" }}>
{message.type === "ask"
? t("chat:stdinOperations.wantsToTerminate", { sessionId })
: t("chat:stdinOperations.didTerminate", { sessionId })}
</span>
</div>
{terminateTool.content && (
<div className="pl-6 text-muted-foreground">{terminateTool.content}</div>
)}
</>
)
}
case "list_sessions":
return (
<>
<div style={headerStyle}>
<TerminalSquare className="size-4" aria-label="List sessions icon" />
<span style={{ fontWeight: "bold" }}>
{message.type === "ask"
? t("chat:stdinOperations.wantsToListSessions")
: t("chat:stdinOperations.didListSessions")}
</span>
</div>
{tool.content && (
<div className="pl-6">
<CodeAccordian
code={tool.content}
language="markdown"
isExpanded={isExpanded}
onToggleExpand={handleToggleExpand}
/>
</div>
)}
</>
)
default:
return null
}

View file

@ -498,5 +498,13 @@
},
"readCommandOutput": {
"title": "Roo read command output"
},
"stdinOperations": {
"sentToSession": "Sent \"{{chars}}\" to session {{sessionId}}",
"polledSession": "Polled session {{sessionId}}",
"wantsToTerminate": "Wants to terminate session {{sessionId}}",
"didTerminate": "Terminated session {{sessionId}}",
"wantsToListSessions": "Wants to list active sessions",
"didListSessions": "Listed active sessions"
}
}