* feat(files): edit workspace files on web Keep source buffers synchronized with host file changes and require an explicit overwrite or reload when revisions diverge. * feat(panels): surface and protect modified tabs Expose tooltip and modification state through the generic panel boundary so tabs can show stable metadata and guard every close route consistently. * fix(tests): use portable fake timeout handle * fix(files): harden editor conflict handling Preserve modified panel state across tab eviction, use precise revisions for optimistic writes, coalesce concurrent file watchers, and localize the editor interface. * fix(files): close editor concurrency gaps Coalesce clean reloads, preserve subscriber identities and file permissions, suspend pending saves during close confirmation, and carry precise revisions through file reads. * test(files): expect read revision metadata
33 lines
893 B
TypeScript
33 lines
893 B
TypeScript
import type { ComponentType } from "react";
|
|
import { i18n } from "@/i18n/i18next";
|
|
import type { PanelDescriptor, PanelIconProps } from "@/panels/panel-registry";
|
|
|
|
export function buildDraftPanelDescriptor(input: {
|
|
isCreating: boolean;
|
|
pendingPrompt?: string | null;
|
|
icon: ComponentType<PanelIconProps>;
|
|
}): PanelDescriptor {
|
|
const { icon, isCreating, pendingPrompt } = input;
|
|
const newAgentLabel = i18n.t("panels.draft.newAgent");
|
|
const creatingLabel = pendingPrompt?.trim() || newAgentLabel;
|
|
if (isCreating) {
|
|
return {
|
|
label: creatingLabel,
|
|
subtitle: i18n.t("panels.draft.creatingAgent"),
|
|
tooltip: creatingLabel,
|
|
titleState: "ready",
|
|
icon,
|
|
statusBucket: "running",
|
|
};
|
|
}
|
|
|
|
return {
|
|
label: newAgentLabel,
|
|
subtitle: newAgentLabel,
|
|
tooltip: newAgentLabel,
|
|
titleState: "ready",
|
|
icon,
|
|
statusBucket: null,
|
|
};
|
|
}
|