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:
1 parent
b839ed4056
commit
16ab2a6c84
97 files changed
+592
-648
No files matched your search
@@ -77,7 +77,7 @@ import { cn, formatBytes } from "~/lib/utils.ts";
|
||||
|
||||
const HEALTH_REASON: Record<string, string> = {
|
||||
root_missing: "挂载点不存在",
|
||||
sentinel_missing: "根目录里找不到哨兵文件,可能挂载未生效",
|
||||
sentinel_missing: "根目录里没有哨兵文件,挂载可能未生效",
|
||||
timeout: "探测超时",
|
||||
permission_denied: "没有读取权限",
|
||||
};
|
||||
@@ -247,7 +247,7 @@ export default function FilesPage() {
|
||||
setQInput("");
|
||||
};
|
||||
const open = (e: FileEntry) => {
|
||||
if (e.escape) return toast.error("链接指向登记根之外,已禁用");
|
||||
if (e.escape) return toast.error("链接指向登记目录之外,不能打开");
|
||||
if (e.type === "dir") go({ root: rootId, path: e.path });
|
||||
else patch({ sel: e.path });
|
||||
};
|
||||
@@ -267,9 +267,7 @@ export default function FilesPage() {
|
||||
onSuccess: (r) => {
|
||||
const ok = r.items.filter((i) => i.status === "ok").length;
|
||||
toast.success(`探测完成:${ok}/${r.items.length} 个读到媒体信息`, {
|
||||
description: r.items.some((i) => i.savedToAsset)
|
||||
? "已登记资产已写回媒体信息"
|
||||
: "未登记文件的结果缓存 24 小时",
|
||||
description: r.items.some((i) => i.savedToAsset) ? "媒体信息已写入资产" : "未登记文件的结果缓存 24 小时",
|
||||
});
|
||||
},
|
||||
onError: (err) => toast.error(filesErrorText(err, "探测失败")),
|
||||
@@ -308,7 +306,7 @@ export default function FilesPage() {
|
||||
if (multi)
|
||||
items.push({
|
||||
key: "wizard",
|
||||
label: `整理向导(${list.length} 项)`,
|
||||
label: `整理 ${list.length} 项…`,
|
||||
icon: Wand2,
|
||||
disabled: why("organize"),
|
||||
onSelect: () => setDialog({ kind: "wizard", entries: list }),
|
||||
@@ -334,7 +332,7 @@ export default function FilesPage() {
|
||||
key: "copy",
|
||||
label: "复制到…",
|
||||
icon: Copy,
|
||||
disabled: e.escape ? "链接指向登记根之外,已禁用" : null,
|
||||
disabled: e.escape ? "链接指向登记目录之外" : null,
|
||||
onSelect: () => setDialog({ kind: "transfer", items: refs(list), mode: "copy" }),
|
||||
},
|
||||
);
|
||||
@@ -422,7 +420,7 @@ export default function FilesPage() {
|
||||
if (items.every((i) => i.root === target.root && parentRel(i.path) === target.path)) return;
|
||||
}
|
||||
const tRoot = rootList.find((r) => r.id === target.root);
|
||||
if (!tRoot?.writable) return toast.error("只能拖到可写的媒体库根");
|
||||
if (!tRoot?.writable) return toast.error("只能拖到可写的库根");
|
||||
setDialog({ kind: "transfer", items, mode: ev.altKey ? "copy" : "move", target });
|
||||
};
|
||||
|
||||
@@ -443,8 +441,8 @@ export default function FilesPage() {
|
||||
<EmptyState
|
||||
plain
|
||||
icon={FolderTree}
|
||||
title="还没有可浏览的根"
|
||||
description="在系统设置里登记媒体库根或下载器路径映射后出现在这里。"
|
||||
title="还没有库根"
|
||||
description="在系统设置里登记库根或下载器路径映射。"
|
||||
className="px-2 py-8"
|
||||
/>
|
||||
) : null}
|
||||
@@ -473,7 +471,7 @@ export default function FilesPage() {
|
||||
<p className="text-lead font-medium text-foreground">{root.name} 离线</p>
|
||||
<p className="mt-1.5 max-w-md text-caption text-muted-foreground">
|
||||
{offline ? filesErrorText(list.error) : healthReasonText(root.healthReason)}
|
||||
。不会把离线当成空目录,也不会改变任何资产状态。
|
||||
。离线期间资产状态不变。
|
||||
</p>
|
||||
<p className="mt-1 text-meta text-muted-foreground">上次检查:{relTime(root.checkedAt)}</p>
|
||||
<Button
|
||||
@@ -506,7 +504,7 @@ export default function FilesPage() {
|
||||
plain
|
||||
icon={SearchX}
|
||||
title="没有符合筛选的项"
|
||||
description={q ? `搜索“${q}”没有结果;支持子串与 glob(如 *.mkv)。` : undefined}
|
||||
description={q ? `没有匹配“${q}”的项。支持子串与 glob,如 *.mkv` : undefined}
|
||||
action={
|
||||
<Button variant="outline" size="sm" onClick={clearFilters}>
|
||||
<X />
|
||||
@@ -519,7 +517,7 @@ export default function FilesPage() {
|
||||
plain
|
||||
icon={FolderOpen}
|
||||
title="空目录"
|
||||
description={hidden ? undefined : "隐藏文件未显示,可在工具栏打开。"}
|
||||
description={hidden ? undefined : "隐藏文件未显示。"}
|
||||
action={
|
||||
root.writable ? (
|
||||
<Button variant="outline" size="sm" onClick={() => setDialog({ kind: "mkdir" })}>
|
||||
@@ -617,7 +615,7 @@ export default function FilesPage() {
|
||||
<>
|
||||
<PageHeader
|
||||
title="文件"
|
||||
description="只浏览已登记的库根与下载目录;每行带业务状态,删除进回收站,改名同步资产与路径绑定。"
|
||||
description="已登记的库根与下载目录。删除先进回收站,改名同步更新资产。"
|
||||
actions={
|
||||
<>
|
||||
{filesMockEnabled() ? <StatusBadge tone="warning">演示数据</StatusBadge> : null}
|
||||
@@ -790,7 +788,7 @@ export default function FilesPage() {
|
||||
|
||||
{first?.truncated ? (
|
||||
<div role="status" className="border-b border-warning/30 bg-warning/10 px-3 py-1.5 text-meta text-warning">
|
||||
目录过大,只读取了前 {first.total.toLocaleString("zh-CN")} 项。请用搜索或进入子目录缩小范围。
|
||||
目录过大,只读取了前 {first.total.toLocaleString("zh-CN")} 项。用搜索或进入子目录缩小范围。
|
||||
</div>
|
||||
) : null}
|
||||
|
||||
|
||||
Reference in new issue
Block a user