diff --git a/.memory/assistant-handoff.md b/.memory/assistant-handoff.md index f19cd51..f0bf09f 100644 --- a/.memory/assistant-handoff.md +++ b/.memory/assistant-handoff.md @@ -1,6 +1,6 @@ # 项目接力 -- 生成时间:May 19, 2026 at 08:44 +- 生成时间:May 20, 2026 at 13:43 - 项目:SKG Marketing Studio / SKG 营销内容工作台 - 路径:/Users/kangwan/Projects/business/20260512-20260512-skg-tk-二创验证 - 状态:active @@ -9,8 +9,8 @@ ## 最近助手会话概览 - Claude:be53a031-9311-4ee8-b822-d4cfb4f5e78b · 时间未知 -- Codex:019e3dae-6045-7203-bf4e-8fbeae65cadf · 时间未知 -- Cursor:3e4af548-3b65-45a5-8698-6e75510f24b5 · May 19, 2026 at 08:43 +- Codex:019e3db1-012e-7163-bc78-acf7cde326e7 · 时间未知 +- Cursor:未找到匹配当前项目的最近会话 ## Claude 最近会话 @@ -44,64 +44,37 @@ ## Codex 最近会话 -- Session ID:019e3dae-6045-7203-bf4e-8fbeae65cadf -- Transcript:/Users/kangwan/.codex/sessions/2026/05/19/rollout-2026-05-19T08-41-38-019e3dae-6045-7203-bf4e-8fbeae65cadf.jsonl +- Session ID:019e3db1-012e-7163-bc78-acf7cde326e7 +- Transcript:/Users/kangwan/.codex/sessions/2026/05/19/rollout-2026-05-19T08-44-30-019e3db1-012e-7163-bc78-acf7cde326e7.jsonl - 工作目录:/Users/kangwan/Projects/business/20260512-20260512-skg-tk-二创验证 - 分支:main - 敏感字段:已对 token / key / password / secret 做脱敏 ### 最近用户要求 -- # AGENTS.md instructions for /Users/kangwan/Projects/business/20260512-20260512-skg-tk-二创验证 # SKG AI 素材管线 - TK 二创验证 Agent Rules ## Must Read First - `.project.json` 是机器真源:公网链接、快捷登录、凭证引用都以它为准 - `RULES.md` 是人工规则和部署事实:启动命令、平台、域名、注意事项都写这里 - 工作看板全局规则是本项目的开发收口默认规则;本地规则缺失时按 `/Users/kangwan/Projects/code/20260317-rules-dashboard/RULES.md`、`SCHEMA.md`、`rules/03-Git约定.md`、`rules/04-版本发布规则.md` 补齐 - 不允许编造不存在的域名、账号、密码;未知就保持空白并明确标记待补充 ## Development Ledger Contract - 开发任务结束前必须执行并汇报 `git status -sb` - 功能、修复、规则或部署元数据变更完成后,必须创建人工语义 commit;`auto-save` 只算安全快照 - Gitea 是主远端,`origin` 必须指向 Gitea;… -- 你现在是在 Codex CLI 里的项目承接会话。 这不是对话立项台;项目目录已经存在,当前目标是接住上下文并等待用户下一步。 项目路径:/Users/kangwan/Projects/business/20260512-20260512-skg-tk-二创验证 承接步骤: - 先读取 `.memory/assistant-handoff.md` - 再阅读 `.project.json`、`RULES.md`、`AGENTS.md` - 结合当前仓库状态建立上下文 要求: - 不要要求用户重新粘贴 Claude / Codex / Cursor 的总结 - 先理解最近进度、未完成项和下一步候选 - 不要立即修改代码、继续上一个任务或自行执行命令 - 等待用户给出下一条明确指令后再开始动手 - 如果后续需要 Cursor,提醒用户从看板打开 Cursor GUI 到当前项目目录 +- 可以 +- 继续 +- [Image #1] 那会这个是不是就不用了 , 转换层 这里要重构样式 ,直接对话式 那个数量直接就在对话中完成 ### Codex 最近回复 -> 本地状态和 handoff 里的快照有一处漂移:现在除了 `.memory/*`,`.project.json` 也处于未提交修改状态。我再补一眼远端、最新提交和领先/落后计数,只做状态确认。 +> 我准备动两个关键点:后端让 `/subject-agent/message` 从中文对话里识别“方向 + 数量”,前端删除四个模式卡和数量按钮,只展示当前识别出的方向/张数作为摘要。这样你后面说“卡通,生成 8 张”或“形象锁定,6 张”就直接改变状态。 -> 已完成承接,只读,没有改代码、没有启动服务、没有继续上个任务。 -> -> 当前理解: -> - 项目是 `SKG Marketing Studio / SKG 营销内容工作台`,生产入口 `https://marketing.skg.com`,后端走 `/api`,主远端是 Gitea。 -> - 当前产品方向:先做信息流广告快速复刻第一步,源视频下载优先;下载后并行做音频文案分析和视觉参考帧准备;直接提交视频模型目前是暂停状态。 -> - 最近 Codex 进度:资源库 / 提示词库线上 API 链路已测通,登录、健康检查、创建、搜索、预览、删除、recent 都验证过;最新提交是 `3b7a062 chore: persist resource libraries in production`。 -> - 最近候选问题:音频处理卡片过大且空展示不美观、需要说明用途和调用模型;缩略图下方横向滚动条需要更明显、更好拖。 -> - 后续媒体 UI 改动要复用 `web/components/media-asset-tile.tsx`;影响产品理解、节点职责、接口、数据模型或操作路径的改动,要同步更新 `docs/source-analysis.html`。 -> -> 当前仓库状态: -> ```text -> ## main...origin/main -> M .memory/assistant-handoff.md -> M .memory/worklog.json -> M .project.json -> ``` -> -> `main` 对 `origin/main` 领先/落后是 `0/0`。`.project.json` 当前未提交 diff 看起来主要是格式化变化,但也观察到 `urls` 里原来的 `source-analysis` 文档项被替换/移除了,这个我不会处理,等你下一条明确指令。 -> -> 如果后续需要 Cursor,请从看板打开 Cursor GUI 到这个精确目录:`/Users/kangwan/Projects/business/20260512-20260512-skg-tk-二创验证`。 -> -> 我现在暂停,等你下一步指令。 -> -> <… +> 前端显式卡片已经先移掉了,同时我顺手避免了“卡通默认 3D 风格”硬覆盖对话里的风格要求。接下来补文档和运行验证。 ## Cursor 最近会话 -- Session ID:3e4af548-3b65-45a5-8698-6e75510f24b5 -- Transcript:/Users/kangwan/.cursor/projects/Users-kangwan-Projects-business-20260512-20260512-skg-tk/agent-transcripts/3e4af548-3b65-45a5-8698-6e75510f24b5/3e4af548-3b65-45a5-8698-6e75510f24b5.jsonl -- 工作目录:/Users/kangwan/Projects/business/20260512-20260512-skg-tk-二创验证 -- 最后活动:May 19, 2026 at 08:43 -- 敏感字段:已对 token / key / password / secret 做脱敏 -- 内容隔离:公司项目默认不写入 Cursor transcript 的用户要求和助手回复;这里只记录 Cursor 曾在该项目下工作。 +- 未在本机找到匹配这个项目的 Cursor transcript。 ## 当前仓库状态 - 当前分支:main -- 未提交变更:2 项 -- 最近提交:chore: persist resource libraries in production +- 未提交变更:8 项 +- 最近提交:docs: record image timeout deployment - 变更文件: -- M .memory/assistant-handoff.md - M .memory/worklog.json -- M .project.json +- M api/main.py +- M web/components/ad-recreation-board.tsx ## 统一接力要求 diff --git a/.memory/worklog.json b/.memory/worklog.json index b67ef2d..56d7b10 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -1,51 +1,5 @@ { "entries": [ - { - "files_changed": 3, - "hash": "d32e87a", - "message": "auto-save 2026-05-17 19:59 (~3)", - "ts": "2026-05-17T19:59:06+08:00", - "type": "commit" - }, - { - "files_changed": 1, - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-17 19:59 (~3)", - "ts": "2026-05-17T12:08:29Z", - "type": "session-heartbeat" - }, - { - "files_changed": 4, - "hash": "72aef99", - "message": "auto-save 2026-05-17 20:15 (~4)", - "ts": "2026-05-17T20:15:13+08:00", - "type": "commit" - }, - { - "files_changed": 4, - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 4 项未提交变更 · 最近提交:auto-save 2026-05-17 20:15 (~4)", - "ts": "2026-05-17T12:18:29Z", - "type": "session-heartbeat" - }, - { - "files_changed": 4, - "hash": "8990db4", - "message": "auto-save 2026-05-17 20:20 (~4)", - "ts": "2026-05-17T20:20:36+08:00", - "type": "commit" - }, - { - "files_changed": 2, - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:auto-save 2026-05-17 20:20 (~4)", - "ts": "2026-05-17T12:28:29Z", - "type": "session-heartbeat" - }, - { - "files_changed": 1, - "hash": "6f7bb91", - "message": "fix: harden product view parsing", - "ts": "2026-05-17T20:30:30+08:00", - "type": "commit" - }, { "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: harden product view parsing", @@ -1782,1477 +1736,1521 @@ "type": "assistant-session" }, { - "ts": "2026-05-19T08:46:28+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 08:46 (~3)", + "files_changed": 3, "hash": "49c998f", - "files_changed": 3 + "message": "auto-save 2026-05-19 08:46 (~3)", + "ts": "2026-05-19T08:46:28+08:00", + "type": "commit" }, { - "ts": "2026-05-19T00:49:51Z", - "type": "session-end", + "files_changed": 1, "message": "Codex 会话结束 · 持续 0 秒 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 08:46 (~3)", - "files_changed": 1 + "ts": "2026-05-19T00:49:51Z", + "type": "session-end" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 08:46 (~3)", "ts": "2026-05-19T00:54:30Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 08:46 (~3)", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 08:46 (~3)", "ts": "2026-05-19T01:04:30Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 08:46 (~3)", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T09:10:04+08:00", - "type": "commit", - "message": "chore: mount tiktok cookies in production", + "files_changed": 5, "hash": "2fe3db8", - "files_changed": 5 + "message": "chore: mount tiktok cookies in production", + "ts": "2026-05-19T09:10:04+08:00", + "type": "commit" }, { - "ts": "2026-05-19T01:14:30Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: mount tiktok cookies in production", - "files_changed": 1 + "ts": "2026-05-19T01:14:30Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T09:17:36+08:00", - "type": "commit", - "message": "fix: allow yt-dlp to update production cookies", + "files_changed": 3, "hash": "e5652c4", - "files_changed": 3 + "message": "fix: allow yt-dlp to update production cookies", + "ts": "2026-05-19T09:17:36+08:00", + "type": "commit" }, { - "ts": "2026-05-19T01:24:30Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: allow yt-dlp to update production cookies", - "files_changed": 1 + "ts": "2026-05-19T01:24:30Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T09:27:47+08:00", - "type": "commit", - "message": "fix: enforce asr client timeout", + "files_changed": 2, "hash": "9a42682", - "files_changed": 2 + "message": "fix: enforce asr client timeout", + "ts": "2026-05-19T09:27:47+08:00", + "type": "commit" }, { - "ts": "2026-05-19T01:34:31Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: enforce asr client timeout", - "files_changed": 1 + "ts": "2026-05-19T01:34:31Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T09:38:17+08:00", - "type": "commit", - "message": "fix: configure dedicated asr upload gateway", + "files_changed": 5, "hash": "2954e58", - "files_changed": 5 + "message": "fix: configure dedicated asr upload gateway", + "ts": "2026-05-19T09:38:17+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: configure dedicated asr upload gateway", "ts": "2026-05-19T01:44:31Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: configure dedicated asr upload gateway", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: configure dedicated asr upload gateway", "ts": "2026-05-19T01:54:31Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: configure dedicated asr upload gateway", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T10:02:32+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 10:02 (~4)", + "files_changed": 4, "hash": "0115eb8", - "files_changed": 4 + "message": "auto-save 2026-05-19 10:02 (~4)", + "ts": "2026-05-19T10:02:32+08:00", + "type": "commit" }, { - "ts": "2026-05-19T02:04:31Z", - "type": "session-heartbeat", + "files_changed": 4, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 4 项未提交变更 · 最近提交:auto-save 2026-05-19 10:02 (~4)", - "files_changed": 4 + "ts": "2026-05-19T02:04:31Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T10:06:41+08:00", - "type": "commit", - "message": "fix: add cloud local asr fallback", + "files_changed": 7, "hash": "5b44d35", - "files_changed": 7 + "message": "fix: add cloud local asr fallback", + "ts": "2026-05-19T10:06:41+08:00", + "type": "commit" }, { - "ts": "2026-05-19T10:13:24+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 10:13 (~2)", + "files_changed": 2, "hash": "c527285", - "files_changed": 2 + "message": "auto-save 2026-05-19 10:13 (~2)", + "ts": "2026-05-19T10:13:24+08:00", + "type": "commit" }, { - "ts": "2026-05-19T02:14:31Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 10:13 (~2)", - "files_changed": 1 + "ts": "2026-05-19T02:14:31Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T10:24:17+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 10:24 (~4)", + "files_changed": 4, "hash": "f0f78f3", - "files_changed": 4 + "message": "auto-save 2026-05-19 10:24 (~4)", + "ts": "2026-05-19T10:24:17+08:00", + "type": "commit" }, { - "ts": "2026-05-19T02:24:31Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 10:24 (~4)", - "files_changed": 1 + "ts": "2026-05-19T02:24:31Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T10:29:42+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 10:29 (~2)", + "files_changed": 2, "hash": "e4e6c71", - "files_changed": 2 + "message": "auto-save 2026-05-19 10:29 (~2)", + "ts": "2026-05-19T10:29:42+08:00", + "type": "commit" }, { - "ts": "2026-05-19T10:31:31+08:00", - "type": "commit", - "message": "fix: force azure asr mode", + "files_changed": 5, "hash": "ff7bf00", - "files_changed": 5 + "message": "fix: force azure asr mode", + "ts": "2026-05-19T10:31:31+08:00", + "type": "commit" }, { - "ts": "2026-05-19T02:34:31Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: force azure asr mode", - "files_changed": 1 + "ts": "2026-05-19T02:34:31Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T02:44:32Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:fix: force azure asr mode", - "files_changed": 2 + "ts": "2026-05-19T02:44:32Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T10:46:00+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 10:45 (~2)", + "files_changed": 2, "hash": "70ffe22", - "files_changed": 2 + "message": "auto-save 2026-05-19 10:45 (~2)", + "ts": "2026-05-19T10:46:00+08:00", + "type": "commit" }, { - "ts": "2026-05-19T10:51:26+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 10:51 (~3)", + "files_changed": 3, "hash": "fc79cfd", - "files_changed": 3 + "message": "auto-save 2026-05-19 10:51 (~3)", + "ts": "2026-05-19T10:51:26+08:00", + "type": "commit" }, { - "ts": "2026-05-19T02:54:32Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 10:51 (~3)", - "files_changed": 2 + "ts": "2026-05-19T02:54:32Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T10:56:52+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 10:56 (~2)", + "files_changed": 2, "hash": "3f716ea", - "files_changed": 2 + "message": "auto-save 2026-05-19 10:56 (~2)", + "ts": "2026-05-19T10:56:52+08:00", + "type": "commit" }, { - "ts": "2026-05-19T11:02:18+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 11:02 (~4)", + "files_changed": 4, "hash": "0ddc08c", - "files_changed": 4 + "message": "auto-save 2026-05-19 11:02 (~4)", + "ts": "2026-05-19T11:02:18+08:00", + "type": "commit" }, { - "ts": "2026-05-19T03:04:32Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 11:02 (~4)", - "files_changed": 2 + "ts": "2026-05-19T03:04:32Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T11:05:57+08:00", - "type": "commit", - "message": "feat: simplify storyboard video card flow", + "files_changed": 4, "hash": "3462758", - "files_changed": 4 + "message": "feat: simplify storyboard video card flow", + "ts": "2026-05-19T11:05:57+08:00", + "type": "commit" }, { - "ts": "2026-05-19T11:07:30+08:00", - "type": "commit", - "message": "docs: update storyboard card workflow rules", + "files_changed": 1, "hash": "f4d456c", - "files_changed": 1 + "message": "docs: update storyboard card workflow rules", + "ts": "2026-05-19T11:07:30+08:00", + "type": "commit" }, { - "ts": "2026-05-19T11:14:21+08:00", - "type": "commit", - "message": "docs: record storyboard card deployment", + "files_changed": 1, "hash": "6d950ef", - "files_changed": 1 + "message": "docs: record storyboard card deployment", + "ts": "2026-05-19T11:14:21+08:00", + "type": "commit" }, { - "ts": "2026-05-19T03:14:32Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record storyboard card deployment", - "files_changed": 1 + "ts": "2026-05-19T03:14:32Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T11:18:36+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 11:18 (~2)", + "files_changed": 2, "hash": "b4d8d81", - "files_changed": 2 + "message": "auto-save 2026-05-19 11:18 (~2)", + "ts": "2026-05-19T11:18:36+08:00", + "type": "commit" }, { - "ts": "2026-05-19T11:24:02+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 11:23 (~2)", + "files_changed": 2, "hash": "0d3397c", - "files_changed": 2 + "message": "auto-save 2026-05-19 11:23 (~2)", + "ts": "2026-05-19T11:24:02+08:00", + "type": "commit" }, { - "ts": "2026-05-19T03:24:32Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 11:23 (~2)", - "files_changed": 1 + "ts": "2026-05-19T03:24:32Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T11:29:21+08:00", - "type": "commit", - "message": "fix: compact storyboard card sections", + "files_changed": 3, "hash": "b5855fd", - "files_changed": 3 + "message": "fix: compact storyboard card sections", + "ts": "2026-05-19T11:29:21+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: compact storyboard card sections", "ts": "2026-05-19T03:34:32Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: compact storyboard card sections", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: compact storyboard card sections", "ts": "2026-05-19T03:44:32Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: compact storyboard card sections", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: compact storyboard card sections", "ts": "2026-05-19T03:54:32Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: compact storyboard card sections", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T12:03:50+08:00", - "type": "commit", - "message": "fix: prevent dev env leaking into api image", + "files_changed": 4, "hash": "f576875", - "files_changed": 4 + "message": "fix: prevent dev env leaking into api image", + "ts": "2026-05-19T12:03:50+08:00", + "type": "commit" }, { - "ts": "2026-05-19T04:04:32Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: prevent dev env leaking into api image", - "files_changed": 1 + "ts": "2026-05-19T04:04:32Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T12:09:50+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 12:09 (+1, ~1)", + "files_changed": 2, "hash": "19d0aed", - "files_changed": 2 + "message": "auto-save 2026-05-19 12:09 (+1, ~1)", + "ts": "2026-05-19T12:09:50+08:00", + "type": "commit" }, { - "ts": "2026-05-19T04:14:33Z", - "type": "session-heartbeat", + "files_changed": 3, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 3 项未提交变更 · 最近提交:auto-save 2026-05-19 12:09 (+1, ~1)", - "files_changed": 3 + "ts": "2026-05-19T04:14:33Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T12:15:26+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 12:15 (~3)", + "files_changed": 3, "hash": "1d9bfa0", - "files_changed": 3 + "message": "auto-save 2026-05-19 12:15 (~3)", + "ts": "2026-05-19T12:15:26+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 12:15 (~3)", "ts": "2026-05-19T04:24:33Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 12:15 (~3)", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 12:15 (~3)", "ts": "2026-05-19T04:34:33Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 12:15 (~3)", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T12:37:49+08:00", - "type": "commit", - "message": "chore: add production docker smoke check", + "files_changed": 3, "hash": "ce4ff74", - "files_changed": 3 + "message": "chore: add production docker smoke check", + "ts": "2026-05-19T12:37:49+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", "ts": "2026-05-19T04:44:33Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", "ts": "2026-05-19T04:54:33Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", "ts": "2026-05-19T05:04:33Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", "ts": "2026-05-19T05:14:33Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", "ts": "2026-05-19T05:24:34Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", "ts": "2026-05-19T05:34:34Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", "ts": "2026-05-19T05:44:34Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: add production docker smoke check", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T13:50:46+08:00", - "type": "commit", - "message": "fix: clarify storyboard video candidate generation", + "files_changed": 4, "hash": "e6d957f", - "files_changed": 4 + "message": "fix: clarify storyboard video candidate generation", + "ts": "2026-05-19T13:50:46+08:00", + "type": "commit" }, { - "ts": "2026-05-19T05:54:34Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: clarify storyboard video candidate generation", - "files_changed": 1 + "ts": "2026-05-19T05:54:34Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T13:57:44+08:00", - "type": "commit", - "message": "fix: label deleted reference frames correctly", + "files_changed": 2, "hash": "68ab3da", - "files_changed": 2 + "message": "fix: label deleted reference frames correctly", + "ts": "2026-05-19T13:57:44+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: label deleted reference frames correctly", "ts": "2026-05-19T06:04:34Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: label deleted reference frames correctly", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: label deleted reference frames correctly", "ts": "2026-05-19T06:14:34Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: label deleted reference frames correctly", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T14:23:20+08:00", - "type": "commit", - "message": "fix: use cloud local asr fallback", + "files_changed": 6, "hash": "980d252", - "files_changed": 6 + "message": "fix: use cloud local asr fallback", + "ts": "2026-05-19T14:23:20+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: use cloud local asr fallback", "ts": "2026-05-19T06:24:34Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: use cloud local asr fallback", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: use cloud local asr fallback", "ts": "2026-05-19T06:34:34Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: use cloud local asr fallback", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: use cloud local asr fallback", "ts": "2026-05-19T06:44:34Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: use cloud local asr fallback", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: use cloud local asr fallback", "ts": "2026-05-19T06:54:35Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: use cloud local asr fallback", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T15:01:58+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 15:01 (~2)", + "files_changed": 2, "hash": "1037458", - "files_changed": 2 + "message": "auto-save 2026-05-19 15:01 (~2)", + "ts": "2026-05-19T15:01:58+08:00", + "type": "commit" }, { - "ts": "2026-05-19T07:04:35Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 15:01 (~2)", - "files_changed": 2 + "ts": "2026-05-19T07:04:35Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T15:07:24+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 15:07 (~4)", + "files_changed": 4, "hash": "5984746", - "files_changed": 4 + "message": "auto-save 2026-05-19 15:07 (~4)", + "ts": "2026-05-19T15:07:24+08:00", + "type": "commit" }, { - "ts": "2026-05-19T15:11:08+08:00", - "type": "commit", - "message": "feat: streamline storyboard video rows", + "files_changed": 3, "hash": "64a9673", - "files_changed": 3 + "message": "feat: streamline storyboard video rows", + "ts": "2026-05-19T15:11:08+08:00", + "type": "commit" }, { - "ts": "2026-05-19T07:14:35Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:feat: streamline storyboard video rows", - "files_changed": 1 + "ts": "2026-05-19T07:14:35Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T15:23:43+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 15:23 (~5)", + "files_changed": 5, "hash": "eb13cf0", - "files_changed": 5 + "message": "auto-save 2026-05-19 15:23 (~5)", + "ts": "2026-05-19T15:23:43+08:00", + "type": "commit" }, { - "ts": "2026-05-19T15:24:30+08:00", - "type": "commit", - "message": "fix: isolate storyboard videos by row", + "files_changed": 4, "hash": "e03c5db", - "files_changed": 4 + "message": "fix: isolate storyboard videos by row", + "ts": "2026-05-19T15:24:30+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: isolate storyboard videos by row", "ts": "2026-05-19T07:24:35Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: isolate storyboard videos by row", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: isolate storyboard videos by row", "ts": "2026-05-19T07:34:35Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: isolate storyboard videos by row", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T15:40:03+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 15:39 (~5)", + "files_changed": 5, "hash": "9c34d7b", - "files_changed": 5 + "message": "auto-save 2026-05-19 15:39 (~5)", + "ts": "2026-05-19T15:40:03+08:00", + "type": "commit" }, { - "ts": "2026-05-19T07:44:35Z", - "type": "session-heartbeat", + "files_changed": 3, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 3 项未提交变更 · 最近提交:auto-save 2026-05-19 15:39 (~5)", - "files_changed": 3 + "ts": "2026-05-19T07:44:35Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T15:45:30+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 15:45 (~3)", + "files_changed": 3, "hash": "cbe52f3", - "files_changed": 3 + "message": "auto-save 2026-05-19 15:45 (~3)", + "ts": "2026-05-19T15:45:30+08:00", + "type": "commit" }, { - "ts": "2026-05-19T15:48:27+08:00", - "type": "commit", - "message": "feat: make intake auto extract copy", + "files_changed": 5, "hash": "54979bc", - "files_changed": 5 + "message": "feat: make intake auto extract copy", + "ts": "2026-05-19T15:48:27+08:00", + "type": "commit" }, { - "ts": "2026-05-19T15:49:26+08:00", - "type": "commit", - "message": "docs: update production intake workflow", + "files_changed": 1, "hash": "a7aa280", - "files_changed": 1 + "message": "docs: update production intake workflow", + "ts": "2026-05-19T15:49:26+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: update production intake workflow", "ts": "2026-05-19T07:54:35Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: update production intake workflow", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: update production intake workflow", "ts": "2026-05-19T08:04:35Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: update production intake workflow", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: update production intake workflow", "ts": "2026-05-19T08:14:35Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: update production intake workflow", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T16:17:58+08:00", - "type": "commit", - "message": "revert: restore storyboard intake workflow", + "files_changed": 6, "hash": "b9ba811", - "files_changed": 6 + "message": "revert: restore storyboard intake workflow", + "ts": "2026-05-19T16:17:58+08:00", + "type": "commit" }, { - "ts": "2026-05-19T16:23:53+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 16:23 (~2)", + "files_changed": 2, "hash": "0270a9b", - "files_changed": 2 + "message": "auto-save 2026-05-19 16:23 (~2)", + "ts": "2026-05-19T16:23:53+08:00", + "type": "commit" }, { - "ts": "2026-05-19T08:24:36Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 16:23 (~2)", - "files_changed": 1 + "ts": "2026-05-19T08:24:36Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T16:27:49+08:00", - "type": "commit", - "message": "fix: hide storyboard status strips", + "files_changed": 2, "hash": "a9171e2", - "files_changed": 2 + "message": "fix: hide storyboard status strips", + "ts": "2026-05-19T16:27:49+08:00", + "type": "commit" }, { - "ts": "2026-05-19T16:30:11+08:00", - "type": "commit", - "message": "docs: update deployed status strip change", + "files_changed": 1, "hash": "45395cf", - "files_changed": 1 + "message": "docs: update deployed status strip change", + "ts": "2026-05-19T16:30:11+08:00", + "type": "commit" }, { - "ts": "2026-05-19T08:34:36Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: update deployed status strip change", - "files_changed": 1 + "ts": "2026-05-19T08:34:36Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T16:38:17+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 16:38 (~3)", + "files_changed": 3, "hash": "56c6ba4", - "files_changed": 3 + "message": "auto-save 2026-05-19 16:38 (~3)", + "ts": "2026-05-19T16:38:17+08:00", + "type": "commit" }, { - "ts": "2026-05-19T16:39:52+08:00", - "type": "commit", - "message": "fix: hide audio analysis summary cards", + "files_changed": 3, "hash": "4753d5e", - "files_changed": 3 + "message": "fix: hide audio analysis summary cards", + "ts": "2026-05-19T16:39:52+08:00", + "type": "commit" }, { - "ts": "2026-05-19T08:44:36Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: hide audio analysis summary cards", - "files_changed": 1 + "ts": "2026-05-19T08:44:36Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T16:45:56+08:00", - "type": "commit", - "message": "fix: rename source video section title", + "files_changed": 1, "hash": "4f74fa8", - "files_changed": 1 + "message": "fix: rename source video section title", + "ts": "2026-05-19T16:45:56+08:00", + "type": "commit" }, { - "ts": "2026-05-19T08:54:36Z", - "type": "session-heartbeat", + "files_changed": 4, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 4 项未提交变更 · 最近提交:fix: rename source video section title", - "files_changed": 4 + "ts": "2026-05-19T08:54:36Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T16:54:51+08:00", - "type": "commit", - "message": "fix: narrow transcript timeline panel", + "files_changed": 3, "hash": "7a7a3b5", - "files_changed": 3 + "message": "fix: narrow transcript timeline panel", + "ts": "2026-05-19T16:54:51+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: narrow transcript timeline panel", "ts": "2026-05-19T09:04:36Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: narrow transcript timeline panel", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: narrow transcript timeline panel", "ts": "2026-05-19T09:14:36Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: narrow transcript timeline panel", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T17:22:01+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 17:21 (~2)", + "files_changed": 2, "hash": "7c69825", - "files_changed": 2 + "message": "auto-save 2026-05-19 17:21 (~2)", + "ts": "2026-05-19T17:22:01+08:00", + "type": "commit" }, { - "ts": "2026-05-19T09:24:36Z", - "type": "session-heartbeat", + "files_changed": 3, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 3 项未提交变更 · 最近提交:auto-save 2026-05-19 17:21 (~2)", - "files_changed": 3 + "ts": "2026-05-19T09:24:36Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T17:27:09+08:00", - "type": "commit", - "message": "fix: add temporary filmstrip frame picker", + "files_changed": 3, "hash": "1f6eabc", - "files_changed": 3 + "message": "fix: add temporary filmstrip frame picker", + "ts": "2026-05-19T17:27:09+08:00", + "type": "commit" }, { - "ts": "2026-05-19T17:33:37+08:00", - "type": "commit", - "message": "fix: lift filmstrip preview above frame", + "files_changed": 4, "hash": "d461c65", - "files_changed": 4 + "message": "fix: lift filmstrip preview above frame", + "ts": "2026-05-19T17:33:37+08:00", + "type": "commit" }, { - "ts": "2026-05-19T09:34:36Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: lift filmstrip preview above frame", - "files_changed": 1 + "ts": "2026-05-19T09:34:36Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T17:42:02+08:00", - "type": "commit", - "message": "fix: enlarge filmstrip frames in place", + "files_changed": 4, "hash": "cb991e7", - "files_changed": 4 + "message": "fix: enlarge filmstrip frames in place", + "ts": "2026-05-19T17:42:02+08:00", + "type": "commit" }, { - "ts": "2026-05-19T09:44:37Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: enlarge filmstrip frames in place", - "files_changed": 1 + "ts": "2026-05-19T09:44:37Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T17:50:00+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 17:49 (~2)", + "files_changed": 2, "hash": "8bceb90", - "files_changed": 2 + "message": "auto-save 2026-05-19 17:49 (~2)", + "ts": "2026-05-19T17:50:00+08:00", + "type": "commit" }, { - "ts": "2026-05-19T17:53:17+08:00", - "type": "commit", - "message": "fix: align filmstrip frames with waveform", + "files_changed": 3, "hash": "883e1d4", - "files_changed": 3 + "message": "fix: align filmstrip frames with waveform", + "ts": "2026-05-19T17:53:17+08:00", + "type": "commit" }, { - "ts": "2026-05-19T09:54:37Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: align filmstrip frames with waveform", - "files_changed": 1 + "ts": "2026-05-19T09:54:37Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T17:59:58+08:00", - "type": "commit", - "message": "fix: hide waveform filmstrip labels", + "files_changed": 2, "hash": "97016dc", - "files_changed": 2 + "message": "fix: hide waveform filmstrip labels", + "ts": "2026-05-19T17:59:58+08:00", + "type": "commit" }, { - "ts": "2026-05-19T10:04:37Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: hide waveform filmstrip labels", - "files_changed": 1 + "ts": "2026-05-19T10:04:37Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T18:06:17+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 18:06 (~2)", + "files_changed": 2, "hash": "20f730a", - "files_changed": 2 + "message": "auto-save 2026-05-19 18:06 (~2)", + "ts": "2026-05-19T18:06:17+08:00", + "type": "commit" }, { - "ts": "2026-05-19T18:08:17+08:00", - "type": "commit", - "message": "fix: enlarge filmstrip hover near waveform", + "files_changed": 3, "hash": "818d785", - "files_changed": 3 + "message": "fix: enlarge filmstrip hover near waveform", + "ts": "2026-05-19T18:08:17+08:00", + "type": "commit" }, { - "ts": "2026-05-19T10:14:37Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:fix: enlarge filmstrip hover near waveform", - "files_changed": 2 + "ts": "2026-05-19T10:14:37Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T18:16:57+08:00", - "type": "commit", - "message": "fix: refine waveform filmstrip controls", + "files_changed": 3, "hash": "f574ab4", - "files_changed": 3 + "message": "fix: refine waveform filmstrip controls", + "ts": "2026-05-19T18:16:57+08:00", + "type": "commit" }, { - "ts": "2026-05-19T10:24:37Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:fix: refine waveform filmstrip controls", - "files_changed": 2 + "ts": "2026-05-19T10:24:37Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T18:28:00+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 18:27 (~4)", + "files_changed": 4, "hash": "b099876", - "files_changed": 4 + "message": "auto-save 2026-05-19 18:27 (~4)", + "ts": "2026-05-19T18:28:00+08:00", + "type": "commit" }, { - "ts": "2026-05-19T18:29:12+08:00", - "type": "commit", - "message": "fix: lift filmstrip hover preview", + "files_changed": 3, "hash": "7604ed1", - "files_changed": 3 + "message": "fix: lift filmstrip hover preview", + "ts": "2026-05-19T18:29:12+08:00", + "type": "commit" }, { - "ts": "2026-05-19T10:34:37Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: lift filmstrip hover preview", - "files_changed": 1 + "ts": "2026-05-19T10:34:37Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T18:38:51+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 18:38 (~2)", + "files_changed": 2, "hash": "d503ca6", - "files_changed": 2 + "message": "auto-save 2026-05-19 18:38 (~2)", + "ts": "2026-05-19T18:38:51+08:00", + "type": "commit" }, { - "ts": "2026-05-19T18:43:54+08:00", - "type": "commit", - "message": "fix: move transcript timeline below video", + "files_changed": 3, "hash": "ce5f3b4", - "files_changed": 3 + "message": "fix: move transcript timeline below video", + "ts": "2026-05-19T18:43:54+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: move transcript timeline below video", "ts": "2026-05-19T10:44:37Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: move transcript timeline below video", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: move transcript timeline below video", "ts": "2026-05-19T10:54:38Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: move transcript timeline below video", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: move transcript timeline below video", "ts": "2026-05-19T11:04:38Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: move transcript timeline below video", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: move transcript timeline below video", "ts": "2026-05-19T11:14:38Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: move transcript timeline below video", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T19:16:50+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 19:16 (~2)", + "files_changed": 2, "hash": "e21b9a1", - "files_changed": 2 + "message": "auto-save 2026-05-19 19:16 (~2)", + "ts": "2026-05-19T19:16:50+08:00", + "type": "commit" }, { - "ts": "2026-05-19T19:22:17+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 19:22 (~4)", + "files_changed": 4, "hash": "326403d", - "files_changed": 4 + "message": "auto-save 2026-05-19 19:22 (~4)", + "ts": "2026-05-19T19:22:17+08:00", + "type": "commit" }, { - "ts": "2026-05-19T19:23:01+08:00", - "type": "commit", - "message": "feat: add source subject conversion pipeline", + "files_changed": 3, "hash": "b9bf50f", - "files_changed": 3 + "message": "feat: add source subject conversion pipeline", + "ts": "2026-05-19T19:23:01+08:00", + "type": "commit" }, { - "ts": "2026-05-19T11:24:38Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:feat: add source subject conversion pipeline", - "files_changed": 1 + "ts": "2026-05-19T11:24:38Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T19:31:45+08:00", - "type": "commit", - "message": "fix: refine reference frame previews", + "files_changed": 4, "hash": "a5979bb", - "files_changed": 4 + "message": "fix: refine reference frame previews", + "ts": "2026-05-19T19:31:45+08:00", + "type": "commit" }, { - "ts": "2026-05-19T11:34:38Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: refine reference frame previews", - "files_changed": 1 + "ts": "2026-05-19T11:34:38Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T19:36:38+08:00", - "type": "commit", - "message": "fix: preserve reference frame aspect ratio", + "files_changed": 3, "hash": "bdadd71", - "files_changed": 3 + "message": "fix: preserve reference frame aspect ratio", + "ts": "2026-05-19T19:36:38+08:00", + "type": "commit" }, { - "ts": "2026-05-19T19:44:00+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 19:43 (~3)", + "files_changed": 3, "hash": "9bca5b3", - "files_changed": 3 + "message": "auto-save 2026-05-19 19:43 (~3)", + "ts": "2026-05-19T19:44:00+08:00", + "type": "commit" }, { - "ts": "2026-05-19T11:44:38Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 19:43 (~3)", - "files_changed": 2 + "ts": "2026-05-19T11:44:38Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T19:46:17+08:00", - "type": "commit", - "message": "fix: shrink reference frame thumbnails", + "files_changed": 3, "hash": "fe60d5d", - "files_changed": 3 + "message": "fix: shrink reference frame thumbnails", + "ts": "2026-05-19T19:46:17+08:00", + "type": "commit" }, { - "ts": "2026-05-19T11:54:38Z", - "type": "session-heartbeat", + "files_changed": 3, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 3 项未提交变更 · 最近提交:fix: shrink reference frame thumbnails", - "files_changed": 3 + "ts": "2026-05-19T11:54:38Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T19:54:52+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 19:54 (~3)", + "files_changed": 3, "hash": "e2be092", - "files_changed": 3 + "message": "auto-save 2026-05-19 19:54 (~3)", + "ts": "2026-05-19T19:54:52+08:00", + "type": "commit" }, { - "ts": "2026-05-19T20:00:18+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 20:00 (~6)", + "files_changed": 6, "hash": "cf86417", - "files_changed": 6 + "message": "auto-save 2026-05-19 20:00 (~6)", + "ts": "2026-05-19T20:00:18+08:00", + "type": "commit" }, { - "ts": "2026-05-19T20:01:45+08:00", - "type": "commit", - "message": "fix: improve filmstrip picking and audio retry", + "files_changed": 5, "hash": "aabddef", - "files_changed": 5 + "message": "fix: improve filmstrip picking and audio retry", + "ts": "2026-05-19T20:01:45+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: improve filmstrip picking and audio retry", "ts": "2026-05-19T12:04:39Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: improve filmstrip picking and audio retry", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: improve filmstrip picking and audio retry", "ts": "2026-05-19T12:14:39Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: improve filmstrip picking and audio retry", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T20:22:00+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 20:21 (~4)", + "files_changed": 4, "hash": "ed471b3", - "files_changed": 4 + "message": "auto-save 2026-05-19 20:21 (~4)", + "ts": "2026-05-19T20:22:00+08:00", + "type": "commit" }, { - "ts": "2026-05-19T12:24:39Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 20:21 (~4)", - "files_changed": 2 + "ts": "2026-05-19T12:24:39Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T20:27:27+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 20:27 (~2)", + "files_changed": 2, "hash": "00872db", - "files_changed": 2 + "message": "auto-save 2026-05-19 20:27 (~2)", + "ts": "2026-05-19T20:27:27+08:00", + "type": "commit" }, { - "ts": "2026-05-19T20:32:53+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 20:32 (~4)", + "files_changed": 4, "hash": "78f2ffe", - "files_changed": 4 + "message": "auto-save 2026-05-19 20:32 (~4)", + "ts": "2026-05-19T20:32:53+08:00", + "type": "commit" }, { - "ts": "2026-05-19T12:34:39Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 20:32 (~4)", - "files_changed": 2 + "ts": "2026-05-19T12:34:39Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T20:38:19+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 20:38 (~4)", + "files_changed": 4, "hash": "eafd5d7", - "files_changed": 4 + "message": "auto-save 2026-05-19 20:38 (~4)", + "ts": "2026-05-19T20:38:19+08:00", + "type": "commit" }, { - "ts": "2026-05-19T20:39:15+08:00", - "type": "commit", - "message": "feat: simplify subject reconstruction layer", + "files_changed": 6, "hash": "15c6f4d", - "files_changed": 6 + "message": "feat: simplify subject reconstruction layer", + "ts": "2026-05-19T20:39:15+08:00", + "type": "commit" }, { - "ts": "2026-05-19T20:41:37+08:00", - "type": "commit", - "message": "docs: update deployment facts for reconstruction layer", + "files_changed": 1, "hash": "39ab443", - "files_changed": 1 + "message": "docs: update deployment facts for reconstruction layer", + "ts": "2026-05-19T20:41:37+08:00", + "type": "commit" }, { - "ts": "2026-05-19T12:44:39Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: update deployment facts for reconstruction layer", - "files_changed": 1 + "ts": "2026-05-19T12:44:39Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T20:54:36+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 20:54 (~3)", + "files_changed": 3, "hash": "059a996", - "files_changed": 3 + "message": "auto-save 2026-05-19 20:54 (~3)", + "ts": "2026-05-19T20:54:36+08:00", + "type": "commit" }, { - "ts": "2026-05-19T12:54:39Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 20:54 (~3)", - "files_changed": 1 + "ts": "2026-05-19T12:54:39Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T20:59:22+08:00", - "type": "commit", - "message": "fix: require manual subject reconstruction generation", + "files_changed": 3, "hash": "4729939", - "files_changed": 3 + "message": "fix: require manual subject reconstruction generation", + "ts": "2026-05-19T20:59:22+08:00", + "type": "commit" }, { - "ts": "2026-05-19T13:04:39Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: require manual subject reconstruction generation", - "files_changed": 1 + "ts": "2026-05-19T13:04:39Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T21:10:54+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 21:10 (~5)", + "files_changed": 5, "hash": "05c9343", - "files_changed": 5 + "message": "auto-save 2026-05-19 21:10 (~5)", + "ts": "2026-05-19T21:10:54+08:00", + "type": "commit" }, { - "ts": "2026-05-19T13:14:39Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 21:10 (~5)", - "files_changed": 2 + "ts": "2026-05-19T13:14:39Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T21:16:20+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 21:16 (~3)", + "files_changed": 3, "hash": "87be9a6", - "files_changed": 3 + "message": "auto-save 2026-05-19 21:16 (~3)", + "ts": "2026-05-19T21:16:20+08:00", + "type": "commit" }, { - "ts": "2026-05-19T21:21:45+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 21:21 (~4)", + "files_changed": 4, "hash": "a282056", - "files_changed": 4 + "message": "auto-save 2026-05-19 21:21 (~4)", + "ts": "2026-05-19T21:21:45+08:00", + "type": "commit" }, { - "ts": "2026-05-19T13:24:39Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 21:21 (~4)", - "files_changed": 2 + "ts": "2026-05-19T13:24:39Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T21:27:13+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 21:27 (~3)", + "files_changed": 3, "hash": "6e1aab2", - "files_changed": 3 + "message": "auto-save 2026-05-19 21:27 (~3)", + "ts": "2026-05-19T21:27:13+08:00", + "type": "commit" }, { - "ts": "2026-05-19T21:31:47+08:00", - "type": "commit", - "message": "feat: stream subject packs by generation batch", + "files_changed": 6, "hash": "00df9d0", - "files_changed": 6 + "message": "feat: stream subject packs by generation batch", + "ts": "2026-05-19T21:31:47+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:feat: stream subject packs by generation batch", "ts": "2026-05-19T13:34:39Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:feat: stream subject packs by generation batch", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:feat: stream subject packs by generation batch", "ts": "2026-05-19T13:44:40Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:feat: stream subject packs by generation batch", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T21:54:21+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 21:54 (~2)", + "files_changed": 2, "hash": "9edf278", - "files_changed": 2 + "message": "auto-save 2026-05-19 21:54 (~2)", + "ts": "2026-05-19T21:54:21+08:00", + "type": "commit" }, { - "ts": "2026-05-19T13:54:40Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 21:54 (~2)", - "files_changed": 1 + "ts": "2026-05-19T13:54:40Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T21:58:59+08:00", - "type": "commit", - "message": "fix: fail fast on gpt-image-2 timeouts", + "files_changed": 5, "hash": "fd794e3", - "files_changed": 5 + "message": "fix: fail fast on gpt-image-2 timeouts", + "ts": "2026-05-19T21:58:59+08:00", + "type": "commit" }, { - "ts": "2026-05-19T22:03:11+08:00", - "type": "commit", - "message": "docs: record image timeout deployment", + "files_changed": 1, "hash": "516d99b", - "files_changed": 1 + "message": "docs: record image timeout deployment", + "ts": "2026-05-19T22:03:11+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record image timeout deployment", "ts": "2026-05-19T14:04:40Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record image timeout deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record image timeout deployment", "ts": "2026-05-19T15:45:00Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record image timeout deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-19T23:46:34+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 23:46 (~2)", + "files_changed": 2, "hash": "95ad406", - "files_changed": 2 + "message": "auto-save 2026-05-19 23:46 (~2)", + "ts": "2026-05-19T23:46:34+08:00", + "type": "commit" }, { - "ts": "2026-05-19T23:52:01+08:00", - "type": "commit", - "message": "auto-save 2026-05-19 23:51 (~6)", + "files_changed": 6, "hash": "c383375", - "files_changed": 6 + "message": "auto-save 2026-05-19 23:51 (~6)", + "ts": "2026-05-19T23:52:01+08:00", + "type": "commit" }, { - "ts": "2026-05-19T15:55:01Z", - "type": "session-heartbeat", + "files_changed": 3, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 3 项未提交变更 · 最近提交:auto-save 2026-05-19 23:51 (~6)", - "files_changed": 3 + "ts": "2026-05-19T15:55:01Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-19T23:56:20+08:00", - "type": "commit", - "message": "feat: add Gemini image fallback circuit breaker", + "files_changed": 7, "hash": "3756259", - "files_changed": 7 + "message": "feat: add Gemini image fallback circuit breaker", + "ts": "2026-05-19T23:56:20+08:00", + "type": "commit" }, { - "ts": "2026-05-20T00:00:46+08:00", - "type": "commit", - "message": "docs: record Gemini fallback deployment", + "files_changed": 1, "hash": "b4a7968", - "files_changed": 1 + "message": "docs: record Gemini fallback deployment", + "ts": "2026-05-20T00:00:46+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", "ts": "2026-05-19T16:05:01Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", "ts": "2026-05-19T16:15:01Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", "ts": "2026-05-19T16:25:01Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", "ts": "2026-05-19T16:35:01Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", "ts": "2026-05-19T16:45:01Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", "ts": "2026-05-19T16:55:01Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", "ts": "2026-05-19T17:25:05Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", "ts": "2026-05-20T00:53:55Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record Gemini fallback deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-20T09:03:51+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 09:03 (~2)", + "files_changed": 2, "hash": "626271d", - "files_changed": 2 + "message": "auto-save 2026-05-20 09:03 (~2)", + "ts": "2026-05-20T09:03:51+08:00", + "type": "commit" }, { - "ts": "2026-05-20T01:03:55Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-20 09:03 (~2)", - "files_changed": 1 + "ts": "2026-05-20T01:03:55Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-20T09:11:19+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 09:09 (~4)", + "files_changed": 4, "hash": "0736b8e", - "files_changed": 4 + "message": "auto-save 2026-05-20 09:09 (~4)", + "ts": "2026-05-20T09:11:19+08:00", + "type": "commit" }, { - "ts": "2026-05-20T01:13:55Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:auto-save 2026-05-20 09:09 (~4)", - "files_changed": 1 + "ts": "2026-05-20T01:13:55Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-20T09:16:28+08:00", - "type": "commit", - "message": "feat: add subject image model controls", + "files_changed": 5, "hash": "c245bff", - "files_changed": 5 + "message": "feat: add subject image model controls", + "ts": "2026-05-20T09:16:28+08:00", + "type": "commit" }, { - "ts": "2026-05-20T09:21:21+08:00", - "type": "commit", - "message": "docs: record subject model deployment", + "files_changed": 1, "hash": "75666f1", - "files_changed": 1 + "message": "docs: record subject model deployment", + "ts": "2026-05-20T09:21:21+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject model deployment", "ts": "2026-05-20T01:23:55Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject model deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject model deployment", "ts": "2026-05-20T01:33:55Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject model deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject model deployment", "ts": "2026-05-20T01:43:55Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject model deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-20T09:49:21+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 09:49 (~4)", + "files_changed": 4, "hash": "5085cb5", - "files_changed": 4 + "message": "auto-save 2026-05-20 09:49 (~4)", + "ts": "2026-05-20T09:49:21+08:00", + "type": "commit" }, { - "ts": "2026-05-20T09:52:03+08:00", - "type": "commit", - "message": "fix: lock subject packs and upscale assets", + "files_changed": 3, "hash": "2366662", - "files_changed": 3 + "message": "fix: lock subject packs and upscale assets", + "ts": "2026-05-20T09:52:03+08:00", + "type": "commit" }, { - "ts": "2026-05-20T01:53:55Z", - "type": "session-heartbeat", + "files_changed": 1, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:fix: lock subject packs and upscale assets", - "files_changed": 1 + "ts": "2026-05-20T01:53:55Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-20T09:54:47+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 09:54 (~2)", + "files_changed": 2, "hash": "36fa481", - "files_changed": 2 + "message": "auto-save 2026-05-20 09:54 (~2)", + "ts": "2026-05-20T09:54:47+08:00", + "type": "commit" }, { - "ts": "2026-05-20T09:55:45+08:00", - "type": "commit", - "message": "docs: record subject pack deployment", + "files_changed": 1, "hash": "e64bf40", - "files_changed": 1 + "message": "docs: record subject pack deployment", + "ts": "2026-05-20T09:55:45+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", "ts": "2026-05-20T02:03:55Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", "ts": "2026-05-20T02:13:55Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", "ts": "2026-05-20T02:23:55Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", "ts": "2026-05-20T02:33:56Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", "ts": "2026-05-20T02:43:56Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", "ts": "2026-05-20T02:53:56Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", "ts": "2026-05-20T03:03:56Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", "ts": "2026-05-20T03:13:56Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", "ts": "2026-05-20T03:23:56Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject pack deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-20T11:32:37+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 11:32 (~3)", + "files_changed": 3, "hash": "4e1fdba", - "files_changed": 3 + "message": "auto-save 2026-05-20 11:32 (~3)", + "ts": "2026-05-20T11:32:37+08:00", + "type": "commit" }, { - "ts": "2026-05-20T03:33:56Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:auto-save 2026-05-20 11:32 (~3)", - "files_changed": 2 + "ts": "2026-05-20T03:33:56Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-20T11:38:32+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 11:37 (~4)", + "files_changed": 4, "hash": "aa1606d", - "files_changed": 4 + "message": "auto-save 2026-05-20 11:37 (~4)", + "ts": "2026-05-20T11:38:32+08:00", + "type": "commit" }, { - "ts": "2026-05-20T11:39:33+08:00", - "type": "commit", - "message": "fix: isolate subject reference generation", + "files_changed": 3, "hash": "7acbfd5", - "files_changed": 3 + "message": "fix: isolate subject reference generation", + "ts": "2026-05-20T11:39:33+08:00", + "type": "commit" }, { - "ts": "2026-05-20T03:43:56Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:fix: isolate subject reference generation", - "files_changed": 2 + "ts": "2026-05-20T03:43:56Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-20T11:43:57+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 11:43 (~2)", + "files_changed": 2, "hash": "5f37dd9", - "files_changed": 2 + "message": "auto-save 2026-05-20 11:43 (~2)", + "ts": "2026-05-20T11:43:57+08:00", + "type": "commit" }, { - "ts": "2026-05-20T11:46:04+08:00", - "type": "commit", - "message": "docs: record subject reference deployment", + "files_changed": 1, "hash": "3d198b0", - "files_changed": 1 + "message": "docs: record subject reference deployment", + "ts": "2026-05-20T11:46:04+08:00", + "type": "commit" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject reference deployment", "ts": "2026-05-20T03:53:57Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject reference deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject reference deployment", "ts": "2026-05-20T04:03:57Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject reference deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject reference deployment", "ts": "2026-05-20T04:13:57Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject reference deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject reference deployment", "ts": "2026-05-20T04:23:57Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject reference deployment", - "files_changed": 1 + "type": "session-heartbeat" }, { - "ts": "2026-05-20T12:27:41+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 12:27 (~2)", + "files_changed": 2, "hash": "935fa6c", - "files_changed": 2 + "message": "auto-save 2026-05-20 12:27 (~2)", + "ts": "2026-05-20T12:27:41+08:00", + "type": "commit" }, { - "ts": "2026-05-20T12:33:07+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 12:33 (~4)", + "files_changed": 4, "hash": "890460f", - "files_changed": 4 + "message": "auto-save 2026-05-20 12:33 (~4)", + "ts": "2026-05-20T12:33:07+08:00", + "type": "commit" }, { - "ts": "2026-05-20T04:33:57Z", - "type": "session-heartbeat", + "files_changed": 2, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 2 项未提交变更 · 最近提交:auto-save 2026-05-20 12:33 (~4)", - "files_changed": 2 + "ts": "2026-05-20T04:33:57Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-20T12:38:32+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 12:38 (~2)", + "files_changed": 2, "hash": "b01dc36", - "files_changed": 2 + "message": "auto-save 2026-05-20 12:38 (~2)", + "ts": "2026-05-20T12:38:32+08:00", + "type": "commit" }, { - "ts": "2026-05-20T04:43:57Z", - "type": "session-heartbeat", + "files_changed": 3, "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 3 项未提交变更 · 最近提交:auto-save 2026-05-20 12:38 (~2)", - "files_changed": 3 + "ts": "2026-05-20T04:43:57Z", + "type": "session-heartbeat" }, { - "ts": "2026-05-20T12:43:59+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 12:43 (~3)", + "files_changed": 3, "hash": "799b354", - "files_changed": 3 + "message": "auto-save 2026-05-20 12:43 (~3)", + "ts": "2026-05-20T12:43:59+08:00", + "type": "commit" }, { - "ts": "2026-05-20T12:49:25+08:00", - "type": "commit", - "message": "auto-save 2026-05-20 12:49 (~2)", + "files_changed": 2, "hash": "fa2e813", - "files_changed": 2 + "message": "auto-save 2026-05-20 12:49 (~2)", + "ts": "2026-05-20T12:49:25+08:00", + "type": "commit" }, { - "ts": "2026-05-20T12:51:02+08:00", - "type": "commit", - "message": "feat: add subject image agent workflow", + "files_changed": 5, "hash": "35fc088", + "message": "feat: add subject image agent workflow", + "ts": "2026-05-20T12:51:02+08:00", + "type": "commit" + }, + { + "files_changed": 1, + "hash": "bc46291", + "message": "chore: update worklog", + "ts": "2026-05-20T12:52:31+08:00", + "type": "commit" + }, + { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: update worklog", + "ts": "2026-05-20T04:53:57Z", + "type": "session-heartbeat" + }, + { + "files_changed": 2, + "hash": "83b151d", + "message": "docs: record subject agent direction", + "ts": "2026-05-20T13:03:41+08:00", + "type": "commit" + }, + { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject agent direction", + "ts": "2026-05-20T05:03:57Z", + "type": "session-heartbeat" + }, + { + "files_changed": 2, + "hash": "e10b1a6", + "message": "fix: quiet subject agent model warnings", + "ts": "2026-05-20T13:07:58+08:00", + "type": "commit" + }, + { + "files_changed": 2, + "hash": "b3cc0aa", + "message": "docs: record subject agent deployment", + "ts": "2026-05-20T13:11:10+08:00", + "type": "commit" + }, + { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject agent deployment", + "ts": "2026-05-20T05:13:57Z", + "type": "session-heartbeat" + }, + { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject agent deployment", + "ts": "2026-05-20T05:23:58Z", + "type": "session-heartbeat" + }, + { + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject agent deployment", + "ts": "2026-05-20T05:33:58Z", + "type": "session-heartbeat" + }, + { + "files_changed": 4, + "message": "启动 Claude 接力会话 · 已载入 Claude / Codex 最近会话,等待下一条指令 · 分支 main · 4 项未提交变更 · 最近提交:docs: record subject agent deployment", + "ts": "2026-05-20T05:43:37Z", + "type": "assistant-session" + }, + { + "ts": "2026-05-20T05:43:58Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 5 项未提交变更 · 最近提交:docs: record subject agent deployment", "files_changed": 5 }, { - "ts": "2026-05-20T12:52:31+08:00", + "ts": "2026-05-20T13:45:31+08:00", "type": "commit", - "message": "chore: update worklog", - "hash": "bc46291", - "files_changed": 1 - }, - { - "ts": "2026-05-20T04:53:57Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:chore: update worklog", - "files_changed": 1 - }, - { - "ts": "2026-05-20T13:03:41+08:00", - "type": "commit", - "message": "docs: record subject agent direction", - "hash": "83b151d", - "files_changed": 2 - }, - { - "ts": "2026-05-20T05:03:57Z", - "type": "session-heartbeat", - "message": "Codex 会话活跃 · 最近命令:codex · 分支 main · 1 项未提交变更 · 最近提交:docs: record subject agent direction", - "files_changed": 1 - }, - { - "ts": "2026-05-20T13:07:58+08:00", - "type": "commit", - "message": "fix: quiet subject agent model warnings", - "hash": "e10b1a6", - "files_changed": 2 + "message": "auto-save 2026-05-20 13:45 (~5)", + "hash": "f07bd21", + "files_changed": 5 } ] } diff --git a/RULES.md b/RULES.md index d0e7941..9be18f0 100644 --- a/RULES.md +++ b/RULES.md @@ -15,7 +15,7 @@ ## 部署事实 - 平台:VPS `76.13.31.179`(Ubuntu 24.04 / Docker Compose / Coolify Traefik) -- 发布状态:已部署并验证(2026-05-19,主体元素改为按套图文件夹分组展示,主体生成接口提交后立即返回 queued 占位并后台逐视角生成、逐张回填;转换层为真人重构 / 卡通重构 / 元素重构 / 自主描述四个入口,每个入口最多 3 张参考帧;拖入只加入参考队列,点击生成后固定生成全新 6 视图;胶片双击/拖拽加入参考帧池 + 胶片缓存复用 + 音频解析失败可重试,右侧三栏主体管线:竖向参考帧池 + 转换层 + 主体元素,参考帧缩略图保持小尺寸 9:16 比例 + hover 左侧紧凑预览 + 转换层多参考滚动,旧主体模板区移出主路径 + 逐句时间轴移到原版视频下方并支持双行文案 + 波形同框时间对齐画面胶片 + 胶片密度按钮上移波形顶部 + 去分隔线 + 胶片上下错落 + body 顶层原位大放大 + 隐藏源视频工作区音频解析摘要卡 + 隐藏工作区顶部状态提示条 + 三字段候选生成工作流 + 折叠紧凑候选区);`https://marketing.skg.com` 已启用应用内登录页,未登录 API 返回 401,认证后首页 200;容器内 `/health` 返回 `ok:true` +- 发布状态:已部署并验证(2026-05-20,主体元素按套图文件夹分组展示,主体生成接口提交后立即返回 queued 占位并后台逐视角生成、逐张回填;右侧三栏主体管线为竖向参考帧池 + 对话式转换层 + 主体元素;转换层只保留一个参考区和生图对话,不再显示方向卡片、卡通风格下拉或单独数量按钮,方向、数量、风格、服装统一、人物占比和保留/删除元素都由对话识别后写入 `Job.subject_agent`;胶片双击/拖拽加入参考帧池 + 胶片缓存复用 + 音频解析失败可重试,参考帧缩略图保持小尺寸 9:16 比例 + hover 左侧紧凑预览 + 转换层多参考滚动,旧主体模板区移出主路径 + 逐句时间轴移到原版视频下方并支持双行文案 + 波形同框时间对齐画面胶片 + 胶片密度按钮上移波形顶部 + 去分隔线 + 胶片上下错落 + body 顶层原位大放大 + 隐藏源视频工作区音频解析摘要卡 + 隐藏工作区顶部状态提示条 + 三字段候选生成工作流 + 折叠紧凑候选区);`https://marketing.skg.com` 已启用应用内登录页,未登录 API 返回 401,认证后首页 200;容器内 `/health` 返回 `ok:true` - 最近部署验证(2026-05-19):`fd794e3` 已推送并部署到 `/opt/skg-marketing-studio`;生产 `/health` 显示 `image=gpt-image-2`、`subject_image=gpt-image-2`、`image_request_timeout_seconds=60`、`image_base_url=https://ai.skg.com/ezlink/v1`。容器内最小文字生图探针在 20 秒限制下返回 `ReadTimeout`,说明当前阻塞点是 `https://ai.skg.com/ezlink/v1` 的 `gpt-image-2` 上游通道超时,服务端不会更换图片模型。 - 最近部署验证(2026-05-19):`3756259` 已推送并部署到 `/opt/skg-marketing-studio`;生产 `/health` 显示 `image=gpt-image-2`、`image_fallbacks=['gemini-3-pro-image-preview']`、`subject_image_fallbacks=['gpt-image-2','gemini-3-pro-image-preview']`、短时熔断阈值 2 次 / 600 秒。线上真实探针确认 `gpt-image-2` 读超时后同次调用可自动兜底到 `gemini-3-pro-image-preview` 并返回图片;模拟探针确认连续 2 次主模型失败后第三次直接走 Gemini。 - 最近部署验证(2026-05-20):`c245bff` 已推送并部署到 `/opt/skg-marketing-studio`;本地 `python3 -m py_compile api/main.py` 和 `web/npm run build` 通过,生产 Docker 重建后 `./scripts/verify-prod-docker.sh` 通过(web 容器 Up、API 容器 Up、`/login/` 200、缺失 `_next` 资源 404、未登录 `/api/health` 401、容器内 `api:health ok`)。容器内模型偏好探针确认转换层 `image_model_preference` 路由:`auto -> ['gpt-image-2','gemini-3-pro-image-preview']`、`gpt-image-2 -> ['gpt-image-2']`、`gemini-3-pro-image-preview -> ['gemini-3-pro-image-preview']`。 diff --git a/api/main.py b/api/main.py index 74e7c00..dad9b0d 100644 --- a/api/main.py +++ b/api/main.py @@ -107,6 +107,7 @@ IMAGE_MODEL = GPT_IMAGE_MODEL PRODUCT_VIEW_MODEL = GPT_IMAGE_MODEL SUBJECT_ASSET_IMAGE_MODEL = GPT_IMAGE_MODEL SubjectModelBundle = Literal["gpt", "gemini"] +SubjectAgentMode = Literal["realistic", "cartoon", "elements", "custom"] SUBJECT_AGENT_GPT_MODEL = gpt_model_env("SUBJECT_AGENT_GPT_MODEL", VISION_MODEL) SUBJECT_AGENT_GEMINI_MODEL = os.getenv("SUBJECT_AGENT_GEMINI_MODEL", "gemini-2.5-flash").strip() or "gemini-2.5-flash" SUBJECT_ASSET_IMAGE_MODELS = [GPT_IMAGE_MODEL] + ( @@ -766,7 +767,7 @@ class SubjectAgentState(BaseModel): source_frame_indices: list[int] = Field(default_factory=list) analysis: SubjectAgentAnalysis | None = None messages: list[SubjectAgentMessage] = Field(default_factory=list) - selected_mode: Literal["realistic", "cartoon", "elements", "custom"] = "custom" + selected_mode: SubjectAgentMode = "custom" selected_traits: list[str] = Field(default_factory=list) requirements_zh: str = "" generation_prompt_en: str = "" @@ -4103,27 +4104,85 @@ def _subject_agent_analysis(job_id: str, source_indices: list[int], bundle: Subj ) -def _subject_agent_message_update(state: SubjectAgentState, user_message: str) -> tuple[str, str, str, int, list[str]]: +_SUBJECT_AGENT_MODES: set[str] = {"realistic", "cartoon", "elements", "custom"} + + +def _subject_agent_quantity_from_text(text: str, fallback: int) -> int: + quantity = max(1, min(10, int(fallback or 6))) + text = text or "" + if re.fullmatch(r"\s*\d{1,2}\s*", text): + return max(1, min(10, int(text.strip()))) + digit_match = re.search(r"(\d{1,2})\s*(?:张|个|视图|张图|图|views?)", text, flags=re.I) + if digit_match: + return max(1, min(10, int(digit_match.group(1)))) + cn_numbers = { + "一": 1, + "二": 2, + "两": 2, + "三": 3, + "四": 4, + "五": 5, + "六": 6, + "七": 7, + "八": 8, + "九": 9, + "十": 10, + } + cn_match = re.search(r"([一二两三四五六七八九十])\s*(?:张|个|视图|张图|图)", text) + if cn_match: + return max(1, min(10, cn_numbers.get(cn_match.group(1), quantity))) + return quantity + + +def _subject_agent_mode_from_text(text: str, fallback: SubjectAgentMode = "custom") -> SubjectAgentMode: + compact = re.sub(r"\s+", "", text or "").lower() + if re.search(r"卡通|动画|插画|公仔|潮玩|二次元|cartoon|anime|illustration|toy|stylized", compact): + return "cartoon" + if re.search(r"创意复刻|创意模式|元素|参考创新|不像|换人|全新主体|全新人物|不同人|newperson|newactor|concept|element", compact): + return "elements" + if re.search(r"形象锁定|复刻这个人|复刻形象|同一主体|同一个人|保持这个人|保持原主体|完全复刻|source locked|same subject|sameperson", compact): + return "realistic" + if re.search(r"自主描述|只按文字|不依赖|不用参考|按描述|fromdescription|custom", compact): + return "custom" + return fallback + + +def _subject_agent_mode_from_value(value: object, fallback: SubjectAgentMode) -> SubjectAgentMode: + text = str(value or "").strip() + return text if text in _SUBJECT_AGENT_MODES else fallback + + +def _subject_agent_message_update(state: SubjectAgentState, user_message: str) -> tuple[str, str, str, int, list[str], SubjectAgentMode]: current_req = state.requirements_zh.strip() selected_traits = state.selected_traits[:20] - quantity = max(1, min(10, int(state.quantity or 6))) - qty_match = re.search(r"(\d{1,2})\s*张", user_message) - if qty_match: - quantity = max(1, min(10, int(qty_match.group(1)))) + quantity = _subject_agent_quantity_from_text(user_message, int(state.quantity or 6)) + selected_mode = _subject_agent_mode_from_text(user_message, state.selected_mode) fallback_req = ";".join(part for part in [current_req, user_message.strip()] if part).strip(";") + mode_label = { + "realistic": "source-locked same visible subject reconstruction", + "cartoon": "cartoon or stylized reconstruction", + "elements": "creative element reconstruction with a different new subject", + "custom": "custom description driven subject generation", + }.get(selected_mode, "custom description driven subject generation") fallback_prompt = _ensure_english( "Subject image generation requirements: " + (fallback_req or "create a consistent SKG ad subject pack") + + f". Direction mode: {mode_label}." + + f" Generate exactly {quantity} separate views." + ". Keep one identity and one outfit bible across all generated views. " + (f"Selected traits: {', '.join(selected_traits)}." if selected_traits else "") ) if not LLM_API_KEY: - return "已记录这条生图要求。继续补充要保留/删除的元素,确认后我会按当前要求生成。", fallback_req, fallback_prompt, quantity, selected_traits + return "已记录这条生图要求。继续补充要保留/删除的元素,确认后我会按当前要求生成。", fallback_req, fallback_prompt, quantity, selected_traits, selected_mode system = ( "You are an SKG subject image-generation requirements agent. Your scope is only image generation for a subject view pack. " "Do not answer unrelated video, audio, download, coding, copywriting, or general chat requests; redirect to subject image requirements. " "Normalize the user's fuzzy Chinese request into precise generation constraints. " - "Return strict JSON with keys: assistant_message_zh, updated_requirements_zh, generation_prompt_en, quantity, selected_traits. " + "Infer selected_mode from the conversation. Allowed selected_mode values are realistic, cartoon, elements, custom. " + "Use realistic when the user wants to lock or replicate the visible reference subject; cartoon for stylized/cartoon/toy/illustration; " + "elements when the user wants the creative logic but a different new subject; custom when the user wants free text generation without relying on references. " + "Infer quantity from Chinese or English requests such as 4张, 六视图, generate 8 views. " + "Return strict JSON with keys: assistant_message_zh, updated_requirements_zh, generation_prompt_en, quantity, selected_traits, selected_mode. " "generation_prompt_en must be English and must enforce: one consistent identity, one consistent outfit bible, neck/shoulder readability, no text/watermarks/UI, and legal-safe reconstruction." ) user_payload = { @@ -4153,12 +4212,13 @@ def _subject_agent_message_update(state: SubjectAgentState, user_message: str) - assistant = str(data.get("assistant_message_zh") or "已记录这条生图要求。").strip()[:1200] updated_req = str(data.get("updated_requirements_zh") or fallback_req).strip()[:2200] prompt_en = _ensure_english(str(data.get("generation_prompt_en") or fallback_prompt).strip())[:2600] - out_quantity = max(1, min(10, int(data.get("quantity") or quantity))) + out_quantity = _subject_agent_quantity_from_text(str(data.get("quantity") or ""), quantity) out_traits = _list_of_strings(data.get("selected_traits"), 24) or selected_traits - return assistant, updated_req, prompt_en, out_quantity, out_traits + out_mode = _subject_agent_mode_from_value(data.get("selected_mode"), selected_mode) + return assistant, updated_req, prompt_en, out_quantity, out_traits, out_mode except Exception as e: print(f"[subject agent message failed] bundle={state.model_bundle} error={e}", flush=True) - return "已先按本地规则记录这条要求;模型回复失败时仍可直接生成。", fallback_req, fallback_prompt, quantity, selected_traits + return "已先按本地规则记录这条要求;模型回复失败时仍可直接生成。", fallback_req, fallback_prompt, quantity, selected_traits, selected_mode # ---------- API 路由 ---------- @@ -4179,7 +4239,7 @@ class SubjectAgentMessageReq(BaseModel): model_bundle: SubjectModelBundle = "gpt" source_frame_indices: list[int] = Field(default_factory=list) - selected_mode: Literal["realistic", "cartoon", "elements", "custom"] = "custom" + selected_mode: SubjectAgentMode = "custom" selected_traits: list[str] = Field(default_factory=list) requirements_zh: str = "" message: str = "" @@ -4666,7 +4726,7 @@ def analyze_subject_agent(job_id: str, req: SubjectAgentAnalyzeReq) -> Job: state = job.subject_agent.model_copy(deep=True) assistant_text = ( f"我已用 {req.model_bundle.upper()} 套件分析这些参考帧。" - "你可以选择形象锁定、创意复刻、元素混合或自主描述,也可以继续告诉我要改数量、风格、服装、人物大小。" + "接下来直接告诉我要复刻形象、卡通化、参考创意换新人,还是只按文字生成;数量、风格、服装和人物大小也都写在对话里。" ) messages = (state.messages + [SubjectAgentMessage(role="assistant", content=assistant_text, created_at=time.time())])[-30:] state = state.model_copy(update={ @@ -4689,10 +4749,11 @@ def message_subject_agent(job_id: str, req: SubjectAgentMessageReq) -> Job: raise HTTPException(404, "job not found") state = job.subject_agent.model_copy(deep=True) source_indices = [idx for idx in req.source_frame_indices if any(frame.index == idx for frame in job.frames)][:8] + fallback_mode = req.selected_mode or state.selected_mode state = state.model_copy(update={ "model_bundle": req.model_bundle, "source_frame_indices": source_indices or state.source_frame_indices, - "selected_mode": req.selected_mode, + "selected_mode": fallback_mode, "selected_traits": [str(item).strip()[:80] for item in req.selected_traits if str(item).strip()][:24], "requirements_zh": req.requirements_zh.strip()[:2200] or state.requirements_zh, "quantity": max(1, min(10, int(req.quantity or state.quantity or 6))), @@ -4700,7 +4761,7 @@ def message_subject_agent(job_id: str, req: SubjectAgentMessageReq) -> Job: user_message = req.message.strip() if not user_message: user_message = state.requirements_zh or "按当前设置准备主体套图生成要求" - assistant_text, requirements_zh, prompt_en, quantity, selected_traits = _subject_agent_message_update(state, user_message) + assistant_text, requirements_zh, prompt_en, quantity, selected_traits, selected_mode = _subject_agent_message_update(state, user_message) messages = ( state.messages + [SubjectAgentMessage(role="user", content=user_message, created_at=time.time())] @@ -4709,6 +4770,7 @@ def message_subject_agent(job_id: str, req: SubjectAgentMessageReq) -> Job: state = state.model_copy(update={ "requirements_zh": requirements_zh, "generation_prompt_en": prompt_en, + "selected_mode": selected_mode, "quantity": quantity, "selected_traits": selected_traits, "messages": messages, diff --git a/docs/source-analysis.html b/docs/source-analysis.html index bb172ca..cd5ae76 100644 --- a/docs/source-analysis.html +++ b/docs/source-analysis.html @@ -569,7 +569,7 @@

