auto-save 2026-05-14 01:00 (+2, ~2)

This commit is contained in:
2026-05-14 01:00:24 +08:00
parent 7804fd13f8
commit 302631939d
4 changed files with 500 additions and 2 deletions

View File

@@ -2711,6 +2711,13 @@
"type": "session-heartbeat",
"message": "Claude 会话活跃 · 最近命令claude · 2 项未提交变更 · 最近提交auto-save 2026-05-14 00:48 (+4, ~3)",
"files_changed": 2
},
{
"ts": "2026-05-14T00:54:42+08:00",
"type": "commit",
"message": "auto-save 2026-05-14 00:54 (+4, ~2)",
"hash": "7804fd1",
"files_changed": 6
}
]
}

View File

@@ -0,0 +1,19 @@
- generic [active] [ref=e1]:
- main [ref=e3]:
- button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e5]:
- img [ref=e6]
- application [ref=e13]:
- img
- generic "Control Panel" [ref=e16]:
- button "Zoom In" [ref=e17] [cursor=pointer]:
- img [ref=e18]
- button "Zoom Out" [ref=e20] [cursor=pointer]:
- img [ref=e21]
- button "Fit View" [ref=e23] [cursor=pointer]:
- img [ref=e24]
- button "Toggle Interactivity" [ref=e26] [cursor=pointer]:
- img [ref=e27]
- img "Mini Map" [ref=e30]
- region "Notifications alt+T"
- button "Open Next.js Dev Tools" [ref=e37] [cursor=pointer]:
- img [ref=e38]

View File

