mirror of
https://github.com/luckyyzh/pi-agent-integrated.git
synced 2026-10-03 02:59:35 +00:00
60 lines
1.5 KiB
TypeScript
60 lines
1.5 KiB
TypeScript
"use client";
|
|
|
|
import { parseAnsiLine, stripAnsi } from "@/lib/ansi";
|
|
import type { ExtensionStatusItem } from "@/lib/types";
|
|
|
|
export function sanitizeExtensionStatusText(text: string): string {
|
|
return text
|
|
.replace(/[\r\n\t]/g, " ")
|
|
.replace(/ +/g, " ")
|
|
.trim();
|
|
}
|
|
|
|
export function formatExtensionStatusLine(statuses: ExtensionStatusItem[]): string {
|
|
return [...statuses]
|
|
.sort((a, b) => a.key.localeCompare(b.key))
|
|
.map(({ text }) => sanitizeExtensionStatusText(text))
|
|
.join(" ");
|
|
}
|
|
|
|
export function ExtensionStatusBar({ statuses }: { statuses: ExtensionStatusItem[] }) {
|
|
if (statuses.length === 0) return null;
|
|
|
|
const statusLine = formatExtensionStatusLine(statuses);
|
|
const plainStatusLine = stripAnsi(statusLine);
|
|
|
|
return (
|
|
<div
|
|
role="status"
|
|
aria-label={plainStatusLine}
|
|
title={plainStatusLine}
|
|
style={{
|
|
display: "flex",
|
|
alignItems: "center",
|
|
flexShrink: 0,
|
|
minWidth: 0,
|
|
height: 36,
|
|
padding: "0 12px",
|
|
borderTop: "1px solid var(--border)",
|
|
background: "transparent",
|
|
}}
|
|
>
|
|
<span
|
|
style={{
|
|
minWidth: 0,
|
|
overflow: "hidden",
|
|
color: "var(--text-muted)",
|
|
fontFamily: "var(--font-mono)",
|
|
fontSize: 11,
|
|
textOverflow: "ellipsis",
|
|
whiteSpace: "nowrap",
|
|
}}
|
|
>
|
|
{parseAnsiLine(statusLine).map((segment, index) => (
|
|
<span key={index} style={segment.style}>{segment.text}</span>
|
|
))}
|
|
</span>
|
|
</div>
|
|
);
|
|
}
|