docs(plan): v0.2 adds Pi subagents and scheduled-jobs board

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
rootandClaude Fable 5.1 committed 2026-09-28 02:09:39 +08:00
1 parent b839ed4056
commit 16ab2a6c84
97 files changed
+592 -648

No files matched your search

+8 -8
View File
@@ -76,7 +76,7 @@ export default function FilesTrashPage() {
if (r.restored.length) toast.success(`已还原 ${r.restored.length} 项`);
for (const f of r.failed)
toast.error(
f.code === "exists" || f.code === "conflict" ? "原位置已被占用,可用“还原到…”换个目录" : f.message,
f.code === "exists" || f.code === "conflict" ? "原位置已被占用。用“还原到…”换个目录" : f.message,
{ description: rows?.find((x) => x.id === f.id)?.originalPath },
);
},
@@ -135,7 +135,7 @@ export default function FilesTrashPage() {
{snap?.title ? (
<p className="text-meta text-muted-foreground">
删除时关联:{snap.title}
{snap.contentUnit ? ` ${snap.contentUnit}` : ""}(还原不会自动恢复资产)
{snap.contentUnit ? ` ${snap.contentUnit}` : ""}(还原后资产不会自动恢复)
</p>
) : null}
</div>
@@ -210,7 +210,7 @@ export default function FilesTrashPage() {
<>
<PageHeader
title="回收站"
description="删除的文件先移到这里,保留 7 天后由后台任务清除;期间可还原到原位置或其他目录。"
description="删除的文件在这里保留到期后自动清除,到期前可以还原。"
actions={
<>
{filesMockEnabled() ? <StatusBadge tone="warning">演示数据</StatusBadge> : null}
@@ -262,7 +262,7 @@ export default function FilesTrashPage() {
</Button>
</>
) : (
<span className="ml-auto text-meta text-muted-foreground">立即清除仅管理员会话可用。</span>
<span className="ml-auto text-meta text-muted-foreground">立即清除需要管理员会话。</span>
)}
</div>
<DataTable
@@ -275,7 +275,7 @@ export default function FilesTrashPage() {
hasMore={trash.hasNextPage}
onLoadMore={() => void trash.fetchNextPage()}
loadingMore={trash.isFetchingNextPage}
empty={{ icon: Trash2, title: "回收站是空的", description: "在文件页删除的项会先移到这里。" }}
empty={{ icon: Trash2, title: "回收站是空的", description: "在文件页删除的项会出现在这里。" }}
/>
<ConfirmDialog
@@ -296,12 +296,12 @@ export default function FilesTrashPage() {
if (!o) setConfirmText("");
}}
title="清空回收站?"
description={`将立即清除全部 ${rows?.length ?? 0} 项(含未到期的),不可恢复。`}
description={`全部 ${rows?.length ?? 0} 项(含未到期)将被清除,不可恢复。`}
confirmLabel="清空"
destructive
onConfirm={() => {
if (confirmText.trim() !== "清空回收站") {
toast.error("请输入“清空回收站”确认");
toast.error("输入“清空回收站”以确认");
return Promise.reject(new Error("unconfirmed"));
}
return doPurge(rows?.map((r) => r.id)).then(() => setConfirmText(""));
@@ -345,7 +345,7 @@ function RestoreToDialog({
<DialogContent className="sm:max-w-lg">
<DialogHeader>
<DialogTitle>还原到…</DialogTitle>
<DialogDescription>{ids.length} 项 · 选一个可写的目录;同名已存在的项会失败,不会覆盖。</DialogDescription>
<DialogDescription>{ids.length} 项 · 选一个可写目录。同名项已存在时跳过,不覆盖。</DialogDescription>
</DialogHeader>
<div className="max-h-80 overflow-y-auto rounded-xl border border-border p-1.5">
<DirTree roots={roots.data ?? []} current={target} onSelect={setTarget} pickOnly />