@@ -0,0 +1,451 @@
- generic [active] [ref=e1]:
- generic [ref=e36] [cursor=pointer]:
- button "Open Next.js Dev Tools" [ref=e37]:
- img [ref=e38]
- generic [ref=e43]:
- button "Open issues overlay" [ref=e44]:
- generic [ref=e45]:
- generic [ref=e46]: "0"
- generic [ref=e47]: "1"
- generic [ref=e48]: Issue
- button "Collapse issues badge" [ref=e49]:
- img [ref=e50]
- main [ref=e53]:
- button "自动排版 · 保留每个节点的尺寸,重新排好间距和列布局" [ref=e55]:
- img [ref=e56]
- button "切到明亮主题" [ref=e62]:
- img [ref=e63]
- generic [ref=e69]:
- generic [ref=e72]:
- generic [ref=e73]:
- img [ref=e74]
- generic [ref=e79]: 分镜头编排
- generic [ref=e80]: 0 分镜 · 0 元素
- generic [ref=e81]: · 组织分镜画面 → 为生成视频做准备
- button "展开编排" [disabled] [ref=e83]:
- img [ref=e84]
- text: 展开编排
- application [ref=e87]:
- generic [ref=e89]:
- generic:
- generic:
- img:
- group "Edge from input to keyframe" [ref=e90] [cursor=pointer]
- img:
- group "Edge from input to asr" [ref=e93] [cursor=pointer]
- img:
- group "Edge from asr to translate"
- img:
- group "Edge from translate to rewrite" [ref=e96] [cursor=pointer]
- img:
- group "Edge from keyframe to storyboard" [ref=e99] [cursor=pointer]
- img:
- group "Edge from rewrite to storyboard" [ref=e102] [cursor=pointer]
- img:
- group "Edge from storyboard to videogen" [ref=e105] [cursor=pointer]
- img:
- group "Edge from videogen to compose" [ref=e108] [cursor=pointer]
- img:
- group "Edge from rewrite to compose" [ref=e111] [cursor=pointer]
- generic:
- group [ref=e114]:
- generic [ref=e115]:
- generic [ref=e116]:
- button "再上传一个视频" [ref=e117]:
- img [ref=e118]
- generic [ref=e119]:
- button "64.5s" [ref=e120]:
- generic [ref=e122]: 64.5s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 64.5s
- generic [ref=e123]:
- button "72.4s" [ref=e124]:
- generic [ref=e126]: 72.4s
- generic:
- generic:
- generic:
- generic: 576×1024
- generic: 72.4s
- generic [ref=e127]:
- button "64.5s" [ref=e128]:
- generic [ref=e130]: 64.5s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 64.5s
- generic [ref=e131]:
- button "71.4s" [ref=e132]:
- generic [ref=e134]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e135]:
- button "72.4s" [ref=e136]:
- generic [ref=e138]: 72.4s
- generic:
- generic:
- generic:
- generic: 576×1024
- generic: 72.4s
- generic [ref=e139]:
- button "71.4s" [ref=e140]:
- generic [ref=e142]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e143]:
- button "71.4s" [ref=e144]:
- generic [ref=e146]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e147]:
- button "71.4s" [ref=e148]:
- generic [ref=e150]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e151]:
- button "71.4s" [ref=e152]:
- generic [ref=e154]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e155]:
- button "71.4s" [ref=e156]:
- generic [ref=e158]: 71.4s
- generic:
- generic:
- generic:
- generic: 1080×1920
- generic: 71.4s
- generic [ref=e159]:
- button "8.0s" [ref=e160]:
- generic [ref=e162]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e163]:
- button "8.0s" [ref=e164]:
- generic [ref=e166]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e167]:
- button "8.0s" [ref=e168]:
- generic [ref=e170]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- generic [ref=e171]:
- button "8.0s" [ref=e172]:
- generic [ref=e174]: 8.0s
- generic:
- generic:
- generic:
- generic: 640×360
- generic: 8.0s
- button "…" [ref=e176]:
- img [ref=e178]
- generic [ref=e180]:
- button "…" [ref=e182]:
- img [ref=e184]
- generic [ref=e186]:
- button "…" [ref=e188]:
- img [ref=e190]
- generic [ref=e192]:
- generic [ref=e193]:
- generic [ref=e194]:
- img [ref=e196]
- generic [ref=e199]: 输入 · Input
- generic [ref=e200]:
- img [ref=e201]
- button "钉住 · 锁定位置与尺寸" [ref=e205]:
- img [ref=e206]
- generic [ref=e209]:
- generic [ref=e210]: STEP 1 · 视频就绪 · 完成
- textbox "再加一个 TK 链接" [ref=e211]
- generic [ref=e212]:
- button "+ 加链接" [disabled] [ref=e213]
- button "再传一个" [ref=e214]:
- img [ref=e215]
- text: 再传一个
- generic [ref=e218]:
- generic [ref=e219]: 1080×1920 · 64.5s
- generic [ref=e220]: 🔗 链接
- button "重新解析" [ref=e221]
- generic "拖动调整宽度" [ref=e223]
- generic "拖动调整大小(宽 × 高)" [ref=e224]
- group [ref=e225]:
- generic [ref=e226]:
- generic [ref=e227]:
- generic [ref=e228]:
- button "frame 9 1.7s" [ref=e229]:
- img "frame 9" [ref=e230]
- generic [ref=e231]: 1.7s
- button "📋" [ref=e232]
- button "删除该关键帧" [ref=e233]:
- img [ref=e234]
- generic:
- generic:
- generic:
- generic: 分镜 10
- generic: 1.66s
- generic [ref=e237]:
- button "frame 0 ✨ 24.7s" [ref=e238]:
- img "frame 0" [ref=e239]
- generic "已清洗" [ref=e241]: ✨
- generic [ref=e242]: 24.7s
- button "📋" [ref=e243]
- button "删除该关键帧" [ref=e244]:
- img [ref=e245]
- generic:
- generic:
- generic:
- generic: 分镜 1
- generic: 24.73s
- generic [ref=e248]:
- button "frame 1 33.6s" [ref=e249]:
- img "frame 1" [ref=e250]
- generic [ref=e251]: 33.6s
- button "📋" [ref=e252]
- button "删除该关键帧" [ref=e253]:
- img [ref=e254]
- generic:
- generic:
- generic:
- generic: 分镜 2
- generic: 33.61s
- generic [ref=e257]:
- button "frame 2 37.7s" [ref=e258]:
- img "frame 2" [ref=e259]
- generic [ref=e260]: 37.7s
- button "📋" [ref=e261]
- button "删除该关键帧" [ref=e262]:
- img [ref=e263]
- generic:
- generic:
- generic:
- generic: 分镜 3
- generic: 37.70s
- generic [ref=e266]:
- button "frame 3 39.4s" [ref=e267]:
- img "frame 3" [ref=e268]
- generic [ref=e269]: 39.4s
- button "📋" [ref=e270]
- button "删除该关键帧" [ref=e271]:
- img [ref=e272]
- generic:
- generic:
- generic:
- generic: 分镜 4
- generic: 39.42s
- generic [ref=e275]:
- button "frame 4 1 43.1s" [ref=e276]:
- img "frame 4" [ref=e277]
- generic "1 个元素已抠图" [ref=e279]: "1"
- generic [ref=e280]: 43.1s
- button "📋" [ref=e281]
- button "删除该关键帧" [ref=e282]:
- img [ref=e283]
- generic:
- generic:
- generic:
- generic: 分镜 5
- generic: 43.13s
- generic [ref=e286]:
- button "frame 5 45.0s" [ref=e287]:
- img "frame 5" [ref=e288]
- generic [ref=e289]: 45.0s
- button "📋" [ref=e290]
- button "删除该关键帧" [ref=e291]:
- img [ref=e292]
- generic:
- generic:
- generic:
- generic: 分镜 6
- generic: 45.05s
- generic [ref=e295]:
- button "frame 6 53.6s" [ref=e296]:
- img "frame 6" [ref=e297]
- generic [ref=e298]: 53.6s
- button "📋" [ref=e299]
- button "删除该关键帧" [ref=e300]:
- img [ref=e301]
- generic:
- generic:
- generic:
- generic: 分镜 7
- generic: 53.60s
- generic [ref=e304]:
- button "frame 7 56.0s" [ref=e305]:
- img "frame 7" [ref=e306]
- generic [ref=e307]: 56.0s
- button "📋" [ref=e308]
- button "删除该关键帧" [ref=e309]:
- img [ref=e310]
- generic:
- generic:
- generic:
- generic: 分镜 8
- generic: 55.96s
- generic [ref=e313]:
- button "frame 8 58.4s" [ref=e314]:
- img "frame 8" [ref=e315]
- generic [ref=e316]: 58.4s
- button "📋" [ref=e317]
- button "删除该关键帧" [ref=e318]:
- img [ref=e319]
- generic:
- generic:
- generic:
- generic: 分镜 9
- generic: 58.39s
- generic [ref=e322]:
- generic [ref=e324]:
- img [ref=e326]
- generic [ref=e330]: 镜头拆解 · 元素提取
- generic [ref=e331]:
- img [ref=e332]
- button "钉住 · 锁定位置与尺寸" [ref=e336]:
- img [ref=e337]
- generic [ref=e340]:
- generic [ref=e341]: STEP 2 · 0/10 入编排 · 完成
- generic [ref=e342]:
- text: 自动 10 张 ·
- generic [ref=e343]: 1 已清洗
- text: ·
- generic [ref=e344]: 1/2 已抠图
- text: 点缩略图 → 清洗水印 / 提取可借鉴元素 → 改造成 SKG 画面素材
- generic "拖动调整宽度" [ref=e346]
- generic "拖动调整大小(宽 × 高)" [ref=e347]
- group [ref=e348]:
- generic [ref=e349]:
- generic [ref=e351]:
- img [ref=e353]
- generic [ref=e356]: 声音文案 · ASR
- button "钉住 · 锁定位置与尺寸" [ref=e359]:
- img [ref=e360]
- generic [ref=e363]:
- generic [ref=e364]: STEP 3 · 可选文案轨 · 待运行
- generic [ref=e365]: Gemini 2.5 · 英文带时间戳分段
- generic "拖动调整宽度" [ref=e367]
- generic "拖动调整大小(宽 × 高)" [ref=e368]
- group [ref=e369]:
- generic [ref=e370]:
- generic [ref=e372]:
- img [ref=e374]
- generic [ref=e378]: 翻译理解 · Translate
- button "钉住 · 锁定位置与尺寸" [ref=e381]:
- img [ref=e382]
- generic [ref=e385]:
- generic [ref=e386]: STEP 4 · EN → ZH · 待运行
- generic [ref=e387]: 中文翻译 · 段落级 · 实时输出
- generic "拖动调整宽度" [ref=e389]
- generic "拖动调整大小(宽 × 高)" [ref=e390]
- group [ref=e391]:
- generic [ref=e392]:
- generic [ref=e394]:
- button "透明骷髅" [ref=e395]:
- img "透明骷髅" [ref=e396]
- button "📋" [ref=e397]
- generic:
- generic:
- generic:
- generic: 分镜 5
- generic: 43.13s
- generic [ref=e398]:
- generic [ref=e400]:
- img [ref=e402]
- generic [ref=e407]: 元素改造 · Storyboard
- generic [ref=e408]:
- img [ref=e409]
- button "钉住 · 锁定位置与尺寸" [ref=e413]:
- img [ref=e414]
- generic [ref=e417]:
- generic [ref=e418]: STEP 6 · 参考元素 → SKG 画面 · 完成
- generic [ref=e419]:
- text: 不是复刻原视频:先把参考图里的主体 / 场景 / 动作 / 道具拆出来,再替换成 SKG 产品画面。
- generic [ref=e420]: 已有 1 个提取元素 · 0 个分镜进入编排
- button "进入分镜编排" [disabled] [ref=e421]
- generic "拖动调整宽度" [ref=e423]
- generic "拖动调整大小(宽 × 高)" [ref=e424]
- group [ref=e425]:
- generic [ref=e426]:
- generic [ref=e428]:
- img [ref=e430]
- generic [ref=e434]: 产品文案 · Rewrite
- button "钉住 · 锁定位置与尺寸" [ref=e437]:
- img [ref=e438]
- generic [ref=e441]:
- generic [ref=e442]: STEP 5 · 接 SKG 卖点 · 待运行
- textbox "粘贴 SKG 产品信息 / 关键卖点(可作为视频脚本和镜头动作参考)" [disabled] [ref=e443]
- generic [ref=e444]: 下一冲刺接入
- generic "拖动调整宽度" [ref=e446]
- generic "拖动调整大小(宽 × 高)" [ref=e447]
- group [ref=e448]:
- generic [ref=e450]:
- generic [ref=e452]:
- img [ref=e454]
- generic [ref=e456]: 生成视频 · Video Gen
- button "钉住 · 锁定位置与尺寸" [ref=e459]:
- img [ref=e460]
- generic [ref=e463]:
- generic [ref=e464]: STEP 7 · 首帧 + 动作 prompt · 待运行
- generic [ref=e465]:
- generic [ref=e466]: Seedance
- generic [ref=e467]: Kling
- generic [ref=e468]: Veo 3
- generic "拖动调整宽度" [ref=e470]
- generic "拖动调整大小(宽 × 高)" [ref=e471]
- group [ref=e472]:
- generic [ref=e473]:
- generic [ref=e475]:
- img [ref=e477]
- generic [ref=e481]: 合成成品 · Compose
- button "钉住 · 锁定位置与尺寸" [ref=e484]:
- img [ref=e485]
- generic [ref=e488]:
- generic [ref=e489]: STEP 8 · ffmpeg + 字幕 · 待运行
- generic [ref=e490]:
- text: 视频片段 + 字幕 / TTS
- text: → 最终 mp4 输出
- generic "拖动调整宽度" [ref=e491]
- generic "拖动调整大小(宽 × 高)" [ref=e492]
- img
- generic "Control Panel" [ref=e493]:
- button "Zoom In" [ref=e494] [cursor=pointer]:
- img [ref=e495]
- button "Zoom Out" [ref=e497] [cursor=pointer]:
- img [ref=e498]
- button "Fit View" [ref=e500] [cursor=pointer]:
- img [ref=e501]
- button "Toggle Interactivity" [ref=e503] [cursor=pointer]:
- img [ref=e504]
- img "Mini Map" [ref=e507]
- region "Notifications alt+T":
- list:
- listitem [ref=e517]:
- img [ref=e519]
- generic [ref=e522]: 📥 视频已就绪 — 请点 Input 节点里的「点这里开始解析」按钮
- alert [ref=e523]