业务管线

-

当前产品方向已收窄为“信息流广告快速复刻”:主界面左侧是素材输入列,右侧是信息流复刻工作表。后台仍按 01-09 流程顺序计算素材任务、源视频、音频文案、抽帧、主体资产、产品资产、分镜文案、三字段规划和视频候选这些状态,但这些判断不再默认显现在工作区顶部,避免状态提示挤占首屏操作空间。用户粘贴 TK 链接或上传视频后点击“开始分析”,系统自动下载源视频;下载完成后并行启动音频文案路和视频视觉路。音频文案路提取原音频文案/字幕,分析讲话人、语速节奏、背景音乐/环境声/音效,并为后续新口播和分镜文案提供时间轴;视频视觉路同步抽取参考帧。源视频工作区右侧主体链路是“参考帧池 → 转换层 → 主体元素”:参考帧池只作为竖向原始参考,转换层收敛为真人重构、卡通重构、元素重构、自主描述四个入口,每个入口最多接收 3 张参考帧;拖入只加入对应入口的参考队列,不自动生成,用户放好参考和文字后再点击生成 6 视图主体;主体元素区按重构类型分组承接生成结果供后续分镜使用。真人/卡通/元素和有文字的自主描述属于参考创新重构,会先识别参考帧再用参考图通道生成;自主描述没有文字时切到源形象锁定模式,按参考帧复刻同一可见主体;旧下方主体模板库不再作为主路径。波形下方的画面胶片由前端临时从源视频截取,密度可调,点击只跳转原视频时间点,双击或拖入参考帧池才调用手动抽帧接口正式写入关键帧;已写入的胶片显示“已添加”,相同素材、相同密度和时长下会复用内存缓存,避免返回页面时重复扫视频。产品图上传后独立形成产品资产包:自动识别视角、左右/上下/内外侧、结构点、比例和风险,并补缺角度。最终分镜规划按逐句时间轴把文案、主体元素和产品资产汇合;每条分镜默认是左侧“文案 / 场景一句话 / 人物+产品+动作”三字段、右侧横向视频候选轨。客户可直接改中文镜像,前端会调用改写/翻译链路自动优化对应英文主值;单条和整片都可选择生成数量,整片按行排队提交。首尾帧、视觉规划、产品出现方式等细节保留在高级抽屉和后端自动展开逻辑里,不再作为客户默认闸门。

