mirror of
https://github.com/harivansh-afk/sandbox-agent.git
synced 2026-04-16 21:03:46 +00:00
* Restore foundry onboarding stack * Consolidate foundry rename * Create foundry tasks without prompts * Rename Foundry handoffs to tasks
174 lines
5.6 KiB
TypeScript
174 lines
5.6 KiB
TypeScript
import { memo } from "react";
|
|
import { useStyletron } from "baseui";
|
|
import { LabelSmall } from "baseui/typography";
|
|
import { Clock, MailOpen } from "lucide-react";
|
|
|
|
import { PanelHeaderBar } from "./ui";
|
|
import { type AgentTab, type Task } from "./view-model";
|
|
|
|
export const TranscriptHeader = memo(function TranscriptHeader({
|
|
task,
|
|
activeTab,
|
|
editingField,
|
|
editValue,
|
|
onEditValueChange,
|
|
onStartEditingField,
|
|
onCommitEditingField,
|
|
onCancelEditingField,
|
|
onSetActiveTabUnread,
|
|
}: {
|
|
task: Task;
|
|
activeTab: AgentTab | null | undefined;
|
|
editingField: "title" | "branch" | null;
|
|
editValue: string;
|
|
onEditValueChange: (value: string) => void;
|
|
onStartEditingField: (field: "title" | "branch", value: string) => void;
|
|
onCommitEditingField: (field: "title" | "branch") => void;
|
|
onCancelEditingField: () => void;
|
|
onSetActiveTabUnread: (unread: boolean) => void;
|
|
}) {
|
|
const [css, theme] = useStyletron();
|
|
|
|
return (
|
|
<PanelHeaderBar $style={{ backgroundColor: "#0f0f11", borderBottom: "none" }}>
|
|
{editingField === "title" ? (
|
|
<input
|
|
autoFocus
|
|
value={editValue}
|
|
onChange={(event) => onEditValueChange(event.target.value)}
|
|
onBlur={() => onCommitEditingField("title")}
|
|
onKeyDown={(event) => {
|
|
if (event.key === "Enter") {
|
|
onCommitEditingField("title");
|
|
} else if (event.key === "Escape") {
|
|
onCancelEditingField();
|
|
}
|
|
}}
|
|
className={css({
|
|
appearance: "none",
|
|
WebkitAppearance: "none",
|
|
background: "none",
|
|
border: "none",
|
|
padding: "0",
|
|
margin: "0",
|
|
outline: "none",
|
|
fontWeight: 500,
|
|
fontSize: "14px",
|
|
color: theme.colors.contentPrimary,
|
|
borderBottom: "1px solid rgba(255, 255, 255, 0.3)",
|
|
minWidth: "80px",
|
|
maxWidth: "300px",
|
|
})}
|
|
/>
|
|
) : (
|
|
<LabelSmall
|
|
title="Rename"
|
|
color={theme.colors.contentPrimary}
|
|
$style={{ fontWeight: 400, whiteSpace: "nowrap", cursor: "pointer", ":hover": { textDecoration: "underline" } }}
|
|
onClick={() => onStartEditingField("title", task.title)}
|
|
>
|
|
{task.title}
|
|
</LabelSmall>
|
|
)}
|
|
{task.branch ? (
|
|
editingField === "branch" ? (
|
|
<input
|
|
autoFocus
|
|
value={editValue}
|
|
onChange={(event) => onEditValueChange(event.target.value)}
|
|
onBlur={() => onCommitEditingField("branch")}
|
|
onKeyDown={(event) => {
|
|
if (event.key === "Enter") {
|
|
onCommitEditingField("branch");
|
|
} else if (event.key === "Escape") {
|
|
onCancelEditingField();
|
|
}
|
|
}}
|
|
className={css({
|
|
appearance: "none",
|
|
WebkitAppearance: "none",
|
|
background: "none",
|
|
margin: "0",
|
|
outline: "none",
|
|
padding: "2px 8px",
|
|
borderRadius: "999px",
|
|
border: "1px solid rgba(255, 255, 255, 0.3)",
|
|
backgroundColor: "rgba(255, 255, 255, 0.03)",
|
|
color: "#e4e4e7",
|
|
fontSize: "11px",
|
|
whiteSpace: "nowrap",
|
|
fontFamily: '"IBM Plex Mono", monospace',
|
|
minWidth: "60px",
|
|
})}
|
|
/>
|
|
) : (
|
|
<span
|
|
title="Rename"
|
|
onClick={() => onStartEditingField("branch", task.branch ?? "")}
|
|
className={css({
|
|
padding: "2px 8px",
|
|
borderRadius: "999px",
|
|
border: "1px solid rgba(255, 255, 255, 0.14)",
|
|
backgroundColor: "rgba(255, 255, 255, 0.03)",
|
|
color: "#e4e4e7",
|
|
fontSize: "11px",
|
|
whiteSpace: "nowrap",
|
|
fontFamily: '"IBM Plex Mono", monospace',
|
|
cursor: "pointer",
|
|
":hover": { borderColor: "rgba(255, 255, 255, 0.3)" },
|
|
})}
|
|
>
|
|
{task.branch}
|
|
</span>
|
|
)
|
|
) : null}
|
|
<div className={css({ flex: 1 })} />
|
|
<div
|
|
className={css({
|
|
display: "inline-flex",
|
|
alignItems: "center",
|
|
gap: "5px",
|
|
padding: "3px 10px",
|
|
borderRadius: "6px",
|
|
backgroundColor: "rgba(255, 255, 255, 0.05)",
|
|
border: "1px solid rgba(255, 255, 255, 0.08)",
|
|
fontSize: "11px",
|
|
fontWeight: 500,
|
|
lineHeight: 1,
|
|
color: theme.colors.contentSecondary,
|
|
whiteSpace: "nowrap",
|
|
})}
|
|
>
|
|
<Clock size={11} style={{ flexShrink: 0 }} />
|
|
<span>847 min used</span>
|
|
</div>
|
|
{activeTab ? (
|
|
<button
|
|
onClick={() => onSetActiveTabUnread(!activeTab.unread)}
|
|
className={css({
|
|
appearance: "none",
|
|
WebkitAppearance: "none",
|
|
background: "none",
|
|
border: "none",
|
|
margin: "0",
|
|
boxSizing: "border-box",
|
|
display: "inline-flex",
|
|
alignItems: "center",
|
|
gap: "5px",
|
|
padding: "4px 10px",
|
|
borderRadius: "6px",
|
|
fontSize: "11px",
|
|
fontWeight: 500,
|
|
lineHeight: 1,
|
|
color: theme.colors.contentSecondary,
|
|
cursor: "pointer",
|
|
transition: "all 200ms ease",
|
|
":hover": { backgroundColor: "rgba(255, 255, 255, 0.06)", color: theme.colors.contentPrimary },
|
|
})}
|
|
>
|
|
<MailOpen size={12} style={{ flexShrink: 0 }} /> {activeTab.unread ? "Mark read" : "Mark unread"}
|
|
</button>
|
|
) : null}
|
|
</PanelHeaderBar>
|
|
);
|
|
});
|