View File

@@ -1,9 +1,14 @@
"use client"
import { type ReactNode } from "react"
import { type ReactNode, useEffect, useRef } from "react"
import { Handle, Position } from "@xyflow/react"
import { CheckCircle2, Loader2, AlertCircle, Pin } from "lucide-react"
import { ResizeRight, ResizeBR } from "./resize-handle"
// 节点正文 zoom 范围:基准 320px (= 1),到 640px 时放大到 ~1.6
const BASE_WIDTH = 320
const MIN_ZOOM = 1
const MAX_ZOOM = 1.6
export type NodeKind = "input" | "process" | "ai" | "output"
export type NodeStatus = "pending" | "running" | "done" | "failed"
@@ -50,8 +55,24 @@ export function NodeShell({
onTogglePin,
children,
}: Props) {
const rootRef = useRef<HTMLDivElement>(null)
const bodyRef = useRef<HTMLDivElement>(null)
// 卡片宽度变化 → 给 body 设 zoom让内部文字 / 按钮 / 间距按比例放大
useEffect(() => {
const root = rootRef.current
const body = bodyRef.current
if (!root || !body) return
const ro = new ResizeObserver(() => {
const w = root.clientWidth
const zoom = Math.min(MAX_ZOOM, Math.max(MIN_ZOOM, w / BASE_WIDTH))
body.style.zoom = String(zoom)
})
ro.observe(root)
return () => ro.disconnect()
}, [])
return (
<div
ref={rootRef}
className={`glass-node ${selected ? "glass-node--selected" : ""} ${status === "running" ? "glass-node--running" : ""} ${pinned ? "glass-node--pinned" : ""}`}
data-type={type}
style={{ width, height: "100%" }}
@@ -84,7 +105,7 @@ export function NodeShell({
</span>
</div>
<div className="glass-node__body">
<div ref={bodyRef} className="glass-node__body">
{subtitle && (
<div className="text-[11px] mb-2 glass-node__kbd uppercase tracking-widest">
{subtitle} · {STATUS_LABEL[status]}