+

当前产品方向已收窄为“信息流广告快速复刻”:主界面左侧是素材输入列,右侧是信息流复刻工作表。后台仍按 01-09 流程顺序计算素材任务、源视频、音频文案、抽帧、主体资产、产品资产、分镜文案、三字段规划和视频候选这些状态,但这些判断不再默认显现在工作区顶部,避免状态提示挤占首屏操作空间。用户粘贴 TK 链接或上传视频后点击“开始分析”,系统自动下载源视频;下载完成后并行启动音频文案路和视频视觉路。音频文案路提取原音频文案/字幕,分析讲话人、语速节奏、背景音乐/环境声/音效,并为后续新口播和分镜文案提供时间轴;视频视觉路同步抽取参考帧。源视频工作区右侧主体链路是“参考帧池 → 转换层 → 主体元素”:参考帧池只作为竖向原始参考,转换层收敛为项目内生图对话智能体,不再默认展示真人重构、卡通重构、元素重构、自主描述四个卡片,也不再单独放数量按钮;用户把 1-3 张参考帧拖入同一个参考区,点击“开始分析”后直接在对话里说明方向、数量、风格、服装统一、人物占比和保留/删除元素,后端从对话中识别当前生成模式和张数,再点击生成主体套图。真人/卡通/元素和有文字的自主描述属于参考创新重构,会先识别参考帧再用参考图通道生成;自主描述没有文字时切到源形象锁定模式,按参考帧复刻同一可见主体;旧下方主体模板库不再作为主路径。波形下方的画面胶片由前端临时从源视频截取,密度可调,点击只跳转原视频时间点,双击或拖入参考帧池才调用手动抽帧接口正式写入关键帧;已写入的胶片显示“已添加”,相同素材、相同密度和时长下会复用内存缓存,避免返回页面时重复扫视频。产品图上传后独立形成产品资产包:自动识别视角、左右/上下/内外侧、结构点、比例和风险,并补缺角度。最终分镜规划按逐句时间轴把文案、主体元素和产品资产汇合;每条分镜默认是左侧“文案 / 场景一句话 / 人物+产品+动作”三字段、右侧横向视频候选轨。客户可直接改中文镜像,前端会调用改写/翻译链路自动优化对应英文主值;单条和整片都可选择生成数量,整片按行排队提交。首尾帧、视觉规划、产品出现方式等细节保留在高级抽屉和后端自动展开逻辑里,不再作为客户默认闸门。

