auto-save 2026-05-18 20:19 (~2)

This commit is contained in:
2026-05-18 20:19:24 +08:00
parent 69bb692a58
commit b886e02746
2 changed files with 28 additions and 28 deletions

View File

@@ -1,12 +1,5 @@
{
"entries": [
{
"files_changed": 1,
"hash": "7067a2b",
"message": "auto-save 2026-05-16 14:51 (~1)",
"ts": "2026-05-16T14:51:52+08:00",
"type": "commit"
},
{
"files_changed": 1,
"hash": "2a259cc",
@@ -3217,6 +3210,13 @@
"type": "session-heartbeat",
"message": "Codex 会话活跃 · 最近命令codex · 分支 main · 2 项未提交变更 · 最近提交feat: enforce english prompt language strategy",
"files_changed": 2
},
{
"ts": "2026-05-18T20:13:59+08:00",
"type": "commit",
"message": "auto-save 2026-05-18 20:13 (~3)",
"hash": "69bb692",
"files_changed": 3
}
]
}

View File

@@ -401,7 +401,7 @@ function statusTone(job: Job | null) {
if (!job) return { label: "等待素材", className: "border-white/10 text-white/50 bg-white/[0.03]" }
if (job.status === "failed") return { label: "失败", className: "border-rose-400/30 text-rose-200 bg-rose-500/10" }
if (["created", "downloading", "splitting", "transcribing"].includes(job.status)) {
return { label: "处理中", className: "border-cyan-300/30 text-cyan-100 bg-cyan-400/10" }
return { label: "处理中", className: "border-[#d6b36a]/34 text-[#f5d98e] bg-[#d6b36a]/10" }
}
return { label: "可编辑", className: "border-emerald-300/30 text-emerald-100 bg-emerald-400/10" }
}
@@ -2520,7 +2520,7 @@ function SourceKeyframePicker({
onClick={onExtract}
disabled={!job.video_url || extracting || job.status === "splitting"}
title="自动按动作峰值抽 12 张参考帧,更偏向手势、表情变化、节奏点和镜头变化"
className="inline-flex h-7 items-center justify-center gap-1 rounded-md bg-white px-2 text-[10.5px] font-semibold text-black transition hover:bg-white/90 disabled:cursor-not-allowed disabled:opacity-40"
className="skg-primary-action inline-flex h-7 items-center justify-center gap-1 px-2 text-[10.5px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{extracting || job.status === "splitting" ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Scissors className="h-3.5 w-3.5" />}
12
@@ -2911,7 +2911,7 @@ function SourceReferenceBuildPanel({
type="button"
onClick={() => void loadSubjectTemplateLibrary()}
disabled={templateLibraryBusy}
className="inline-flex h-7 items-center gap-1 rounded border border-white/10 bg-white/[0.045] px-2 text-[10px] font-semibold text-white/58 transition hover:border-cyan-300/35 hover:text-cyan-100 disabled:cursor-wait disabled:opacity-50"
className="skg-secondary-action inline-flex h-7 items-center gap-1 px-2 text-[10px] font-semibold transition disabled:cursor-wait disabled:opacity-50"
>
{templateLibraryBusy ? <Loader2 className="h-3 w-3 animate-spin" /> : <RefreshCw className="h-3 w-3" />}
{subjectTemplateLibrary.length}
@@ -2929,8 +2929,8 @@ function SourceReferenceBuildPanel({
onClick={() => setSubjectMode(item.value)}
className={`flex min-h-[48px] items-start gap-2 rounded-md border px-2.5 py-2 text-left transition ${
subjectMode === item.value
? "border-cyan-200/65 bg-cyan-300/12 text-cyan-50"
: "border-white/10 bg-black/24 text-white/50 hover:border-cyan-200/30 hover:text-white/78"
? "border-[#d6b36a]/65 bg-[#d6b36a]/12 text-[#f5d98e]"
: "border-white/10 bg-black/24 text-white/50 hover:border-[#d6b36a]/35 hover:text-white/78"
}`}
>
<span className="mt-0.5 shrink-0">{subjectMode === item.value ? <Check className="h-3.5 w-3.5" /> : <Circle className="h-3.5 w-3.5" />}</span>
@@ -2959,10 +2959,10 @@ function SourceReferenceBuildPanel({
setSubjectStyle(template.subject_style || "transparent_human")
}}
className={`group relative rounded-md border p-1.5 text-left transition ${
active ? "border-cyan-200/75 bg-cyan-300/12 text-cyan-50" : "border-white/10 bg-black/24 text-white/58 hover:border-cyan-200/35 hover:text-white/82"
active ? "border-[#d6b36a]/75 bg-[#d6b36a]/12 text-[#f5d98e]" : "border-white/10 bg-black/24 text-white/58 hover:border-[#d6b36a]/35 hover:text-white/82"
}`}
>
{active ? <span className="absolute right-2 top-2 z-10 rounded-full bg-cyan-200 p-0.5 text-black"><Check className="h-3 w-3" /></span> : null}
{active ? <span className="absolute right-2 top-2 z-10 rounded-full bg-[#d6b36a] p-0.5 text-black"><Check className="h-3 w-3" /></span> : null}
<span className="block aspect-[4/5] overflow-hidden rounded border border-white/10 bg-white">
{preview ? <img src={subjectTemplateImageUrl(preview.filename)} alt={template.name} className="h-full w-full object-cover" /> : null}
</span>
@@ -2985,10 +2985,10 @@ function SourceReferenceBuildPanel({
setSubjectStyle("transparent_human")
}}
className={`group relative rounded-md border p-1.5 text-left transition ${
active ? "border-cyan-200/75 bg-cyan-300/12 text-cyan-50" : "border-white/10 bg-black/24 text-white/58 hover:border-cyan-200/35 hover:text-white/82"
active ? "border-[#d6b36a]/75 bg-[#d6b36a]/12 text-[#f5d98e]" : "border-white/10 bg-black/24 text-white/58 hover:border-[#d6b36a]/35 hover:text-white/82"
}`}
>
{active ? <span className="absolute right-2 top-2 z-10 rounded-full bg-cyan-200 p-0.5 text-black"><Check className="h-3 w-3" /></span> : null}
{active ? <span className="absolute right-2 top-2 z-10 rounded-full bg-[#d6b36a] p-0.5 text-black"><Check className="h-3 w-3" /></span> : null}
<span className="block aspect-[4/5] overflow-hidden rounded border border-white/10 bg-white">
{preview ? <img src={characterLibraryImageUrl(preview.filename)} alt={character.name} className="h-full w-full object-cover" /> : null}
</span>
@@ -3000,7 +3000,7 @@ function SourceReferenceBuildPanel({
</div>
</div>
) : (
<div className="rounded-md border border-cyan-200/18 bg-cyan-300/[0.06] px-2.5 py-2 text-[10px] leading-snug text-cyan-50/62">
<div className="rounded-md border border-[#d6b36a]/18 bg-[#d6b36a]/[0.06] px-2.5 py-2 text-[10px] leading-snug text-white/62">
</div>
)}
@@ -3038,7 +3038,7 @@ function SourceReferenceBuildPanel({
onClick={() => void saveGeneratedSubjectTemplate()}
disabled={!visibleActorAssets.length || !templateDraftName.trim() || templateSaveBusy}
title={!visibleActorAssets.length ? "先生成主体视图" : !templateDraftName.trim() ? "先填写模板名称" : "保存到主体模板库"}
className="inline-flex h-8 items-center justify-center gap-1 rounded-md border border-white/10 bg-white/[0.055] px-3 text-[10.5px] font-semibold text-white/62 transition hover:border-cyan-300/35 hover:text-cyan-100 disabled:cursor-not-allowed disabled:opacity-35"
className="skg-secondary-action inline-flex h-8 items-center justify-center gap-1 px-3 text-[10.5px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-35"
>
{templateSaveBusy ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Plus className="h-3.5 w-3.5" />}
@@ -3234,7 +3234,7 @@ function SourceReferenceBuildPanel({
type="button"
onClick={() => void generateSimilarActor()}
disabled={!frames.length || subjectBusy || templateRequired || !selectedSubjectViews.length}
className="inline-flex h-9 min-w-[170px] items-center justify-center gap-1 rounded-md bg-white px-3 text-[11px] font-semibold text-black transition hover:bg-white/90 disabled:cursor-not-allowed disabled:opacity-40"
className="skg-primary-action inline-flex h-9 min-w-[170px] items-center justify-center gap-1 px-3 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{subjectBusy ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Sparkles className="h-3.5 w-3.5" />}
{subjectBusyFor ? `生成中 · ${subjectBusyFor.jobLabel}` : generationCtaLabel}
@@ -3779,7 +3779,7 @@ function AudioStoryboardPlanPanel({
type="button"
onClick={() => void reanalyzeProductViews()}
disabled={!productItems.length || productAnalyzing || !!productAngleBusy}
className="inline-flex h-9 items-center justify-center gap-1 rounded-md border border-white/10 bg-white/[0.055] px-2.5 text-[11px] font-semibold text-white/72 transition hover:border-white/25 hover:bg-white/[0.1] disabled:cursor-not-allowed disabled:opacity-40"
className="skg-secondary-action inline-flex h-9 items-center justify-center gap-1 px-2.5 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{productAnalyzing ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Wand2 className="h-3.5 w-3.5" />}
@@ -3788,7 +3788,7 @@ function AudioStoryboardPlanPanel({
type="button"
onClick={() => productFileRef.current?.click()}
disabled={!job || productUploading || productAnalyzing || !!productAngleBusy}
className="inline-flex h-9 items-center justify-center gap-1 rounded-md border border-white/10 bg-white/[0.055] px-2.5 text-[11px] font-semibold text-white/72 transition hover:border-white/25 hover:bg-white/[0.1] disabled:cursor-not-allowed disabled:opacity-40"
className="skg-secondary-action inline-flex h-9 items-center justify-center gap-1 px-2.5 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{productUploading ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Upload className="h-3.5 w-3.5" />}
@@ -3844,7 +3844,7 @@ function AudioStoryboardPlanPanel({
<button
type="button"
onClick={() => setShowChineseMirror((value) => !value)}
className="inline-flex h-9 items-center justify-center rounded-md border border-white/10 bg-white/[0.045] px-2.5 text-[11px] font-semibold text-white/60 transition hover:border-white/25 hover:text-white"
className="skg-secondary-action inline-flex h-9 items-center justify-center px-2.5 text-[11px] font-semibold transition"
>
{showChineseMirror ? "收起中文" : "显示中文"}
</button>
@@ -3852,7 +3852,7 @@ function AudioStoryboardPlanPanel({
type="button"
onClick={() => void rewriteAllRows()}
disabled={scriptRewriteBusy !== null || !rows.length}
className="inline-flex h-9 items-center justify-center gap-1 rounded-md bg-white px-2.5 text-[11px] font-semibold text-black transition hover:bg-white/90 disabled:cursor-not-allowed disabled:opacity-40"
className="skg-primary-action inline-flex h-9 items-center justify-center gap-1 px-2.5 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{scriptRewriteBusy === "all" ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Wand2 className="h-3.5 w-3.5" />}
@@ -3864,7 +3864,7 @@ function AudioStoryboardPlanPanel({
setCopyZhOverrides({})
}}
disabled={scriptRewriteBusy !== null || !Object.keys(copyOverrides).length}
className="inline-flex h-9 items-center justify-center rounded-md border border-white/10 bg-white/[0.045] px-2.5 text-[11px] font-semibold text-white/60 transition hover:border-white/25 hover:text-white disabled:cursor-not-allowed disabled:opacity-35"
className="skg-secondary-action inline-flex h-9 items-center justify-center px-2.5 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-35"
>
稿
</button>
@@ -3872,7 +3872,7 @@ function AudioStoryboardPlanPanel({
type="button"
onClick={() => void saveAllStoryboardDrafts()}
disabled={batchStoryboardSaveBusy || !rows.length || !orderedFrames.length}
className="inline-flex h-9 items-center justify-center gap-1 rounded-md bg-white px-2.5 text-[11px] font-semibold text-black transition hover:bg-white/90 disabled:cursor-not-allowed disabled:opacity-40"
className="skg-primary-action inline-flex h-9 items-center justify-center gap-1 px-2.5 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{batchStoryboardSaveBusy ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Check className="h-3.5 w-3.5" />}
@@ -3975,10 +3975,10 @@ function AudioStoryboardPlanPanel({
value={plannedRow.subjectDescription}
onChange={(event) => patchRowPlan(row.index, { subjectDescription: event.target.value })}
placeholder="人物描述:主体身份、姿态、情绪、需要用哪些视角"
className="min-h-[42px] w-full resize-y rounded border border-violet-300/12 bg-violet-300/[0.04] px-2 py-1.5 text-[10.5px] leading-snug text-violet-50/78 outline-none placeholder:text-white/25 focus:border-violet-300/50"
className="min-h-[42px] w-full resize-y rounded border border-[#d6b36a]/14 bg-[#d6b36a]/[0.045] px-2 py-1.5 text-[10.5px] leading-snug text-white/78 outline-none placeholder:text-white/25 focus:border-[#d6b36a]/50"
/>
{showChineseMirror && plannedRow.subjectDescriptionZh ? (
<p className="-mt-1 line-clamp-2 text-[10px] leading-snug text-violet-100/34" title={plannedRow.subjectDescriptionZh}>{plannedRow.subjectDescriptionZh}</p>
<p className="-mt-1 line-clamp-2 text-[10px] leading-snug text-white/34" title={plannedRow.subjectDescriptionZh}>{plannedRow.subjectDescriptionZh}</p>
) : null}
</>
)}
@@ -4089,7 +4089,7 @@ function AudioStoryboardPlanPanel({
type="button"
onClick={() => void saveSingleRowStoryboardDraft(plannedRow, referenceFrame)}
disabled={!referenceFrame || savingStoryboard}
className="mt-1.5 inline-flex h-8 w-full items-center justify-center gap-1 rounded-md bg-white px-2 text-[11px] font-semibold text-black transition hover:bg-white/90 disabled:cursor-not-allowed disabled:opacity-40"
className="skg-primary-action mt-1.5 inline-flex h-8 w-full items-center justify-center gap-1 px-2 text-[11px] font-semibold transition disabled:cursor-not-allowed disabled:opacity-40"
>
{savingStoryboard ? <Loader2 className="h-3.5 w-3.5 animate-spin" /> : <Check className="h-3.5 w-3.5" />}