01

素材输入

有当前素材任务即通过;输入框只负责创建或切换任务。

02

源视频下载

job.video_url 存在即通过;created/downloading 视为运行中。公开视频默认不带 cookies 下载;只有 TikTok 明确要求登录态时才配置 YTDLP_COOKIES_FILE,生产容器禁止使用 YTDLP_COOKIES_FROM_BROWSER=chrome

@@ -593,8 +593,8 @@ web/next.config.mjsNext.js 构建配置:静态导出、图片不走优化、禁用开发环境左下角 Next Dev Indicator,并移除 Next 16 已不支持的 eslint 顶层配置,避免本地 dev 出现配置 Issue 提示。 web/app/globals.css全局主题变量、登录页视觉样式、信息流工作台同源品牌 token、ReactFlow 样式引用,以及本地开发态 nextjs-portal 遮挡隐藏规则。工作台在 skg-board-theme 内定义 --skg-gold-1--skg-gold-2--skg-cream--skg-bg-*--skg-text-*--skg-radius-* 和按钮阴影等变量,并新增 skg-board-brandskg-stat-cardskg-primary-actionskg-secondary-actionskg-empty-state 等样式。暗色工作台复用登录页金色聚焦、米白主按钮和弱暖光氛围;明亮模式通过 skg-board-theme--light 复用同一套结构,改成暖白底、白色 panel、黑底主 CTA 和深色文本,不另起一套界面。 web/app/page.tsx产品工作台主状态:jobs、activeJobId、生成任务状态;主渲染为全屏素材输入列 + 信息流广告复刻工作表;“开始分析”会把 job 放入并行素材分析队列,下载完成后触发 triggerTranscribe 解析音频,并触发 analyzeJob 自动抽 12 张参考帧,形成“音频文案路 + 视频视觉路”同步推进;音频失败时会忽略失败状态下残留的半成品 transcript,允许再次触发音频解析;底部吸附音频条和旧全局浮动主题按钮不再从主界面渲染,避免和工作台内的明暗模式切换重复。 - web/components/ad-recreation-board.tsx信息流广告复刻工作表:顶部先展示与登录页连续的 SKG brand strip,包含 SKG 字标、“未来健康 · 营销内容工作台”和“营销内容工作台 · TK 二创”;右侧素材/任务/视频/文案统计改为米白 stat 卡片,主动作按钮统一走 skg-primary-action,次动作走 skg-secondary-action,空状态复用 AnimatedLoginCharactersbuildWorkflowSteps 仍统一生成 01-09 流程顺序、状态和判定依据,WorkflowStepBadge / PipelineLane / 分镜列标题也继续共用同一套编号;但完整 WorkflowOrderBar、右侧素材/视频/音频/文案/参考帧需求 chips、文案依据下拉和“音频文案、抽帧参考、主体重构、产品素材池”四个状态条不再默认渲染在工作区顶部。左侧素材输入只负责链接/上传和任务切换,不再重复放横版原视频预览;右侧源视频工作区直接进入核心操作。讲话人、节奏和背景音分析仍写入 AudioScript,但不再作为“音频解析结果”卡片默认渲染;主工作区左侧宽度调整为 430-460px,上方是按 9:16 显示的竖版原视频播放器,播放器内覆盖“当前点抽帧”,按当前播放秒数手动补参考帧,播放器下方是逐句时间轴,英文和中文都最多显示两行;右侧上方是无标题的波形与切点参考框,下方是三栏主体管线。音频波形用参考图式的连续灰色包络显示响度、停顿和密集爆点,顶部把低/中/高密度按钮和当前播放秒数、总时长、鼠标指针停点秒数直接放在波形上方。视频播放时通过 requestAnimationFrame 平滑驱动波形播放线,同时同步高亮并滚动当前句;点击音频波形或字幕行会跳转原视频时间。音频波形下方同框渲染无标题的 TimelineFilmstrip 临时画面胶片,前端按低/中/高密度从源视频 canvas 截取预览缩略图,并按 frame.time / duration 的百分比定位到和波形同一条时间轴上;波形与胶片之间不显示分隔横线,胶片轨道贴近波形,缩略图轻微上下错落并倾斜重叠排列,hover 时用同一张胶片卡在原位置生成固定顶层克隆,约 4.8 倍放大并自动限制在视口内,避免被工作区、滚动容器或相邻面板遮挡;单击胶片只跳转原视频时间,不写入任务数据,双击胶片或拖进参考帧池时才调用手动抽帧并正式加入 job.frames,已加入的胶片显示“已添加”;胶片预览按 job、视频、密度和时长缓存,未切换低/中/高时返回页面不重新扫视频。右侧参考帧池的主入口是“自动抽帧 12 张”,一键按动作峰值目标重新抽取 12 张源视频参考帧,优先抓手势、表情变化、节奏点和镜头变化;缩略图按竖版完整比例显示不裁切,点选状态直接叠在参考帧池缩略图上,鼠标停留会通过固定浮层放大展示完整帧。转换层不再暴露“生成 10 张高清图”、透明骨架/真人或完整/常用视图开关,改成真人重构、卡通重构、元素重构、自主描述四个投放区;每区最多 3 张参考帧,拖入只加入该区参考队列,用户放好参考和文字后点击按钮才调用 generateSubjectAssets 固定生成 6 视图,卡通重构可选择具体卡通风格,文字方向会进入 prompt;转换层顶部新增生图模型选择(自动 / GPT / Gemini),选择写入当前 job 作用域的 localStorage,只影响当前项目的主体套图生成;四个方向的提示词输入会记忆当前项目常用短语并生成可点击小按键,点击会追加到当前提示词。主体元素区按重构类型分组显示结果;只展示每个 view 的最新一张,缩略图上提供“重新生成这一张”和“删除这一张”,单张重生会用 replace_views=true 替换同一视角。前端当前对真人/元素/自主描述传 subject_style=source_actor,对卡通重构传 subject_style=cartoon_subject;真人、卡通、元素和有文字的自主描述使用 reconstruction_mode=similar,后端先识别关键帧 brief,再把参考帧作为 /images/edits 的 image refs 一起提交;自主描述空文本使用 reconstruction_mode=same 做源形象锁定。主体生成完成后会形成 subject_consensus_brief。音频结果下方是信息流复刻分镜工作台:顶部产品参考区是“同一产品素材池”,不限量上传产品图,不做不同产品身份判断;上传原图推荐长边 1200-2000px、短边至少 600px,但后端会统一生成最长边 1600px、JPEG 92 的 AI 工作副本,并回显尺寸、自动转换和风险标注;上传后按“套在脖子上的 U 形肩颈按摩仪”进行同一产品批量识别,左/右按佩戴者身体左右、上/下按佩戴方向,额外标注内外侧、开口方向、局部结构点、背景类型、用途标签、生成风险和备注,用户只检查备注,鼠标悬停通过固定浮层显示大图预览,能盖过滚动容器和分镜框架;缺视角补图失败时保留重试入口。脚本区在分镜行上方提供“作者想法”和“整片改写”,每行新口播文案可直接编辑并可单段 AI 改写。每条音频分镜默认是左侧三字段、右侧横向视频候选轨;高级区仍保留首尾帧 prompt、产品出现方式和旧 6 字段。ModelTrace 会在音频解析、产品识别/补图、主体重构视图包、脚本改写等入口旁直接展示模型名;生图入口会显示 gpt-image-2 / gemini-3-pro-image-preview 链路和短时熔断规则,点击后用固定浮层展示模型链路、输入输出和回退逻辑。旧分镜卡、抽帧控制和视频生成组件仍保留在文件里,但当前主路径不渲染。 - SourceSubjectPipeline源视频工作区右侧主体管线主路径:三栏分别是竖向 参考帧池转换层主体元素。参考帧池保留自动 12 张、胶片拖入正式成帧、点击勾选和删除;参考帧缩略图保持小尺寸固定宽度、aspect-[9/16]object-contain 显示,hover 预览通过 MediaAssetTile 的左侧紧凑浮层显示。转换层取消四个大投放区,改为项目内生图对话智能体:用户先把 1-3 张参考帧拖入同一个参考区,选择 GPT 套件Gemini 套件,点击“开始分析”后由后端 subject-agent/analyze 识别参考图关键特征、生成中文摘要、英文 generation brief、特征 chip、追问和风险提示。GPT 套件表示 GPT 分析/对话 + gpt-image-2 生图;Gemini 套件表示 Gemini 分析/对话 + gemini-3-pro-image-preview 生图,默认不跨套件偷偷兜底。转换层对话只处理主体生图需求,允许修改形象锁定、卡通重构、创意复刻、自主描述、数量、服装统一、人物占比、保留/删除元素等;对话和分析写入 Job.subject_agent,不再把模型选择作为主状态写入 localStorage。点击“生成 N 张”仍调用 generateSubjectAssets,按当前对话生成的英文 prompt、参考帧、模式和数量提交主体套图。形象锁定走 reconstruction_mode=same,其他参考创新走 similar 并把参考帧作为 /images/edits 的 image refs 一起提交。后端会为每次主体套图注入同一份 pack bible:参考创新模式锁定同一个全新主体和同一套服装,源形象锁定模式锁定参考帧里的可见主体、体态、发型、服装和配色;后处理会裁出白底主体并允许放大到画布高度上限约 96%,实测典型主体有效高度约 90%,避免模型生成“小人 + 大白边”。主体元素区按每次生成的 pack_id 组织成“套图文件夹”:顶部展开当前选中套图,下面是可滚动的套图包列表;同一方向可保留多套,生成中按 pack 显示 2/6 这类进度,单张完成就替换对应占位卡。缩略图复用 MediaAssetTile,支持 hover 放大、单张重生和删除。旧下方 SourceReferenceBuildPanel 不再主路径渲染。 + web/components/ad-recreation-board.tsx信息流广告复刻工作表:顶部先展示与登录页连续的 SKG brand strip,包含 SKG 字标、“未来健康 · 营销内容工作台”和“营销内容工作台 · TK 二创”;右侧素材/任务/视频/文案统计改为米白 stat 卡片,主动作按钮统一走 skg-primary-action,次动作走 skg-secondary-action,空状态复用 AnimatedLoginCharactersbuildWorkflowSteps 仍统一生成 01-09 流程顺序、状态和判定依据,WorkflowStepBadge / PipelineLane / 分镜列标题也继续共用同一套编号;但完整 WorkflowOrderBar、右侧素材/视频/音频/文案/参考帧需求 chips、文案依据下拉和“音频文案、抽帧参考、主体重构、产品素材池”四个状态条不再默认渲染在工作区顶部。左侧素材输入只负责链接/上传和任务切换,不再重复放横版原视频预览;右侧源视频工作区直接进入核心操作。讲话人、节奏和背景音分析仍写入 AudioScript,但不再作为“音频解析结果”卡片默认渲染;主工作区左侧宽度调整为 430-460px,上方是按 9:16 显示的竖版原视频播放器,播放器内覆盖“当前点抽帧”,按当前播放秒数手动补参考帧,播放器下方是逐句时间轴,英文和中文都最多显示两行;右侧上方是无标题的波形与切点参考框,下方是三栏主体管线。音频波形用参考图式的连续灰色包络显示响度、停顿和密集爆点,顶部把低/中/高密度按钮和当前播放秒数、总时长、鼠标指针停点秒数直接放在波形上方。视频播放时通过 requestAnimationFrame 平滑驱动波形播放线,同时同步高亮并滚动当前句;点击音频波形或字幕行会跳转原视频时间。音频波形下方同框渲染无标题的 TimelineFilmstrip 临时画面胶片,前端按低/中/高密度从源视频 canvas 截取预览缩略图,并按 frame.time / duration 的百分比定位到和波形同一条时间轴上;波形与胶片之间不显示分隔横线,胶片轨道贴近波形,缩略图轻微上下错落并倾斜重叠排列,hover 时用同一张胶片卡在原位置生成固定顶层克隆,约 4.8 倍放大并自动限制在视口内,避免被工作区、滚动容器或相邻面板遮挡;单击胶片只跳转原视频时间,不写入任务数据,双击胶片或拖进参考帧池时才调用手动抽帧并正式加入 job.frames,已加入的胶片显示“已添加”;胶片预览按 job、视频、密度和时长缓存,未切换低/中/高时返回页面不重新扫视频。右侧参考帧池的主入口是“自动抽帧 12 张”,一键按动作峰值目标重新抽取 12 张源视频参考帧,优先抓手势、表情变化、节奏点和镜头变化;缩略图按竖版完整比例显示不裁切,点选状态直接叠在参考帧池缩略图上,鼠标停留会通过固定浮层放大展示完整帧。转换层不再暴露“生成 10 张高清图”、透明骨架/真人、完整/常用视图开关、真人/卡通/元素/自主描述卡片、卡通风格下拉或独立数量按钮;现在是“GPT 套件 / Gemini 套件 + 同一参考区 + 开始分析 + 生图对话 + 当前识别摘要 + 生成”的智能体结构,用户把 1-3 张参考帧拖入同一参考区后,在对话里写方向、数量、风格、服装统一和人物占比,后端 subject-agent/message 自动更新 selected_modequantity 和英文 prompt。主体元素区按每次生成的套图文件夹显示结果;缩略图上提供“重新生成这一张”和“删除这一张”,单张重生会用 replace_views=true 替换同一视角。前端对卡通重构传 subject_style=cartoon_subject,其他方向传 subject_style=source_actor;形象锁定或自主描述空文本可走 reconstruction_mode=same,其他参考创新走 similar 并把参考帧作为 /images/edits 的 image refs 一起提交。主体生成完成后会形成 subject_consensus_brief。音频结果下方是信息流复刻分镜工作台:顶部产品参考区是“同一产品素材池”,不限量上传产品图,不做不同产品身份判断;上传原图推荐长边 1200-2000px、短边至少 600px,但后端会统一生成最长边 1600px、JPEG 92 的 AI 工作副本,并回显尺寸、自动转换和风险标注;上传后按“套在脖子上的 U 形肩颈按摩仪”进行同一产品批量识别,左/右按佩戴者身体左右、上/下按佩戴方向,额外标注内外侧、开口方向、局部结构点、背景类型、用途标签、生成风险和备注,用户只检查备注,鼠标悬停通过固定浮层显示大图预览,能盖过滚动容器和分镜框架;缺视角补图失败时保留重试入口。脚本区在分镜行上方提供“作者想法”和“整片改写”,每行新口播文案可直接编辑并可单段 AI 改写。每条音频分镜默认是左侧三字段、右侧横向视频候选轨;高级区仍保留首尾帧 prompt、产品出现方式和旧 6 字段。ModelTrace 会在音频解析、产品识别/补图、主体重构视图包、脚本改写等入口旁直接展示模型名;生图入口会显示 gpt-image-2 / gemini-3-pro-image-preview 链路和短时熔断规则,点击后用固定浮层展示模型链路、输入输出和回退逻辑。旧分镜卡、抽帧控制和视频生成组件仍保留在文件里,但当前主路径不渲染。 + SourceSubjectPipeline源视频工作区右侧主体管线主路径:三栏分别是竖向 参考帧池转换层主体元素。参考帧池保留自动 12 张、胶片拖入正式成帧、点击勾选和删除;参考帧缩略图保持小尺寸固定宽度、aspect-[9/16]object-contain 显示,hover 预览通过 MediaAssetTile 的左侧紧凑浮层显示。转换层取消旧方向卡片、卡通风格下拉和独立数量按钮,改为项目内生图对话智能体:用户先把 1-3 张参考帧拖入同一个参考区,选择 GPT 套件Gemini 套件,点击“开始分析”后由后端 subject-agent/analyze 识别参考图关键特征、生成中文摘要、英文 generation brief、特征 chip、追问和风险提示。GPT 套件表示 GPT 分析/对话 + gpt-image-2 生图;Gemini 套件表示 Gemini 分析/对话 + gemini-3-pro-image-preview 生图,默认不跨套件偷偷兜底。转换层对话只处理主体生图需求,允许修改形象锁定、卡通重构、创意复刻、自主描述、数量、服装统一、人物占比、保留/删除元素等;后端 subject-agent/message 会从对话自动识别 selected_modequantity,界面只展示当前识别摘要,不再要求用户点模式卡或数量按钮。对话和分析写入 Job.subject_agent,不再把模型选择作为主状态写入 localStorage。点击“生成 N 张”仍调用 generateSubjectAssets,按当前对话生成的英文 prompt、参考帧、模式和数量提交主体套图。形象锁定走 reconstruction_mode=same,其他参考创新走 similar 并把参考帧作为 /images/edits 的 image refs 一起提交。后端会为每次主体套图注入同一份 pack bible:参考创新模式锁定同一个全新主体和同一套服装,源形象锁定模式锁定参考帧里的可见主体、体态、发型、服装和配色;后处理会裁出白底主体并允许放大到画布高度上限约 96%,实测典型主体有效高度约 90%,避免模型生成“小人 + 大白边”。主体元素区按每次生成的 pack_id 组织成“套图文件夹”:顶部展开当前选中套图,下面是可滚动的套图包列表;同一方向可保留多套,生成中按 pack 显示 2/6 这类进度,单张完成就替换对应占位卡。缩略图复用 MediaAssetTile,支持 hover 放大、单张重生和删除。旧下方 SourceReferenceBuildPanel 不再主路径渲染。 AudioStoryboardPlanPanel 三字段候选生成当前分镜主路径:每行是左右双栏,左侧默认显示 skg_copy_*scene_one_line_*action_one_line_* 三组中英字段,右侧直接显示视频候选横向轨。用户改中文镜像后,字段失焦会通过 refineStoryboard 优化对应英文主值,失败时退回 translateText;英文仍是后续 prompt 主值。quickPlanStoryboard 把三字段和主体 brief 展开为完整 StoryboardScenegenerateStoryboardVideocount 可由单行数字控件选择,候选新生成后持续向右追加,不再用 4-grid 撑高每行。整片生成同样可选择每行数量,并以 concurrency=1 按行排队提交。产品素材池、批量控制、每行主体区和高级区都可折叠,高级抽屉仍展示旧 6 字段、首尾帧 prompt 和首尾帧资产槽,但客户默认不用先处理首尾帧。 web/components/resource-library/library-drawer.tsx全局资源中心浮窗:由工作台顶部“资源库”按钮打开,叠加在工作台上方但不阻塞主界面;尺寸、位置和当前 Tab 写入 localStorage["skg-resource-library-drawer"]。提示词 Tab 固定 5 列(场景描述、视频描述、主体描述、SKG 文案、产品角度),每列先显示 use_count 排名前 5 的“常用”,再按月份倒序分组;提示词节点常驻复制按钮,hover 可选英文/中文/双语复制,并调用 use 接口。素材 Tab 固定 4 列(主体、产品、场景、视频),节点不可拖动,按月份倒序硬编码排列;“应用到当前 job”只调用后端复制接口,得到普通 ImageRef(kind="asset") 后再写入产品素材池或复制 ID。浮窗顶部最近 24 小时横条混合显示提示词和素材;新建提示词、上传素材、删除前查引用、详情侧栏都在该组件内完成。 AdRecreationBoard 主题切换顶部指标区左侧有“明亮/暗色”按钮,使用 Sun / Moon 图标切换 skg-board-theme--light 类名,并把选择写入 localStorage["skg-board-theme"]。暗色仍是默认模式;明亮模式只改变工作台外观,不改变任务、素材、分镜、模型调用或接口数据。 @@ -1003,8 +1003,8 @@ ProductRefStateItem { 应用清洗POST /cleanup/applyapplyCleanedFrame物理覆盖 frames/{idx}.jpg,并备份原图。 元素增改删POST/PATCH/DELETE /elementsaddElement/updateElement/deleteElement让用户修正 Vision 错误,避免候选结果锁死。 元素提取POST /elements/{element_id}/cutoutcutoutElement调用图像模型生成独立白底素材图,每次累积一张 cutout。 - 转换层生图智能体POST /jobs/{id}/subject-agent/analyze
POST /jobs/{id}/subject-agent/messageanalyzeSubjectAgent
sendSubjectAgentMessage项目内主体生图对话状态入口。analyze 接收当前转换层参考帧和 model_bundle=gpt/gemini,调用对应套件的视觉模型输出中文摘要、英文 generation brief、特征 chip、追问和风险提示,并写入 Job.subject_agent.analysismessage 只处理主体生图需求,把用户对数量、风格、服装统一、形象锁定/创意复刻、保留/删除元素的自然语言改成 requirements_zh 和英文 generation_prompt_en。GPT 套件后续生图用 gpt-image-2,Gemini 套件后续生图用 gemini-3-pro-image-preview。 - 主体资产包POST /elements/{element_id}/subject-assets
DELETE /elements/{element_id}/subject-assets/{asset_id}generateSubjectAssets
deleteSubjectAsset根据转换层里的参考帧重新绘制一个统一主体资产包;前端按真人重构、卡通重构、元素重构、自主描述四个方向分别管理 source_frame_indices,每个方向最多 3 张参考帧,固定请求 frontthree_quarter_leftleftbackrightthree_quarter_right 六个视图,不再暴露完整 10 / 常用 4 选择。当前源视频工作区使用 subject_style=source_actor 承接真人、元素和自主描述,使用 subject_style=cartoon_subject 承接卡通重构;旧 transparent_human 仍为兼容类型但不是当前转换层默认入口。reconstruction_mode=similar 是参考创新路径:后端先用 VISION_MODEL 把关键帧反推成主体 brief;只要有参考帧,就把这些帧作为 /images/edits 的 image refs 一起提交,日志会显示 endpoint=/images/editsimage_refs>0,不再偷偷降级为纯文字生图。卡通重构在后端额外加入原创卡通/插画主体约束,明确不输出真实人物复制 likeness。生成完成后,后端会把生成视图反推/写入 KeyElement.subject_consensus_brief,作为后续首尾帧的唯一主体身份文字依据。reconstruction_mode=same 是源形象锁定路径:自主描述空文本时前端使用该路径,后端把参考帧作为 primary visual evidence,尽量保留同一可见主体、体态、发型、服装和配色。每个 view 单独调用一次生图,明确禁止多视图拼图、contact sheet、多主体、多面板、标签或对比排版。单次图片请求受 IMAGE_REQUEST_TIMEOUT_SECONDS 控制,默认 60 秒;gpt-image-2 超时、429、5xx、DNS 或连接失败时可兜底 gemini-3-pro-image-preview,连续 2 次主模型上游类失败后 600 秒内短时熔断。仅当 image_model_preference=auto 时才启用兜底和熔断;用户显式选择 GPT 或 Gemini 时只走所选模型,方便已知某个上游不可用时直接切换。主体同一套图内一旦触发 Gemini,后续视图沿用 Gemini,避免风格混杂和重复等待主模型超时。主体 prompt 会要求从参考图继承性别、人种/肤色、年龄体态和角色气质等广义特征,但生成同一个全新主体;六视图必须保持同一脸部设定、发型、体态、服装类型、配色、材质、剪裁和配饰,不允许每个视角换衣服。后端新增 pack bible 固定字段,把主体、发型、肤色、体态、服装、鞋、配饰和禁止换装项注入每个视角;_normalize_asset_image(fill_subject=true) 裁白边后会按目标画布放大主体,而不是只用 thumbnail() 缩小,目标是让全身主体占画布高度约 88-94%。后端不再要求整包全成功才写入:单个视图失败时会保留已成功生成的主体图,返回“部分生成完成”,只有一张都没生成出来才返回错误。replace_views=true 时会替换同一视角旧图;删除接口会移除对应 subject asset 记录并删除本地 jpg 文件。 + 转换层生图智能体POST /jobs/{id}/subject-agent/analyze
POST /jobs/{id}/subject-agent/messageanalyzeSubjectAgent
sendSubjectAgentMessage项目内主体生图对话状态入口。analyze 接收当前转换层同一个参考区里的参考帧和 model_bundle=gpt/gemini,调用对应套件的视觉模型输出中文摘要、英文 generation brief、特征 chip、追问和风险提示,并写入 Job.subject_agent.analysismessage 只处理主体生图需求,把用户对方向、数量、风格、服装统一、人物占比、形象锁定/创意复刻、保留/删除元素的自然语言改成 selected_modequantityrequirements_zh 和英文 generation_prompt_en。GPT 套件后续生图用 gpt-image-2,Gemini 套件后续生图用 gemini-3-pro-image-preview。 + 主体资产包POST /elements/{element_id}/subject-assets
DELETE /elements/{element_id}/subject-assets/{asset_id}generateSubjectAssets
deleteSubjectAsset根据转换层同一个参考区和对话状态重新绘制一个统一主体资产包;前端不再拆成多个入口分别管理参考帧,只把最多 3 张参考帧、对话识别出的 selected_mode、数量和英文 prompt 提交给生成接口。当前源视频工作区使用 subject_style=source_actor 承接形象锁定、创意复刻和自主描述,使用 subject_style=cartoon_subject 承接对话识别出的卡通重构;旧 transparent_human 仍为兼容类型但不是当前转换层默认入口。reconstruction_mode=similar 是参考创新路径:后端先用 VISION_MODEL 把关键帧反推成主体 brief;只要有参考帧,就把这些帧作为 /images/edits 的 image refs 一起提交,日志会显示 endpoint=/images/editsimage_refs>0,不再偷偷降级为纯文字生图。卡通重构在后端额外加入原创卡通/插画主体约束,明确不输出真实人物复制 likeness。生成完成后,后端会把生成视图反推/写入 KeyElement.subject_consensus_brief,作为后续首尾帧的唯一主体身份文字依据。reconstruction_mode=same 是源形象锁定路径:自主描述空文本或对话要求形象锁定时可使用该路径,后端把参考帧作为 primary visual evidence,尽量保留同一可见主体、体态、发型、服装和配色。每个 view 单独调用一次生图,明确禁止多视图拼图、contact sheet、多主体、多面板、标签或对比排版。单次图片请求受 IMAGE_REQUEST_TIMEOUT_SECONDS 控制,默认 60 秒;gpt-image-2 超时、429、5xx、DNS 或连接失败时可兜底 gemini-3-pro-image-preview,连续 2 次主模型上游类失败后 600 秒内短时熔断。仅当 image_model_preference=auto 时才启用兜底和熔断;用户显式选择 GPT 或 Gemini 时只走所选模型,方便已知某个上游不可用时直接切换。主体同一套图内一旦触发 Gemini,后续视图沿用 Gemini,避免风格混杂和重复等待主模型超时。主体 prompt 会要求从参考图继承性别、人种/肤色、年龄体态和角色气质等广义特征,但生成同一个全新主体;多视图必须保持同一脸部设定、发型、体态、服装类型、配色、材质、剪裁和配饰,不允许每个视角换衣服。后端新增 pack bible 固定字段,把主体、发型、肤色、体态、服装、鞋、配饰和禁止换装项注入每个视角;_normalize_asset_image(fill_subject=true) 裁白边后会按目标画布放大主体,而不是只用 thumbnail() 缩小,目标是让全身主体占画布高度约 88-94%。后端不再要求整包全成功才写入:单个视图失败时会保留已成功生成的主体图,返回“部分生成完成”,只有一张都没生成出来才返回错误。replace_views=true 时会替换同一视角旧图;删除接口会移除对应 subject asset 记录并删除本地 jpg 文件。 主体套图状态SubjectAsset.status
pack_idweb/app/page.tsx
SourceSubjectPipelinegenerateSubjectAssets 现在先写入同一个 pack_id 下的 queued 占位卡并立即返回,后台按视角逐张生成,单张完成就把该占位替换成 completed 图片。前端轮询会把 queued / in_progress 主体资产纳入运行状态;主体元素区按 pack 显示套图文件夹,点击某个文件夹后展开该套图,其他套图顺位进入下方可滚动列表。 首尾帧资产POST /frames/{idx}/scene-assetgenerateSceneAsset同一接口兼容旧场景图和新首尾帧;当前信息流复刻流程传 asset_role=first_frame/last_framesubject_brief 和最多 1-2 张 product_images。首尾帧不再传主体图、不再把主体图和产品图拼成 contact sheet;主体只走文字 brief,允许新动作、新景别、新表情和新环境。若本条需要产品,后端只把产品参考图作为 gpt-image-2 image-edit 的硬视觉真源;若不需要产品,则走纯文字生图。关键帧只作为行数据承载位置。生成结果保存在 scene_assets,前端再写入 StoryboardScene.first_image/last_image。 产品图库GET /product-library/skglistProductLibrary读取内置 SKG 白底图库 manifest,返回产品标题、品类、尺寸、白底评分和预览图 URL。 @@ -1131,6 +1131,19 @@ ProductRefStateItem {

变更记录

这个记录不是 git log 的替代品。它记录“产品理解发生了什么变化、影响了哪些源码、你以后描述需求时该怎么说”。后续每次改功能都要补一条。

+
+
+

2026-05-20 · 转换层方向和数量并入对话

+ UI + API + Workflow +
+
+

问题:转换层已经是生图智能体,但界面仍保留四个方向卡片、卡通风格下拉和数量按钮,用户需要在“对话”和“控件”之间来回确认,违背“模糊需求通过对话收口”的目标。

+

改动:SourceSubjectPipeline 删除方向卡片和独立数量控件,只显示当前识别出的方向与张数摘要;用户在对话里写“形象锁定 / 卡通重构 / 创意复刻 / 自主描述”和“生成几张”,后端 subject-agent/message 会解析并更新 selected_modequantity、中文需求和英文生成 prompt。

+

影响:数量、方向和风格以后都通过转换层对话完成;点击“生成 N 张”时使用对话状态,不再要求用户点卡片或另选数量。卡通风格若在对话里说明,会进入英文 prompt,不再被前端默认 3D 风格硬覆盖。

+
+

2026-05-20 · 转换层改为项目内生图对话智能体

@@ -1139,7 +1152,7 @@ ProductRefStateItem { Workflow
-

问题:四个投放区加 textarea 的转换层不适合“参考图先分析、再边聊边确定生图需求”的模糊决策流程;同时 GPT/Gemini 切换必须成套影响分析对话模型和生图模型,不能只切图片模型。

+

问题:旧多方向卡片加 textarea 的转换层不适合“参考图先分析、再边聊边确定生图需求”的模糊决策流程;同时 GPT/Gemini 切换必须成套影响分析对话模型和生图模型,不能只切图片模型。

改动:Job 新增 subject_agent 状态,保存当前项目的模型套件、参考帧、AI 分析、对话消息、选中方向、特征 chip、数量和英文生成 prompt。后端新增 POST /jobs/{job_id}/subject-agent/analyzePOST /jobs/{job_id}/subject-agent/messageSourceSubjectPipeline 的转换层改成“GPT 套件 / Gemini 套件 + 参考图 + 开始分析 + 生图对话 + 数量 + 生成”结构。选 GPT 时分析/对话走 GPT、图片走 gpt-image-2;选 Gemini 时分析/对话走 Gemini、图片走 gemini-3-pro-image-preview

影响:转换层不再把生图模型偏好写入浏览器全局或 job-scoped localStorage 作为主状态;当前项目的生图记忆跟随 state.json。用户可以在对话里改“生成几张、保留什么、删除什么、人物放大、服装统一、形象锁定/创意复刻/卡通/自主描述”,确认后仍复用 generateSubjectAssets 逐张生成并进入右侧主体元素套图文件夹。

@@ -1230,7 +1243,7 @@ ProductRefStateItem {

问题:拖入第一张参考帧就立即开始生成,会打断用户继续补第二、第三张参考帧和填写方向文字。

-

改动:SourceSubjectPipelineaddConversionFrame 只更新对应重构入口的参考队列和提示,不再调用 generateSubjectPack;四个入口仍保留独立生成按钮,用户放好参考后再手动提交。

+

改动:SourceSubjectPipelineaddConversionFrame 只更新对应重构入口的参考队列和提示,不再调用 generateSubjectPack;旧版本曾保留独立生成按钮,用户放好参考后再手动提交。

影响:当前正确操作是“拖入 1-3 张参考帧 → 可写方向文字/选卡通风格 → 点击生成 6 视图”。

@@ -1243,7 +1256,7 @@ ProductRefStateItem {

问题:旧转换层暴露“透明骨架 / 真人、完整 10 / 常用 4”等生成参数,和当前“参考创新生产套图、避免侵权”的目标不一致;用户更需要把少量参考帧拖到明确方向上,右侧马上看到生成结果。

-

改动:SourceSubjectPipeline 的转换层改成真人重构、卡通重构、元素重构、自主描述四个投放区;每区最多 3 张参考帧,拖入只加入参考队列,点击生成按钮才生成固定 6 视图,文字描述会参与 prompt,卡通重构可选择风格。主体元素区按重构类型分组展示结果。web/lib/api.tsapi/main.py 扩展 subject_style=cartoon_subject,后端对卡通主体额外加入原创卡通/插画约束。

+

改动:SourceSubjectPipeline 的转换层曾改成多方向入口;文字描述会参与 prompt,卡通重构可选择风格。主体元素区按重构类型分组展示结果。web/lib/api.tsapi/main.py 扩展 subject_style=cartoon_subject,后端对卡通主体额外加入原创卡通/插画约束。

影响:后续描述这块应说“把参考帧拖到某个重构方向,生成全新主体 6 视图”,不要再说“抠图”“模仿”“透明骨架/真人开关”或“10 张/4 张选择”。

diff --git a/web/components/ad-recreation-board.tsx b/web/components/ad-recreation-board.tsx index ed730b3..a5befab 100644 --- a/web/components/ad-recreation-board.tsx +++ b/web/components/ad-recreation-board.tsx @@ -1147,7 +1147,9 @@ function buildReconstructionDirection( } else if (mode === "cartoon") { common.push( "Direction mode: cartoon reconstruction.", - `Cartoon style: ${style.label}; ${style.prompt}.`, + trimmed + ? `Cartoon style: follow the user's requested style from the direction text; if no explicit cartoon style is specified, use ${style.label}; ${style.prompt}.` + : `Cartoon style: ${style.label}; ${style.prompt}.`, "Transform broad pose, emotion, body-readability, and ad energy into a fully original stylized character, not a realistic human and not a traced version of the source.", ) } else if (mode === "elements") { @@ -3316,8 +3318,7 @@ function SourceSubjectPipeline({ const [agentInput, setAgentInput] = useState("") const [subjectAgentBusy, setSubjectAgentBusy] = useState<"analyze" | "message" | null>(null) const [promptMemoryByMode, setPromptMemoryByMode] = useState>(() => loadSubjectPromptMemory(job.id)) - const [cartoonStyle, setCartoonStyle] = useState("3d_animation") - const [cartoonStyleOpen, setCartoonStyleOpen] = useState(false) + const [cartoonStyle] = useState("3d_animation") const [subjectBusyFor, setSubjectBusyFor] = useState<{ jobId: string; jobLabel: string; mode: SubjectReconstructionMode; viewCount: number; sourceCount: number; profileLabel: string; modelLabel: string } | null>(null) const [subjectAssetBusy, setSubjectAssetBusy] = useState(null) const [expandedSubjectPackKey, setExpandedSubjectPackKey] = useState(null) @@ -3417,7 +3418,6 @@ function SourceSubjectPipeline({ setLastSubjectProfile(null) setSubjectBusyFor(null) setSubjectAssetBusy(null) - setCartoonStyleOpen(false) setExpandedSubjectPackKey(null) }, [job.id]) @@ -3917,72 +3917,20 @@ function SourceSubjectPipeline({
-
- {RECONSTRUCTION_MODES.map((modeConfig) => ( - - ))} -
- - {agentMode === "cartoon" ? ( -
- - {cartoonStyleOpen ? ( -
- {CARTOON_RECONSTRUCTION_STYLES.map((style) => ( - - ))} -
- ) : null} +
+
+ + 方向:{reconstructionModeConfig(agentMode).label} + + + 数量:{selectedSubjectViews.length} 张 + + + 对话自动识别 +
- ) : null} - -
- 数量 -
- {[4, 6, 8, 10].map((count) => ( - - ))} +
+ 在下方直接说“形象锁定 / 卡通重构 / 创意复刻 / 自主描述”和“生成几张”,系统会更新这里,不再单独点卡片或数量。