From b6d7febbdec872bb426d5f1e7219cc34cc126667 Mon Sep 17 00:00:00 2001 From: kang Date: Thu, 21 May 2026 21:53:46 +0800 Subject: [PATCH] fix: stream media previews --- .memory/worklog.json | 2698 +++++++++--------- src/app/api/img/[bucket]/[filename]/route.ts | 15 +- src/app/api/video-file/[filename]/route.ts | 68 +- src/app/page.tsx | 15 +- src/components/HoverImagePreview.tsx | 5 + src/components/PackPanel.tsx | 2 +- src/components/ProjectGalleryDrawer.tsx | 6 +- src/components/Sidebar.tsx | 2 +- src/lib/storage.ts | 57 +- 9 files changed, 1490 insertions(+), 1378 deletions(-) diff --git a/.memory/worklog.json b/.memory/worklog.json index 1ffbff5..b45cfb5 100644 --- a/.memory/worklog.json +++ b/.memory/worklog.json @@ -1,1920 +1,1940 @@ { - "entries" : [ + "entries": [ { - "files_changed" : 0, - "hash" : "", - "message" : "项目创建: AI玩具专利生成工作流", - "ts" : "2026-05-18T00:00:00+08:00", - "type" : "milestone" + "files_changed": 0, + "hash": "", + "message": "项目创建: AI玩具专利生成工作流", + "ts": "2026-05-18T00:00:00+08:00", + "type": "milestone" }, { - "files_changed" : 6, - "hash" : "5e4c6e5", - "message" : "init: project scaffold", - "ts" : "2026-05-18T10:35:02+08:00", - "type" : "commit" + "files_changed": 6, + "hash": "5e4c6e5", + "message": "init: project scaffold", + "ts": "2026-05-18T10:35:02+08:00", + "type": "commit" }, { - "files_changed" : 4, - "hash" : "0accb73", - "message" : "auto-save 2026-05-18 10:39 (+1, ~1)", - "ts" : "2026-05-18T10:39:25+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "0accb73", + "message": "auto-save 2026-05-18 10:39 (+1, ~1)", + "ts": "2026-05-18T10:39:25+08:00", + "type": "commit" }, { - "files_changed" : 20, - "hash" : "494779d", - "message" : "auto-save 2026-05-18 10:44 (+6, ~2)", - "ts" : "2026-05-18T10:46:21+08:00", - "type" : "commit" + "files_changed": 20, + "hash": "494779d", + "message": "auto-save 2026-05-18 10:44 (+6, ~2)", + "ts": "2026-05-18T10:46:21+08:00", + "type": "commit" }, { - "files_changed" : 4, - "hash" : "aa5cac1", - "message" : "auto-save 2026-05-18 10:53 (+2, ~2)", - "ts" : "2026-05-18T10:53:53+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "aa5cac1", + "message": "auto-save 2026-05-18 10:53 (+2, ~2)", + "ts": "2026-05-18T10:53:53+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "8e1147c", - "message" : "feat: MVP 跑通 — prompt → 批量生成 → 九宫格快筛 → 选中落盘", - "ts" : "2026-05-18T11:07:53+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "8e1147c", + "message": "feat: MVP 跑通 — prompt → 批量生成 → 九宫格快筛 → 选中落盘", + "ts": "2026-05-18T11:07:53+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "启动 Codex 接力会话 · 已载入 Claude 最近会话,等待下一条指令 · 分支 master · 1 项未提交变更 · 最近提交:feat: MVP 跑通 — prompt → 批量生成 → 九宫格快筛 → 选中落盘", - "ts" : "2026-05-18T15:13:48Z", - "type" : "assistant-session" + "files_changed": 1, + "message": "启动 Codex 接力会话 · 已载入 Claude 最近会话,等待下一条指令 · 分支 master · 1 项未提交变更 · 最近提交:feat: MVP 跑通 — prompt → 批量生成 → 九宫格快筛 → 选中落盘", + "ts": "2026-05-18T15:13:48Z", + "type": "assistant-session" }, { - "files_changed" : 1, - "message" : "启动 Cursor 接力会话 · 已载入 Claude 最近会话,等待下一条指令 · 分支 master · 1 项未提交变更 · 最近提交:feat: MVP 跑通 — prompt → 批量生成 → 九宫格快筛 → 选中落盘", - "ts" : "2026-05-18T15:14:10Z", - "type" : "assistant-session" + "files_changed": 1, + "message": "启动 Cursor 接力会话 · 已载入 Claude 最近会话,等待下一条指令 · 分支 master · 1 项未提交变更 · 最近提交:feat: MVP 跑通 — prompt → 批量生成 → 九宫格快筛 → 选中落盘", + "ts": "2026-05-18T15:14:10Z", + "type": "assistant-session" }, { - "files_changed" : 2, - "hash" : "e3555da", - "message" : "auto-save 2026-05-18 23:15 (+1, ~1)", - "ts" : "2026-05-18T23:15:09+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "e3555da", + "message": "auto-save 2026-05-18 23:15 (+1, ~1)", + "ts": "2026-05-18T23:15:09+08:00", + "type": "commit" }, { - "files_changed" : 2, - "message" : "启动 Claude 接力会话 · 已载入 Claude / Codex 最近会话,等待下一条指令 · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-18 23:15 (+1, ~1)", - "ts" : "2026-05-18T15:16:48Z", - "type" : "assistant-session" + "files_changed": 2, + "message": "启动 Claude 接力会话 · 已载入 Claude / Codex 最近会话,等待下一条指令 · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-18 23:15 (+1, ~1)", + "ts": "2026-05-18T15:16:48Z", + "type": "assistant-session" }, { - "files_changed" : 3, - "hash" : "446e012", - "message" : "auto-save 2026-05-18 23:20 (~3)", - "ts" : "2026-05-18T23:22:17+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "446e012", + "message": "auto-save 2026-05-18 23:20 (~3)", + "ts": "2026-05-18T23:22:17+08:00", + "type": "commit" }, { - "files_changed" : 4, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 4 项未提交变更 · 最近提交:auto-save 2026-05-18 23:20 (~3)", - "ts" : "2026-05-18T15:23:50Z", - "type" : "session-heartbeat" + "files_changed": 4, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 4 项未提交变更 · 最近提交:auto-save 2026-05-18 23:20 (~3)", + "ts": "2026-05-18T15:23:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 6, - "message" : "Claude 会话活跃 · 最近命令:claude · 分支 master · 6 项未提交变更 · 最近提交:auto-save 2026-05-18 23:20 (~3)", - "ts" : "2026-05-18T15:26:50Z", - "type" : "session-heartbeat" + "files_changed": 6, + "message": "Claude 会话活跃 · 最近命令:claude · 分支 master · 6 项未提交变更 · 最近提交:auto-save 2026-05-18 23:20 (~3)", + "ts": "2026-05-18T15:26:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 7, - "hash" : "52a5b77", - "message" : "auto-save 2026-05-18 23:28 (+1, ~6)", - "ts" : "2026-05-18T23:28:34+08:00", - "type" : "commit" + "files_changed": 7, + "hash": "52a5b77", + "message": "auto-save 2026-05-18 23:28 (+1, ~6)", + "ts": "2026-05-18T23:28:34+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-18 23:28 (+1, ~6)", - "ts" : "2026-05-18T15:33:50Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-18 23:28 (+1, ~6)", + "ts": "2026-05-18T15:33:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Claude 会话活跃 · 最近命令:claude · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-18 23:28 (+1, ~6)", - "ts" : "2026-05-18T15:36:50Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Claude 会话活跃 · 最近命令:claude · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-18 23:28 (+1, ~6)", + "ts": "2026-05-18T15:36:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "hash" : "36fb4f9", - "message" : "auto-save 2026-05-18 23:39 (~2, -1)", - "ts" : "2026-05-18T23:39:25+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "36fb4f9", + "message": "auto-save 2026-05-18 23:39 (~2, -1)", + "ts": "2026-05-18T23:39:25+08:00", + "type": "commit" }, { - "files_changed" : 4, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 4 项未提交变更 · 最近提交:auto-save 2026-05-18 23:39 (~2, -1)", - "ts" : "2026-05-18T15:43:50Z", - "type" : "session-heartbeat" + "files_changed": 4, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 4 项未提交变更 · 最近提交:auto-save 2026-05-18 23:39 (~2, -1)", + "ts": "2026-05-18T15:43:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 11, - "hash" : "31df279", - "message" : "auto-save 2026-05-18 23:44 (+6, ~5)", - "ts" : "2026-05-18T23:44:50+08:00", - "type" : "commit" + "files_changed": 11, + "hash": "31df279", + "message": "auto-save 2026-05-18 23:44 (+6, ~5)", + "ts": "2026-05-18T23:44:50+08:00", + "type": "commit" }, { - "files_changed" : 3, - "message" : "Claude 会话活跃 · 最近命令:claude · 分支 master · 3 项未提交变更 · 最近提交:auto-save 2026-05-18 23:44 (+6, ~5)", - "ts" : "2026-05-18T15:46:50Z", - "type" : "session-heartbeat" + "files_changed": 3, + "message": "Claude 会话活跃 · 最近命令:claude · 分支 master · 3 项未提交变更 · 最近提交:auto-save 2026-05-18 23:44 (+6, ~5)", + "ts": "2026-05-18T15:46:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "hash" : "a1b783c", - "message" : "auto-save 2026-05-18 23:50 (~2, -1)", - "ts" : "2026-05-18T23:50:17+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "a1b783c", + "message": "auto-save 2026-05-18 23:50 (~2, -1)", + "ts": "2026-05-18T23:50:17+08:00", + "type": "commit" }, { - "files_changed" : 2, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-18 23:50 (~2, -1)", - "ts" : "2026-05-18T15:53:50Z", - "type" : "session-heartbeat" + "files_changed": 2, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-18 23:50 (~2, -1)", + "ts": "2026-05-18T15:53:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 16, - "hash" : "4eda85e", - "message" : "auto-save 2026-05-18 23:55 (+5, ~9)", - "ts" : "2026-05-18T23:55:42+08:00", - "type" : "commit" + "files_changed": 16, + "hash": "4eda85e", + "message": "auto-save 2026-05-18 23:55 (+5, ~9)", + "ts": "2026-05-18T23:55:42+08:00", + "type": "commit" }, { - "files_changed" : 8, - "message" : "Claude 会话活跃 · 最近命令:claude · 分支 master · 8 项未提交变更 · 最近提交:auto-save 2026-05-18 23:55 (+5, ~9)", - "ts" : "2026-05-18T15:56:50Z", - "type" : "session-heartbeat" + "files_changed": 8, + "message": "Claude 会话活跃 · 最近命令:claude · 分支 master · 8 项未提交变更 · 最近提交:auto-save 2026-05-18 23:55 (+5, ~9)", + "ts": "2026-05-18T15:56:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 8, - "hash" : "608810a", - "message" : "auto-save 2026-05-19 00:01 (~8)", - "ts" : "2026-05-19T00:01:07+08:00", - "type" : "commit" + "files_changed": 8, + "hash": "608810a", + "message": "auto-save 2026-05-19 00:01 (~8)", + "ts": "2026-05-19T00:01:07+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 00:01 (~8)", - "ts" : "2026-05-18T16:03:50Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 00:01 (~8)", + "ts": "2026-05-18T16:03:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "05533be", - "message" : "auto-save 2026-05-19 00:06 (+1, ~1)", - "ts" : "2026-05-19T00:06:32+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "05533be", + "message": "auto-save 2026-05-19 00:06 (+1, ~1)", + "ts": "2026-05-19T00:06:32+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Claude 会话活跃 · 最近命令:claude · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 00:06 (+1, ~1)", - "ts" : "2026-05-18T16:06:50Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Claude 会话活跃 · 最近命令:claude · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 00:06 (+1, ~1)", + "ts": "2026-05-18T16:06:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 4, - "hash" : "c3a4637", - "message" : "auto-save 2026-05-19 00:11 (+3, ~1)", - "ts" : "2026-05-19T00:11:58+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "c3a4637", + "message": "auto-save 2026-05-19 00:11 (+3, ~1)", + "ts": "2026-05-19T00:11:58+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 00:11 (+3, ~1)", - "ts" : "2026-05-18T16:13:50Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 00:11 (+3, ~1)", + "ts": "2026-05-18T16:13:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 7, - "message" : "Claude 会话活跃 · 最近命令:claude · 分支 master · 7 项未提交变更 · 最近提交:auto-save 2026-05-19 00:11 (+3, ~1)", - "ts" : "2026-05-18T16:16:50Z", - "type" : "session-heartbeat" + "files_changed": 7, + "message": "Claude 会话活跃 · 最近命令:claude · 分支 master · 7 项未提交变更 · 最近提交:auto-save 2026-05-19 00:11 (+3, ~1)", + "ts": "2026-05-18T16:16:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 8, - "hash" : "361bbef", - "message" : "auto-save 2026-05-19 00:17 (~8)", - "ts" : "2026-05-19T00:18:42+08:00", - "type" : "commit" + "files_changed": 8, + "hash": "361bbef", + "message": "auto-save 2026-05-19 00:17 (~8)", + "ts": "2026-05-19T00:18:42+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 00:17 (~8)", - "ts" : "2026-05-18T16:23:50Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 00:17 (~8)", + "ts": "2026-05-18T16:23:50Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Claude 会话活跃 · 最近命令:claude · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 00:17 (~8)", - "ts" : "2026-05-18T16:26:51Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Claude 会话活跃 · 最近命令:claude · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 00:17 (~8)", + "ts": "2026-05-18T16:26:51Z", + "type": "session-heartbeat" }, { - "files_changed" : 4, - "hash" : "23bf877", - "message" : "auto-save 2026-05-19 00:29 (~4)", - "ts" : "2026-05-19T00:29:35+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "23bf877", + "message": "auto-save 2026-05-19 00:29 (~4)", + "ts": "2026-05-19T00:29:35+08:00", + "type": "commit" }, { - "files_changed" : 2, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 00:29 (~4)", - "ts" : "2026-05-18T16:33:51Z", - "type" : "session-heartbeat" + "files_changed": 2, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 00:29 (~4)", + "ts": "2026-05-18T16:33:51Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "message" : "Claude 会话结束 · 持续 0 秒 · 最近命令:claude · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 00:29 (~4)", - "ts" : "2026-05-18T16:35:00Z", - "type" : "session-end" + "files_changed": 2, + "message": "Claude 会话结束 · 持续 0 秒 · 最近命令:claude · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 00:29 (~4)", + "ts": "2026-05-18T16:35:00Z", + "type": "session-end" }, { - "files_changed" : 2, - "hash" : "50fde2f", - "message" : "auto-save 2026-05-19 00:34 (~2)", - "ts" : "2026-05-19T00:35:00+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "50fde2f", + "message": "auto-save 2026-05-19 00:34 (~2)", + "ts": "2026-05-19T00:35:00+08:00", + "type": "commit" }, { - "files_changed" : 4, - "hash" : "a04284e", - "message" : "auto-save 2026-05-19 00:40 (~4)", - "ts" : "2026-05-19T00:40:25+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "a04284e", + "message": "auto-save 2026-05-19 00:40 (~4)", + "ts": "2026-05-19T00:40:25+08:00", + "type": "commit" }, { - "files_changed" : 5, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 5 项未提交变更 · 最近提交:auto-save 2026-05-19 00:40 (~4)", - "ts" : "2026-05-18T16:43:51Z", - "type" : "session-heartbeat" + "files_changed": 5, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 5 项未提交变更 · 最近提交:auto-save 2026-05-19 00:40 (~4)", + "ts": "2026-05-18T16:43:51Z", + "type": "session-heartbeat" }, { - "files_changed" : 5, - "hash" : "54f47e3", - "message" : "auto-save 2026-05-19 00:45 (~5)", - "ts" : "2026-05-19T00:45:51+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "54f47e3", + "message": "auto-save 2026-05-19 00:45 (~5)", + "ts": "2026-05-19T00:45:51+08:00", + "type": "commit" }, { - "files_changed" : 6, - "hash" : "79b519e", - "message" : "auto-save 2026-05-19 00:51 (~6)", - "ts" : "2026-05-19T00:51:15+08:00", - "type" : "commit" + "files_changed": 6, + "hash": "79b519e", + "message": "auto-save 2026-05-19 00:51 (~6)", + "ts": "2026-05-19T00:51:15+08:00", + "type": "commit" }, { - "files_changed" : 2, - "message" : "Codex 会话结束 · 持续 0 秒 · 最近命令:codex · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 00:51 (~6)", - "ts" : "2026-05-18T16:51:36Z", - "type" : "session-end" + "files_changed": 2, + "message": "Codex 会话结束 · 持续 0 秒 · 最近命令:codex · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 00:51 (~6)", + "ts": "2026-05-18T16:51:36Z", + "type": "session-end" }, { - "files_changed" : 5, - "hash" : "0517892", - "message" : "auto-save 2026-05-19 00:56 (~5)", - "ts" : "2026-05-19T00:56:41+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "0517892", + "message": "auto-save 2026-05-19 00:56 (~5)", + "ts": "2026-05-19T00:56:41+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "167bf61", - "message" : "auto-save 2026-05-19 08:40 (~3)", - "ts" : "2026-05-19T08:40:59+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "167bf61", + "message": "auto-save 2026-05-19 08:40 (~3)", + "ts": "2026-05-19T08:40:59+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "917d0cf", - "message" : "auto-save 2026-05-19 08:46 (~3)", - "ts" : "2026-05-19T08:46:24+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "917d0cf", + "message": "auto-save 2026-05-19 08:46 (~3)", + "ts": "2026-05-19T08:46:24+08:00", + "type": "commit" }, { - "files_changed" : 2, - "message" : "启动 Codex 接力会话 · 已载入 Claude / Codex 最近会话,等待下一条指令 · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 08:46 (~3)", - "ts" : "2026-05-19T00:49:57Z", - "type" : "assistant-session" + "files_changed": 2, + "message": "启动 Codex 接力会话 · 已载入 Claude / Codex 最近会话,等待下一条指令 · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 08:46 (~3)", + "ts": "2026-05-19T00:49:57Z", + "type": "assistant-session" }, { - "files_changed" : 2, - "hash" : "b76bbdf", - "message" : "auto-save 2026-05-19 08:51 (~2)", - "ts" : "2026-05-19T08:51:51+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "b76bbdf", + "message": "auto-save 2026-05-19 08:51 (~2)", + "ts": "2026-05-19T08:51:51+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "91520fd", - "message" : "auto-save 2026-05-19 08:57 (~3)", - "ts" : "2026-05-19T08:57:17+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "91520fd", + "message": "auto-save 2026-05-19 08:57 (~3)", + "ts": "2026-05-19T08:57:17+08:00", + "type": "commit" }, { - "files_changed" : 0, - "hash" : "12e3b97", - "message" : "chore: configure personal model environment", - "ts" : "2026-05-19T08:58:43+08:00", - "type" : "commit" + "files_changed": 0, + "hash": "12e3b97", + "message": "chore: configure personal model environment", + "ts": "2026-05-19T08:58:43+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: configure personal model environment", - "ts" : "2026-05-19T00:59:58Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: configure personal model environment", + "ts": "2026-05-19T00:59:58Z", + "type": "session-heartbeat" }, { - "files_changed" : 7, - "hash" : "ffa6b2e", - "message" : "fix: align model provider configuration", - "ts" : "2026-05-19T09:07:59+08:00", - "type" : "commit" + "files_changed": 7, + "hash": "ffa6b2e", + "message": "fix: align model provider configuration", + "ts": "2026-05-19T09:07:59+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: align model provider configuration", - "ts" : "2026-05-19T01:09:59Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: align model provider configuration", + "ts": "2026-05-19T01:09:59Z", + "type": "session-heartbeat" }, { - "files_changed" : 5, - "hash" : "5d8e2da", - "message" : "auto-save 2026-05-19 09:18 (+3, ~2)", - "ts" : "2026-05-19T09:18:59+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "5d8e2da", + "message": "auto-save 2026-05-19 09:18 (+3, ~2)", + "ts": "2026-05-19T09:18:59+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 09:18 (+3, ~2)", - "ts" : "2026-05-19T01:19:59Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 09:18 (+3, ~2)", + "ts": "2026-05-19T01:19:59Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "be0efc3", - "message" : "auto-save 2026-05-19 09:24 (+1, ~1)", - "ts" : "2026-05-19T09:24:24+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "be0efc3", + "message": "auto-save 2026-05-19 09:24 (+1, ~1)", + "ts": "2026-05-19T09:24:24+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "1224ddf", - "message" : "auto-save 2026-05-19 09:29 (~3)", - "ts" : "2026-05-19T09:29:50+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "1224ddf", + "message": "auto-save 2026-05-19 09:29 (~3)", + "ts": "2026-05-19T09:29:50+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 09:29 (~3)", - "ts" : "2026-05-19T01:29:59Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 09:29 (~3)", + "ts": "2026-05-19T01:29:59Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "781d29c", - "message" : "chore: deploy ai toy patent to vps", - "ts" : "2026-05-19T09:32:28+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "781d29c", + "message": "chore: deploy ai toy patent to vps", + "ts": "2026-05-19T09:32:28+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: deploy ai toy patent to vps", - "ts" : "2026-05-19T01:39:59Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: deploy ai toy patent to vps", + "ts": "2026-05-19T01:39:59Z", + "type": "session-heartbeat" }, { - "files_changed" : 6, - "hash" : "98690b4", - "message" : "auto-save 2026-05-19 09:46 (~6)", - "ts" : "2026-05-19T09:46:08+08:00", - "type" : "commit" + "files_changed": 6, + "hash": "98690b4", + "message": "auto-save 2026-05-19 09:46 (~6)", + "ts": "2026-05-19T09:46:08+08:00", + "type": "commit" }, { - "files_changed" : 10, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 10 项未提交变更 · 最近提交:auto-save 2026-05-19 09:46 (~6)", - "ts" : "2026-05-19T01:49:59Z", - "type" : "session-heartbeat" + "files_changed": 10, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 10 项未提交变更 · 最近提交:auto-save 2026-05-19 09:46 (~6)", + "ts": "2026-05-19T01:49:59Z", + "type": "session-heartbeat" }, { - "files_changed" : 13, - "hash" : "7b4b5f7", - "message" : "auto-save 2026-05-19 09:51 (+2, ~11)", - "ts" : "2026-05-19T09:51:34+08:00", - "type" : "commit" + "files_changed": 13, + "hash": "7b4b5f7", + "message": "auto-save 2026-05-19 09:51 (+2, ~11)", + "ts": "2026-05-19T09:51:34+08:00", + "type": "commit" }, { - "files_changed" : 0, - "hash" : "0b72759", - "message" : "feat: add anchored image pipeline", - "ts" : "2026-05-19T09:59:44+08:00", - "type" : "commit" + "files_changed": 0, + "hash": "0b72759", + "message": "feat: add anchored image pipeline", + "ts": "2026-05-19T09:59:44+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:feat: add anchored image pipeline", - "ts" : "2026-05-19T01:59:59Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:feat: add anchored image pipeline", + "ts": "2026-05-19T01:59:59Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "9a251ee", - "message" : "auto-save 2026-05-19 10:02 (~2)", - "ts" : "2026-05-19T10:02:27+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "9a251ee", + "message": "auto-save 2026-05-19 10:02 (~2)", + "ts": "2026-05-19T10:02:27+08:00", + "type": "commit" }, { - "files_changed" : 0, - "hash" : "5ff7758", - "message" : "docs: record anchored image pipeline", - "ts" : "2026-05-19T10:03:36+08:00", - "type" : "commit" + "files_changed": 0, + "hash": "5ff7758", + "message": "docs: record anchored image pipeline", + "ts": "2026-05-19T10:03:36+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:docs: record anchored image pipeline", - "ts" : "2026-05-19T02:09:59Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:docs: record anchored image pipeline", + "ts": "2026-05-19T02:09:59Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:docs: record anchored image pipeline", - "ts" : "2026-05-19T02:19:59Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:docs: record anchored image pipeline", + "ts": "2026-05-19T02:19:59Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "b317abe", - "message" : "auto-save 2026-05-19 10:24 (~2)", - "ts" : "2026-05-19T10:24:13+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "b317abe", + "message": "auto-save 2026-05-19 10:24 (~2)", + "ts": "2026-05-19T10:24:13+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 10:24 (~2)", - "ts" : "2026-05-19T02:30:00Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 10:24 (~2)", + "ts": "2026-05-19T02:30:00Z", + "type": "session-heartbeat" }, { - "files_changed" : 12, - "hash" : "a3481e7", - "message" : "auto-save 2026-05-19 10:35 (+3, ~8, -1)", - "ts" : "2026-05-19T10:35:04+08:00", - "type" : "commit" + "files_changed": 12, + "hash": "a3481e7", + "message": "auto-save 2026-05-19 10:35 (+3, ~8, -1)", + "ts": "2026-05-19T10:35:04+08:00", + "type": "commit" }, { - "files_changed" : 3, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 3 项未提交变更 · 最近提交:auto-save 2026-05-19 10:35 (+3, ~8, -1)", - "ts" : "2026-05-19T02:40:00Z", - "type" : "session-heartbeat" + "files_changed": 3, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 3 项未提交变更 · 最近提交:auto-save 2026-05-19 10:35 (+3, ~8, -1)", + "ts": "2026-05-19T02:40:00Z", + "type": "session-heartbeat" }, { - "files_changed" : 4, - "hash" : "12159ca", - "message" : "auto-save 2026-05-19 10:40 (+1, ~3)", - "ts" : "2026-05-19T10:40:30+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "12159ca", + "message": "auto-save 2026-05-19 10:40 (+1, ~3)", + "ts": "2026-05-19T10:40:30+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "a9b1250", - "message" : "feat: add upload replicate mode", - "ts" : "2026-05-19T10:43:58+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "a9b1250", + "message": "feat: add upload replicate mode", + "ts": "2026-05-19T10:43:58+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:feat: add upload replicate mode", - "ts" : "2026-05-19T02:50:00Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:feat: add upload replicate mode", + "ts": "2026-05-19T02:50:00Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "d7fd5f2", - "message" : "auto-save 2026-05-19 10:51 (~2)", - "ts" : "2026-05-19T10:51:23+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "d7fd5f2", + "message": "auto-save 2026-05-19 10:51 (~2)", + "ts": "2026-05-19T10:51:23+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "25a8843", - "message" : "fix: update OpenAI image response handling", - "ts" : "2026-05-19T10:56:00+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "25a8843", + "message": "fix: update OpenAI image response handling", + "ts": "2026-05-19T10:56:00+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: update OpenAI image response handling", - "ts" : "2026-05-19T03:00:00Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: update OpenAI image response handling", + "ts": "2026-05-19T03:00:00Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: update OpenAI image response handling", - "ts" : "2026-05-19T03:10:00Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: update OpenAI image response handling", + "ts": "2026-05-19T03:10:00Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "74148d0", - "message" : "auto-save 2026-05-19 11:13 (~2)", - "ts" : "2026-05-19T11:13:07+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "74148d0", + "message": "auto-save 2026-05-19 11:13 (~2)", + "ts": "2026-05-19T11:13:07+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 11:13 (~2)", - "ts" : "2026-05-19T03:20:00Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 11:13 (~2)", + "ts": "2026-05-19T03:20:00Z", + "type": "session-heartbeat" }, { - "files_changed" : 6, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 6 项未提交变更 · 最近提交:auto-save 2026-05-19 11:13 (~2)", - "ts" : "2026-05-19T03:30:00Z", - "type" : "session-heartbeat" + "files_changed": 6, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 6 项未提交变更 · 最近提交:auto-save 2026-05-19 11:13 (~2)", + "ts": "2026-05-19T03:30:00Z", + "type": "session-heartbeat" }, { - "files_changed" : 6, - "hash" : "65a9080", - "message" : "auto-save 2026-05-19 11:29 (~6)", - "ts" : "2026-05-19T11:31:13+08:00", - "type" : "commit" + "files_changed": 6, + "hash": "65a9080", + "message": "auto-save 2026-05-19 11:29 (~6)", + "ts": "2026-05-19T11:31:13+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "1cc1d37", - "message" : "auto-save 2026-05-19 11:37 (~2)", - "ts" : "2026-05-19T11:37:09+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "1cc1d37", + "message": "auto-save 2026-05-19 11:37 (~2)", + "ts": "2026-05-19T11:37:09+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 11:37 (~2)", - "ts" : "2026-05-19T03:40:00Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 11:37 (~2)", + "ts": "2026-05-19T03:40:00Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "hash" : "8e27d3b", - "message" : "fix: handle board uploads and background pack generation", - "ts" : "2026-05-19T11:46:08+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "8e27d3b", + "message": "fix: handle board uploads and background pack generation", + "ts": "2026-05-19T11:46:08+08:00", + "type": "commit" }, { - "files_changed" : 3, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 3 项未提交变更 · 最近提交:fix: handle board uploads and background pack generation", - "ts" : "2026-05-19T03:50:00Z", - "type" : "session-heartbeat" + "files_changed": 3, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 3 项未提交变更 · 最近提交:fix: handle board uploads and background pack generation", + "ts": "2026-05-19T03:50:00Z", + "type": "session-heartbeat" }, { - "files_changed" : 4, - "hash" : "2c2d11b", - "message" : "auto-save 2026-05-19 11:53 (~3)", - "ts" : "2026-05-19T11:53:28+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "2c2d11b", + "message": "auto-save 2026-05-19 11:53 (~3)", + "ts": "2026-05-19T11:53:28+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "e761e72", - "message" : "fix: prevent duplicate pack generation", - "ts" : "2026-05-19T11:53:58+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "e761e72", + "message": "fix: prevent duplicate pack generation", + "ts": "2026-05-19T11:53:58+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "a1063b6", - "message" : "auto-save 2026-05-19 11:58 (~3)", - "ts" : "2026-05-19T11:58:55+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "a1063b6", + "message": "auto-save 2026-05-19 11:58 (~3)", + "ts": "2026-05-19T11:58:55+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 11:58 (~3)", - "ts" : "2026-05-19T04:00:01Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 11:58 (~3)", + "ts": "2026-05-19T04:00:01Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "hash" : "200f908", - "message" : "fix: preserve uploaded brand marks", - "ts" : "2026-05-19T12:00:53+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "200f908", + "message": "fix: preserve uploaded brand marks", + "ts": "2026-05-19T12:00:53+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "1728808", - "message" : "docs: record upload generation safeguards", - "ts" : "2026-05-19T12:08:13+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "1728808", + "message": "docs: record upload generation safeguards", + "ts": "2026-05-19T12:08:13+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "7292bb2", - "message" : "chore: record Muse Mate generation run", - "ts" : "2026-05-19T12:09:24+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "7292bb2", + "message": "chore: record Muse Mate generation run", + "ts": "2026-05-19T12:09:24+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", - "ts" : "2026-05-19T04:10:01Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "ts": "2026-05-19T04:10:01Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", - "ts" : "2026-05-19T04:20:01Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "ts": "2026-05-19T04:20:01Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", - "ts" : "2026-05-19T04:30:01Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "ts": "2026-05-19T04:30:01Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", - "ts" : "2026-05-19T04:40:01Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "ts": "2026-05-19T04:40:01Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", - "ts" : "2026-05-19T04:50:01Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "ts": "2026-05-19T04:50:01Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", - "ts" : "2026-05-19T05:00:01Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "ts": "2026-05-19T05:00:01Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", - "ts" : "2026-05-19T05:10:02Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "ts": "2026-05-19T05:10:02Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", - "ts" : "2026-05-19T05:20:02Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "ts": "2026-05-19T05:20:02Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", - "ts" : "2026-05-19T05:30:02Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "ts": "2026-05-19T05:30:02Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", - "ts" : "2026-05-19T05:40:02Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record Muse Mate generation run", + "ts": "2026-05-19T05:40:02Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "hash" : "f4ce3d4", - "message" : "auto-save 2026-05-19 13:40 (+1, ~2)", - "ts" : "2026-05-19T13:40:25+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "f4ce3d4", + "message": "auto-save 2026-05-19 13:40 (+1, ~2)", + "ts": "2026-05-19T13:40:25+08:00", + "type": "commit" }, { - "files_changed" : 6, - "hash" : "c49e1b3", - "message" : "chore: align local docker environment", - "ts" : "2026-05-19T13:45:51+08:00", - "type" : "commit" + "files_changed": 6, + "hash": "c49e1b3", + "message": "chore: align local docker environment", + "ts": "2026-05-19T13:45:51+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: align local docker environment", - "ts" : "2026-05-19T05:50:02Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: align local docker environment", + "ts": "2026-05-19T05:50:02Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "cdda350", - "message" : "auto-save 2026-05-19 13:56 (+1, ~1)", - "ts" : "2026-05-19T13:56:44+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "cdda350", + "message": "auto-save 2026-05-19 13:56 (+1, ~1)", + "ts": "2026-05-19T13:56:44+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "8ddda6a", - "message" : "feat: add generated image gallery", - "ts" : "2026-05-19T13:58:09+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "8ddda6a", + "message": "feat: add generated image gallery", + "ts": "2026-05-19T13:58:09+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:feat: add generated image gallery", - "ts" : "2026-05-19T06:00:02Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:feat: add generated image gallery", + "ts": "2026-05-19T06:00:02Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "eaed492", - "message" : "auto-save 2026-05-19 14:07 (+1, ~1)", - "ts" : "2026-05-19T14:07:36+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "eaed492", + "message": "auto-save 2026-05-19 14:07 (+1, ~1)", + "ts": "2026-05-19T14:07:36+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 14:07 (+1, ~1)", - "ts" : "2026-05-19T06:10:02Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 14:07 (+1, ~1)", + "ts": "2026-05-19T06:10:02Z", + "type": "session-heartbeat" }, { - "files_changed" : 14, - "hash" : "d327949", - "message" : "auto-save 2026-05-19 14:13 (~14)", - "ts" : "2026-05-19T14:13:02+08:00", - "type" : "commit" + "files_changed": 14, + "hash": "d327949", + "message": "auto-save 2026-05-19 14:13 (~14)", + "ts": "2026-05-19T14:13:02+08:00", + "type": "commit" }, { - "files_changed" : 11, - "hash" : "49db765", - "message" : "auto-save 2026-05-19 14:18 (+1, ~10)", - "ts" : "2026-05-19T14:18:28+08:00", - "type" : "commit" + "files_changed": 11, + "hash": "49db765", + "message": "auto-save 2026-05-19 14:18 (+1, ~10)", + "ts": "2026-05-19T14:18:28+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 14:18 (+1, ~10)", - "ts" : "2026-05-19T06:20:02Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 14:18 (+1, ~10)", + "ts": "2026-05-19T06:20:02Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "6dfcd08", - "message" : "auto-save 2026-05-19 14:29 (~2)", - "ts" : "2026-05-19T14:29:21+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "6dfcd08", + "message": "auto-save 2026-05-19 14:29 (~2)", + "ts": "2026-05-19T14:29:21+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 14:29 (~2)", - "ts" : "2026-05-19T06:30:02Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 14:29 (~2)", + "ts": "2026-05-19T06:30:02Z", + "type": "session-heartbeat" }, { - "files_changed" : 23, - "hash" : "a4fffd4", - "message" : "feat: add audit database and safer image review", - "ts" : "2026-05-19T14:31:16+08:00", - "type" : "commit" + "files_changed": 23, + "hash": "a4fffd4", + "message": "feat: add audit database and safer image review", + "ts": "2026-05-19T14:31:16+08:00", + "type": "commit" }, { - "files_changed" : 23, - "hash" : "9ab7756", - "message" : "feat: add audit database and safer image review", - "ts" : "2026-05-19T14:33:52+08:00", - "type" : "commit" + "files_changed": 23, + "hash": "9ab7756", + "message": "feat: add audit database and safer image review", + "ts": "2026-05-19T14:33:52+08:00", + "type": "commit" }, { - "files_changed" : 2, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 2 项未提交变更 · 最近提交:feat: add audit database and safer image review", - "ts" : "2026-05-19T06:40:03Z", - "type" : "session-heartbeat" + "files_changed": 2, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 2 项未提交变更 · 最近提交:feat: add audit database and safer image review", + "ts": "2026-05-19T06:40:03Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "d6af010", - "message" : "auto-save 2026-05-19 14:40 (~2)", - "ts" : "2026-05-19T14:40:13+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "d6af010", + "message": "auto-save 2026-05-19 14:40 (~2)", + "ts": "2026-05-19T14:40:13+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "254c2c3", - "message" : "fix: polish regeneration controls", - "ts" : "2026-05-19T14:45:02+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "254c2c3", + "message": "fix: polish regeneration controls", + "ts": "2026-05-19T14:45:02+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "aa03bae", - "message" : "fix: polish regeneration controls", - "ts" : "2026-05-19T14:45:29+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "aa03bae", + "message": "fix: polish regeneration controls", + "ts": "2026-05-19T14:45:29+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: polish regeneration controls", - "ts" : "2026-05-19T06:50:03Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: polish regeneration controls", + "ts": "2026-05-19T06:50:03Z", + "type": "session-heartbeat" }, { - "files_changed" : 8, - "hash" : "010cb44", - "message" : "auto-save 2026-05-19 14:56 (+5, ~1)", - "ts" : "2026-05-19T14:56:30+08:00", - "type" : "commit" + "files_changed": 8, + "hash": "010cb44", + "message": "auto-save 2026-05-19 14:56 (+5, ~1)", + "ts": "2026-05-19T14:56:30+08:00", + "type": "commit" }, { - "files_changed" : 8, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 8 项未提交变更 · 最近提交:auto-save 2026-05-19 14:56 (+5, ~1)", - "ts" : "2026-05-19T07:00:03Z", - "type" : "session-heartbeat" + "files_changed": 8, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 8 项未提交变更 · 最近提交:auto-save 2026-05-19 14:56 (+5, ~1)", + "ts": "2026-05-19T07:00:03Z", + "type": "session-heartbeat" }, { - "files_changed" : 9, - "hash" : "e723029", - "message" : "auto-save 2026-05-19 15:01 (+1, ~8, -1)", - "ts" : "2026-05-19T15:01:55+08:00", - "type" : "commit" + "files_changed": 9, + "hash": "e723029", + "message": "auto-save 2026-05-19 15:01 (+1, ~8, -1)", + "ts": "2026-05-19T15:01:55+08:00", + "type": "commit" }, { - "files_changed" : 2, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 15:01 (+1, ~8, -1)", - "ts" : "2026-05-19T07:10:03Z", - "type" : "session-heartbeat" + "files_changed": 2, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-19 15:01 (+1, ~8, -1)", + "ts": "2026-05-19T07:10:03Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "d3e29e7", - "message" : "auto-save 2026-05-19 15:12 (~2)", - "ts" : "2026-05-19T15:12:47+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "d3e29e7", + "message": "auto-save 2026-05-19 15:12 (~2)", + "ts": "2026-05-19T15:12:47+08:00", + "type": "commit" }, { - "files_changed" : 14, - "hash" : "2fdd04c", - "message" : "auto-save 2026-05-19 15:18 (~7)", - "ts" : "2026-05-19T15:18:13+08:00", - "type" : "commit" + "files_changed": 14, + "hash": "2fdd04c", + "message": "auto-save 2026-05-19 15:18 (~7)", + "ts": "2026-05-19T15:18:13+08:00", + "type": "commit" }, { - "files_changed" : 14, - "hash" : "091a195", - "message" : "feat: add protected login workspace", - "ts" : "2026-05-19T15:18:46+08:00", - "type" : "commit" + "files_changed": 14, + "hash": "091a195", + "message": "feat: add protected login workspace", + "ts": "2026-05-19T15:18:46+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:feat: add protected login workspace", - "ts" : "2026-05-19T07:20:03Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:feat: add protected login workspace", + "ts": "2026-05-19T07:20:03Z", + "type": "session-heartbeat" }, { - "files_changed" : 5, - "hash" : "aaba4a4", - "message" : "auto-save 2026-05-19 15:29 (+2, ~3)", - "ts" : "2026-05-19T15:29:06+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "aaba4a4", + "message": "auto-save 2026-05-19 15:29 (+2, ~3)", + "ts": "2026-05-19T15:29:06+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 15:29 (+2, ~3)", - "ts" : "2026-05-19T07:30:03Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 15:29 (+2, ~3)", + "ts": "2026-05-19T07:30:03Z", + "type": "session-heartbeat" }, { - "files_changed" : 4, - "hash" : "2f2ea06", - "message" : "fix: clone source login experience", - "ts" : "2026-05-19T15:37:00+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "2f2ea06", + "message": "fix: clone source login experience", + "ts": "2026-05-19T15:37:00+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: clone source login experience", - "ts" : "2026-05-19T07:40:03Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: clone source login experience", + "ts": "2026-05-19T07:40:03Z", + "type": "session-heartbeat" }, { - "files_changed" : 8, - "hash" : "af459e2", - "message" : "auto-save 2026-05-19 15:45 (~8)", - "ts" : "2026-05-19T15:45:26+08:00", - "type" : "commit" + "files_changed": 8, + "hash": "af459e2", + "message": "auto-save 2026-05-19 15:45 (~8)", + "ts": "2026-05-19T15:45:26+08:00", + "type": "commit" }, { - "files_changed" : 6, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 6 项未提交变更 · 最近提交:auto-save 2026-05-19 15:45 (~8)", - "ts" : "2026-05-19T07:50:03Z", - "type" : "session-heartbeat" + "files_changed": 6, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 6 项未提交变更 · 最近提交:auto-save 2026-05-19 15:45 (~8)", + "ts": "2026-05-19T07:50:03Z", + "type": "session-heartbeat" }, { - "files_changed" : 6, - "hash" : "2f1d7ab", - "message" : "auto-save 2026-05-19 15:50 (~6)", - "ts" : "2026-05-19T15:50:53+08:00", - "type" : "commit" + "files_changed": 6, + "hash": "2f1d7ab", + "message": "auto-save 2026-05-19 15:50 (~6)", + "ts": "2026-05-19T15:50:53+08:00", + "type": "commit" }, { - "files_changed" : 7, - "hash" : "193708a", - "message" : "style: apply oasis glass theme to workspace", - "ts" : "2026-05-19T15:55:18+08:00", - "type" : "commit" + "files_changed": 7, + "hash": "193708a", + "message": "style: apply oasis glass theme to workspace", + "ts": "2026-05-19T15:55:18+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "946f531", - "message" : "fix: lock session intake after creation", - "ts" : "2026-05-19T15:59:14+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "946f531", + "message": "fix: lock session intake after creation", + "ts": "2026-05-19T15:59:14+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: lock session intake after creation", - "ts" : "2026-05-19T08:00:03Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:fix: lock session intake after creation", + "ts": "2026-05-19T08:00:03Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "hash" : "5db8870", - "message" : "fix: lock session intake after creation", - "ts" : "2026-05-19T16:03:51+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "5db8870", + "message": "fix: lock session intake after creation", + "ts": "2026-05-19T16:03:51+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "e244dd9", - "message" : "auto-save 2026-05-19 16:07 (~2)", - "ts" : "2026-05-19T16:07:12+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "e244dd9", + "message": "auto-save 2026-05-19 16:07 (~2)", + "ts": "2026-05-19T16:07:12+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 16:07 (~2)", - "ts" : "2026-05-19T08:10:04Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 16:07 (~2)", + "ts": "2026-05-19T08:10:04Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "hash" : "2c068f2", - "message" : "fix: lock session intake after creation", - "ts" : "2026-05-19T16:15:35+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "2c068f2", + "message": "fix: lock session intake after creation", + "ts": "2026-05-19T16:15:35+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "c232dd0", - "message" : "fix: lock session intake after creation", - "ts" : "2026-05-19T16:17:58+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "c232dd0", + "message": "fix: lock session intake after creation", + "ts": "2026-05-19T16:17:58+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "ac4f007", - "message" : "chore: add gitea remote metadata", - "ts" : "2026-05-19T16:18:10+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "ac4f007", + "message": "chore: add gitea remote metadata", + "ts": "2026-05-19T16:18:10+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: add gitea remote metadata", - "ts" : "2026-05-19T08:20:04Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: add gitea remote metadata", + "ts": "2026-05-19T08:20:04Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 3 项未提交变更 · 最近提交:chore: add gitea remote metadata", - "ts" : "2026-05-19T08:30:04Z", - "type" : "session-heartbeat" + "files_changed": 3, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 3 项未提交变更 · 最近提交:chore: add gitea remote metadata", + "ts": "2026-05-19T08:30:04Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "hash" : "bc0e553", - "message" : "auto-save 2026-05-19 16:29 (~3)", - "ts" : "2026-05-19T16:30:28+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "bc0e553", + "message": "auto-save 2026-05-19 16:29 (~3)", + "ts": "2026-05-19T16:30:28+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "1ec3433", - "message" : "auto-save 2026-05-19 16:38 (~2)", - "ts" : "2026-05-19T16:38:13+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "1ec3433", + "message": "auto-save 2026-05-19 16:38 (~2)", + "ts": "2026-05-19T16:38:13+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 16:38 (~2)", - "ts" : "2026-05-19T08:40:04Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 16:38 (~2)", + "ts": "2026-05-19T08:40:04Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "485982b", - "message" : "perf: replace live oasis background with loop", - "ts" : "2026-05-19T16:47:29+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "485982b", + "message": "perf: replace live oasis background with loop", + "ts": "2026-05-19T16:47:29+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:perf: replace live oasis background with loop", - "ts" : "2026-05-19T08:50:04Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:perf: replace live oasis background with loop", + "ts": "2026-05-19T08:50:04Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:perf: replace live oasis background with loop", - "ts" : "2026-05-19T09:00:04Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:perf: replace live oasis background with loop", + "ts": "2026-05-19T09:00:04Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:perf: replace live oasis background with loop", - "ts" : "2026-05-19T09:10:04Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:perf: replace live oasis background with loop", + "ts": "2026-05-19T09:10:04Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "hash" : "af8d482", - "message" : "chore: add resource index tooling", - "ts" : "2026-05-19T17:15:49+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "af8d482", + "message": "chore: add resource index tooling", + "ts": "2026-05-19T17:15:49+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "401f3c7", - "message" : "chore: record workflow history", - "ts" : "2026-05-19T17:16:20+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "401f3c7", + "message": "chore: record workflow history", + "ts": "2026-05-19T17:16:20+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "ab4625a", - "message" : "chore: update workflow history", - "ts" : "2026-05-19T17:19:00+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "ab4625a", + "message": "chore: update workflow history", + "ts": "2026-05-19T17:19:00+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: update workflow history", - "ts" : "2026-05-19T09:20:05Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: update workflow history", + "ts": "2026-05-19T09:20:05Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: update workflow history", - "ts" : "2026-05-19T09:30:05Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: update workflow history", + "ts": "2026-05-19T09:30:05Z", + "type": "session-heartbeat" }, { - "files_changed" : 4, - "hash" : "27b0424", - "message" : "auto-save 2026-05-19 17:32 (+1, ~3)", - "ts" : "2026-05-19T17:33:20+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "27b0424", + "message": "auto-save 2026-05-19 17:32 (+1, ~3)", + "ts": "2026-05-19T17:33:20+08:00", + "type": "commit" }, { - "files_changed" : 7, - "hash" : "75b1a0a", - "message" : "auto-save 2026-05-19 17:38 (+2, ~5)", - "ts" : "2026-05-19T17:39:02+08:00", - "type" : "commit" + "files_changed": 7, + "hash": "75b1a0a", + "message": "auto-save 2026-05-19 17:38 (+2, ~5)", + "ts": "2026-05-19T17:39:02+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 17:38 (+2, ~5)", - "ts" : "2026-05-19T09:40:05Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 17:38 (+2, ~5)", + "ts": "2026-05-19T09:40:05Z", + "type": "session-heartbeat" }, { - "files_changed" : 7, - "hash" : "7fff776", - "message" : "auto-save 2026-05-19 17:44 (+6, ~1)", - "ts" : "2026-05-19T17:44:29+08:00", - "type" : "commit" + "files_changed": 7, + "hash": "7fff776", + "message": "auto-save 2026-05-19 17:44 (+6, ~1)", + "ts": "2026-05-19T17:44:29+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 17:44 (+6, ~1)", - "ts" : "2026-05-19T09:50:05Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 17:44 (+6, ~1)", + "ts": "2026-05-19T09:50:05Z", + "type": "session-heartbeat" }, { - "files_changed" : 15, - "hash" : "265d7c9", - "message" : "feat: add visual style picker and contextual previews", - "ts" : "2026-05-19T17:51:46+08:00", - "type" : "commit" + "files_changed": 15, + "hash": "265d7c9", + "message": "feat: add visual style picker and contextual previews", + "ts": "2026-05-19T17:51:46+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "6263df5", - "message" : "chore: record style picker workflow", - "ts" : "2026-05-19T17:52:15+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "6263df5", + "message": "chore: record style picker workflow", + "ts": "2026-05-19T17:52:15+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "f0f629a", - "message" : "chore: record style picker deployment", - "ts" : "2026-05-19T17:56:14+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "f0f629a", + "message": "chore: record style picker deployment", + "ts": "2026-05-19T17:56:14+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record style picker deployment", - "ts" : "2026-05-19T10:00:05Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record style picker deployment", + "ts": "2026-05-19T10:00:05Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "hash" : "3b04bb1", - "message" : "auto-save 2026-05-19 18:06 (~3)", - "ts" : "2026-05-19T18:06:14+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "3b04bb1", + "message": "auto-save 2026-05-19 18:06 (~3)", + "ts": "2026-05-19T18:06:14+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 18:06 (~3)", - "ts" : "2026-05-19T10:10:05Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 18:06 (~3)", + "ts": "2026-05-19T10:10:05Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "d068580", - "message" : "fix: move selected session detail to sidebar", - "ts" : "2026-05-19T18:16:39+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "d068580", + "message": "fix: move selected session detail to sidebar", + "ts": "2026-05-19T18:16:39+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "36e5e19", - "message" : "chore: record sidebar detail workflow", - "ts" : "2026-05-19T18:16:55+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "36e5e19", + "message": "chore: record sidebar detail workflow", + "ts": "2026-05-19T18:16:55+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar detail workflow", - "ts" : "2026-05-19T10:20:05Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar detail workflow", + "ts": "2026-05-19T10:20:05Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "hash" : "aa1169c", - "message" : "fix: anchor active session detail to sidebar edge", - "ts" : "2026-05-19T18:25:53+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "aa1169c", + "message": "fix: anchor active session detail to sidebar edge", + "ts": "2026-05-19T18:25:53+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "3be26b8", - "message" : "chore: record sidebar edge detail workflow", - "ts" : "2026-05-19T18:26:02+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "3be26b8", + "message": "chore: record sidebar edge detail workflow", + "ts": "2026-05-19T18:26:02+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", - "ts" : "2026-05-19T10:30:06Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", + "ts": "2026-05-19T10:30:06Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", - "ts" : "2026-05-19T10:40:06Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", + "ts": "2026-05-19T10:40:06Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", - "ts" : "2026-05-19T10:50:06Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", + "ts": "2026-05-19T10:50:06Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", - "ts" : "2026-05-19T11:00:06Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", + "ts": "2026-05-19T11:00:06Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", - "ts" : "2026-05-19T11:10:06Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", + "ts": "2026-05-19T11:10:06Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 3 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", - "ts" : "2026-05-19T11:20:06Z", - "type" : "session-heartbeat" + "files_changed": 3, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 3 项未提交变更 · 最近提交:chore: record sidebar edge detail workflow", + "ts": "2026-05-19T11:20:06Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "b0ff1e1", - "message" : "fix: place current session info in left rail", - "ts" : "2026-05-19T19:20:58+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "b0ff1e1", + "message": "fix: place current session info in left rail", + "ts": "2026-05-19T19:20:58+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "ceed2cc", - "message" : "chore: record current session rail workflow", - "ts" : "2026-05-19T19:21:22+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "ceed2cc", + "message": "chore: record current session rail workflow", + "ts": "2026-05-19T19:21:22+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "ddd3364", - "message" : "auto-save 2026-05-19 19:27 (~3)", - "ts" : "2026-05-19T19:27:40+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "ddd3364", + "message": "auto-save 2026-05-19 19:27 (~3)", + "ts": "2026-05-19T19:27:40+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 19:27 (~3)", - "ts" : "2026-05-19T11:30:06Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 19:27 (~3)", + "ts": "2026-05-19T11:30:06Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "hash" : "41bb5f4", - "message" : "auto-save 2026-05-19 19:33 (~3)", - "ts" : "2026-05-19T19:33:06+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "41bb5f4", + "message": "auto-save 2026-05-19 19:33 (~3)", + "ts": "2026-05-19T19:33:06+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "ce37f85", - "message" : "fix: move selected session detail into sidebar", - "ts" : "2026-05-19T19:35:15+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "ce37f85", + "message": "fix: move selected session detail into sidebar", + "ts": "2026-05-19T19:35:15+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "39adcc5", - "message" : "chore: record sidebar nested detail workflow", - "ts" : "2026-05-19T19:35:15+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "39adcc5", + "message": "chore: record sidebar nested detail workflow", + "ts": "2026-05-19T19:35:15+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar nested detail workflow", - "ts" : "2026-05-19T11:40:06Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar nested detail workflow", + "ts": "2026-05-19T11:40:06Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar nested detail workflow", - "ts" : "2026-05-19T11:50:06Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar nested detail workflow", + "ts": "2026-05-19T11:50:06Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar nested detail workflow", - "ts" : "2026-05-19T12:00:07Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar nested detail workflow", + "ts": "2026-05-19T12:00:07Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar nested detail workflow", - "ts" : "2026-05-19T12:10:07Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar nested detail workflow", + "ts": "2026-05-19T12:10:07Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar nested detail workflow", - "ts" : "2026-05-19T12:20:07Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar nested detail workflow", + "ts": "2026-05-19T12:20:07Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "1264d78", - "message" : "auto-save 2026-05-19 20:21 (~2)", - "ts" : "2026-05-19T20:21:56+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "1264d78", + "message": "auto-save 2026-05-19 20:21 (~2)", + "ts": "2026-05-19T20:21:56+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "20bb8a0", - "message" : "fix: show selected session detail beside sidebar", - "ts" : "2026-05-19T20:26:30+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "20bb8a0", + "message": "fix: show selected session detail beside sidebar", + "ts": "2026-05-19T20:26:30+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "ece4db3", - "message" : "chore: record sidebar side detail workflow", - "ts" : "2026-05-19T20:26:30+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "ece4db3", + "message": "chore: record sidebar side detail workflow", + "ts": "2026-05-19T20:26:30+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar side detail workflow", - "ts" : "2026-05-19T12:30:07Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record sidebar side detail workflow", + "ts": "2026-05-19T12:30:07Z", + "type": "session-heartbeat" }, { - "files_changed" : 3, - "hash" : "08177f1", - "message" : "auto-save 2026-05-19 20:32 (~3)", - "ts" : "2026-05-19T20:32:50+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "08177f1", + "message": "auto-save 2026-05-19 20:32 (~3)", + "ts": "2026-05-19T20:32:50+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "6c3f5ed", - "message" : "fix: preserve result thumbnail aspect ratios", - "ts" : "2026-05-19T20:35:16+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "6c3f5ed", + "message": "fix: preserve result thumbnail aspect ratios", + "ts": "2026-05-19T20:35:16+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "1d7166e", - "message" : "chore: record aspect thumbnail workflow", - "ts" : "2026-05-19T20:35:16+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "1d7166e", + "message": "chore: record aspect thumbnail workflow", + "ts": "2026-05-19T20:35:16+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record aspect thumbnail workflow", - "ts" : "2026-05-19T12:40:07Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record aspect thumbnail workflow", + "ts": "2026-05-19T12:40:07Z", + "type": "session-heartbeat" }, { - "files_changed" : 2, - "hash" : "d56db6e", - "message" : "auto-save 2026-05-19 20:49 (~2)", - "ts" : "2026-05-19T20:49:07+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "d56db6e", + "message": "auto-save 2026-05-19 20:49 (~2)", + "ts": "2026-05-19T20:49:07+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 20:49 (~2)", - "ts" : "2026-05-19T12:50:07Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 20:49 (~2)", + "ts": "2026-05-19T12:50:07Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "hash" : "4c9af4e", - "message" : "fix: shrink result thumbnails", - "ts" : "2026-05-19T20:52:34+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "4c9af4e", + "message": "fix: shrink result thumbnails", + "ts": "2026-05-19T20:52:34+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "34bc275", - "message" : "chore: record small thumbnail workflow", - "ts" : "2026-05-19T20:52:34+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "34bc275", + "message": "chore: record small thumbnail workflow", + "ts": "2026-05-19T20:52:34+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "b7e2047", - "message" : "auto-save 2026-05-19 20:59 (~2)", - "ts" : "2026-05-19T20:59:59+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "b7e2047", + "message": "auto-save 2026-05-19 20:59 (~2)", + "ts": "2026-05-19T20:59:59+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 20:59 (~2)", - "ts" : "2026-05-19T13:00:07Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:auto-save 2026-05-19 20:59 (~2)", + "ts": "2026-05-19T13:00:07Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "hash" : "a13bd05", - "message" : "fix: enlarge result thumbnails", - "ts" : "2026-05-19T21:05:38+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "a13bd05", + "message": "fix: enlarge result thumbnails", + "ts": "2026-05-19T21:05:38+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "7b63ade", - "message" : "chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T21:05:38+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "7b63ade", + "message": "chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T21:05:38+08:00", + "type": "commit" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T13:10:07Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T13:10:07Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T13:20:07Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T13:20:07Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T13:30:08Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T13:30:08Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T13:40:08Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T13:40:08Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T13:50:08Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T13:50:08Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T14:00:08Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T14:00:08Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T15:40:29Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T15:40:29Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T15:50:29Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T15:50:29Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T16:00:29Z", - "type" : "session-heartbeat" + "files_changed": 1, + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T16:00:29Z", + "type": "session-heartbeat" }, { - "files_changed" : 1, - "message" : "Codex 会话结束 · 持续 0 秒 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T16:02:50Z", - "type" : "session-end" + "files_changed": 1, + "message": "Codex 会话结束 · 持续 0 秒 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T16:02:50Z", + "type": "session-end" }, { - "files_changed" : 1, - "message" : "Codex 会话结束 · 持续 0 秒 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", - "ts" : "2026-05-19T16:02:50Z", - "type" : "session-end" + "files_changed": 1, + "message": "Codex 会话结束 · 持续 0 秒 · 最近命令:codex · 分支 master · 1 项未提交变更 · 最近提交:chore: record enlarged thumbnail workflow", + "ts": "2026-05-19T16:02:50Z", + "type": "session-end" }, { - "files_changed" : 5, - "hash" : "e72ba50", - "message" : "auto-save 2026-05-20 00:24 (~5)", - "ts" : "2026-05-20T00:24:31+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "e72ba50", + "message": "auto-save 2026-05-20 00:24 (~5)", + "ts": "2026-05-20T00:24:31+08:00", + "type": "commit" }, { - "files_changed" : 4, - "hash" : "92df778", - "message" : "auto-save 2026-05-20 00:29 (~4)", - "ts" : "2026-05-20T00:29:58+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "92df778", + "message": "auto-save 2026-05-20 00:29 (~4)", + "ts": "2026-05-20T00:29:58+08:00", + "type": "commit" }, { - "files_changed" : 8, - "hash" : "3547987", - "message" : "auto-save 2026-05-20 00:51 (~8)", - "ts" : "2026-05-20T00:51:41+08:00", - "type" : "commit" + "files_changed": 8, + "hash": "3547987", + "message": "auto-save 2026-05-20 00:51 (~8)", + "ts": "2026-05-20T00:51:41+08:00", + "type": "commit" }, { - "files_changed" : 8, - "hash" : "7fcda19", - "message" : "fix: loosen glass dashboard workspace", - "ts" : "2026-05-20T00:52:31+08:00", - "type" : "commit" + "files_changed": 8, + "hash": "7fcda19", + "message": "fix: loosen glass dashboard workspace", + "ts": "2026-05-20T00:52:31+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "ccbfd3e", - "message" : "auto-save 2026-05-20 09:49 (~3)", - "ts" : "2026-05-20T09:49:16+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "ccbfd3e", + "message": "auto-save 2026-05-20 09:49 (~3)", + "ts": "2026-05-20T09:49:16+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "7ad323a", - "message" : "auto-save 2026-05-20 09:54 (~3)", - "ts" : "2026-05-20T09:54:43+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "7ad323a", + "message": "auto-save 2026-05-20 09:54 (~3)", + "ts": "2026-05-20T09:54:43+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "a62f9b1", - "message" : "auto-save 2026-05-20 12:33 (+1, ~1)", - "ts" : "2026-05-20T12:33:03+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "a62f9b1", + "message": "auto-save 2026-05-20 12:33 (+1, ~1)", + "ts": "2026-05-20T12:33:03+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "a25b740", - "message" : "auto-save 2026-05-20 12:38 (~3)", - "ts" : "2026-05-20T12:38:29+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "a25b740", + "message": "auto-save 2026-05-20 12:38 (~3)", + "ts": "2026-05-20T12:38:29+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "a190800", - "message" : "auto-save 2026-05-20 12:49 (~3)", - "ts" : "2026-05-20T12:49:21+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "a190800", + "message": "auto-save 2026-05-20 12:49 (~3)", + "ts": "2026-05-20T12:49:21+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "09664a2", - "message" : "auto-save 2026-05-20 14:07 (-1)", - "ts" : "2026-05-20T14:07:08+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "09664a2", + "message": "auto-save 2026-05-20 14:07 (-1)", + "ts": "2026-05-20T14:07:08+08:00", + "type": "commit" }, { - "files_changed" : 4, - "hash" : "6bd8873", - "message" : "auto-save 2026-05-20 14:12 (+1, ~3)", - "ts" : "2026-05-20T14:12:33+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "6bd8873", + "message": "auto-save 2026-05-20 14:12 (+1, ~3)", + "ts": "2026-05-20T14:12:33+08:00", + "type": "commit" }, { - "files_changed" : 4, - "hash" : "527ccfa", - "message" : "auto-save 2026-05-20 14:45 (~4)", - "ts" : "2026-05-20T14:45:05+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "527ccfa", + "message": "auto-save 2026-05-20 14:45 (~4)", + "ts": "2026-05-20T14:45:05+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "9b1833c", - "message" : "auto-save 2026-05-20 16:33 (~2)", - "ts" : "2026-05-20T16:33:38+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "9b1833c", + "message": "auto-save 2026-05-20 16:33 (~2)", + "ts": "2026-05-20T16:33:38+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "e2465d8", - "message" : "auto-save 2026-05-20 16:39 (~3)", - "ts" : "2026-05-20T16:39:05+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "e2465d8", + "message": "auto-save 2026-05-20 16:39 (~3)", + "ts": "2026-05-20T16:39:05+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "3b04b72", - "message" : "auto-save 2026-05-20 16:44 (~2)", - "ts" : "2026-05-20T16:44:32+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "3b04b72", + "message": "auto-save 2026-05-20 16:44 (~2)", + "ts": "2026-05-20T16:44:32+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "61e597c", - "message" : "fix: improve project brief preview layout", - "ts" : "2026-05-20T16:48:16+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "61e597c", + "message": "fix: improve project brief preview layout", + "ts": "2026-05-20T16:48:16+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "8d4275f", - "message" : "fix: improve project brief preview layout", - "ts" : "2026-05-20T16:48:47+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "8d4275f", + "message": "fix: improve project brief preview layout", + "ts": "2026-05-20T16:48:47+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "36c93cd", - "message" : "auto-save 2026-05-20 17:11 (~2)", - "ts" : "2026-05-20T17:11:41+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "36c93cd", + "message": "auto-save 2026-05-20 17:11 (~2)", + "ts": "2026-05-20T17:11:41+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "288b695", - "message" : "fix: preserve primary image aspect ratio", - "ts" : "2026-05-20T17:13:15+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "288b695", + "message": "fix: preserve primary image aspect ratio", + "ts": "2026-05-20T17:13:15+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "1325a73", - "message" : "auto-save 2026-05-20 17:17 (~2)", - "ts" : "2026-05-20T17:17:06+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "1325a73", + "message": "auto-save 2026-05-20 17:17 (~2)", + "ts": "2026-05-20T17:17:06+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "94bca09", - "message" : "fix: default replicate previews to portrait ratio", - "ts" : "2026-05-20T17:17:42+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "94bca09", + "message": "fix: default replicate previews to portrait ratio", + "ts": "2026-05-20T17:17:42+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "30790d2", - "message" : "auto-save 2026-05-20 17:38 (~2)", - "ts" : "2026-05-20T17:38:50+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "30790d2", + "message": "auto-save 2026-05-20 17:38 (~2)", + "ts": "2026-05-20T17:38:50+08:00", + "type": "commit" }, { - "files_changed" : 4, - "hash" : "6ad847f", - "message" : "auto-save 2026-05-20 17:44 (~4)", - "ts" : "2026-05-20T17:44:16+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "6ad847f", + "message": "auto-save 2026-05-20 17:44 (~4)", + "ts": "2026-05-20T17:44:16+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "ef77adb", - "message" : "auto-save 2026-05-20 17:49 (~2)", - "ts" : "2026-05-20T17:49:41+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "ef77adb", + "message": "auto-save 2026-05-20 17:49 (~2)", + "ts": "2026-05-20T17:49:41+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "9d91086", - "message" : "auto-save 2026-05-20 18:00 (+1, ~1)", - "ts" : "2026-05-20T18:00:32+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "9d91086", + "message": "auto-save 2026-05-20 18:00 (+1, ~1)", + "ts": "2026-05-20T18:00:32+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "9cabc44", - "message" : "auto-save 2026-05-20 18:05 (+1, ~1)", - "ts" : "2026-05-20T18:05:58+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "9cabc44", + "message": "auto-save 2026-05-20 18:05 (+1, ~1)", + "ts": "2026-05-20T18:05:58+08:00", + "type": "commit" }, { - "files_changed" : 5, - "hash" : "b35c386", - "message" : "auto-save 2026-05-20 18:22 (+2, ~3)", - "ts" : "2026-05-20T18:22:16+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "b35c386", + "message": "auto-save 2026-05-20 18:22 (+2, ~3)", + "ts": "2026-05-20T18:22:16+08:00", + "type": "commit" }, { - "files_changed" : 4, - "hash" : "62b322a", - "message" : "auto-save 2026-05-20 18:27 (+3, ~1)", - "ts" : "2026-05-20T18:27:42+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "62b322a", + "message": "auto-save 2026-05-20 18:27 (+3, ~1)", + "ts": "2026-05-20T18:27:42+08:00", + "type": "commit" }, { - "files_changed" : 5, - "hash" : "e2c288f", - "message" : "auto-save 2026-05-20 18:33 (~5)", - "ts" : "2026-05-20T18:33:08+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "e2c288f", + "message": "auto-save 2026-05-20 18:33 (~5)", + "ts": "2026-05-20T18:33:08+08:00", + "type": "commit" }, { - "files_changed" : 4, - "hash" : "f0b85dd", - "message" : "fix: merge pack progress into project brief", - "ts" : "2026-05-20T18:40:30+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "f0b85dd", + "message": "fix: merge pack progress into project brief", + "ts": "2026-05-20T18:40:30+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "f2fe3e9", - "message" : "auto-save 2026-05-20 18:49 (~3)", - "ts" : "2026-05-20T18:49:26+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "f2fe3e9", + "message": "auto-save 2026-05-20 18:49 (~3)", + "ts": "2026-05-20T18:49:26+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "b49d795", - "message" : "auto-save 2026-05-20 19:00 (~3)", - "ts" : "2026-05-20T19:00:17+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "b49d795", + "message": "auto-save 2026-05-20 19:00 (~3)", + "ts": "2026-05-20T19:00:17+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "d3d9349", - "message" : "fix: show pack assets as horizontal detail strip", - "ts" : "2026-05-20T19:00:44+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "d3d9349", + "message": "fix: show pack assets as horizontal detail strip", + "ts": "2026-05-20T19:00:44+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "6ee6e36", - "message" : "auto-save 2026-05-20 19:11 (~2)", - "ts" : "2026-05-20T19:11:08+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "6ee6e36", + "message": "auto-save 2026-05-20 19:11 (~2)", + "ts": "2026-05-20T19:11:08+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "2e3bc50", - "message" : "fix: switch asset tabs as single panel", - "ts" : "2026-05-20T19:22:24+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "2e3bc50", + "message": "fix: switch asset tabs as single panel", + "ts": "2026-05-20T19:22:24+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "a93be9b", - "message" : "auto-save 2026-05-20 19:27 (~3)", - "ts" : "2026-05-20T19:27:49+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "a93be9b", + "message": "auto-save 2026-05-20 19:27 (~3)", + "ts": "2026-05-20T19:27:49+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "5a05058", - "message" : "fix: render asset tabs as ratio-preserving grid", - "ts" : "2026-05-20T19:36:55+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "5a05058", + "message": "fix: render asset tabs as ratio-preserving grid", + "ts": "2026-05-20T19:36:55+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "89c3ed7", - "message" : "auto-save 2026-05-20 19:49 (~2)", - "ts" : "2026-05-20T19:49:32+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "89c3ed7", + "message": "auto-save 2026-05-20 19:49 (~2)", + "ts": "2026-05-20T19:49:32+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "cacb0bd", - "message" : "fix: keep hover previews near pointer", - "ts" : "2026-05-20T19:50:56+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "cacb0bd", + "message": "fix: keep hover previews near pointer", + "ts": "2026-05-20T19:50:56+08:00", + "type": "commit" }, { - "files_changed" : 5, - "hash" : "40c8bc1", - "message" : "auto-save 2026-05-20 20:00 (~5)", - "ts" : "2026-05-20T20:00:24+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "40c8bc1", + "message": "auto-save 2026-05-20 20:00 (~5)", + "ts": "2026-05-20T20:00:24+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "c002c37", - "message" : "auto-save 2026-05-20 20:11 (~2)", - "ts" : "2026-05-20T20:11:16+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "c002c37", + "message": "auto-save 2026-05-20 20:11 (~2)", + "ts": "2026-05-20T20:11:16+08:00", + "type": "commit" }, { - "files_changed" : 4, - "hash" : "3f087ed", - "message" : "fix: sync side gallery with active asset panel", - "ts" : "2026-05-20T20:16:29+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "3f087ed", + "message": "fix: sync side gallery with active asset panel", + "ts": "2026-05-20T20:16:29+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "be4e1ad", - "message" : "auto-save 2026-05-20 20:22 (+1, ~1)", - "ts" : "2026-05-20T20:22:10+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "be4e1ad", + "message": "auto-save 2026-05-20 20:22 (+1, ~1)", + "ts": "2026-05-20T20:22:10+08:00", + "type": "commit" }, { - "files_changed" : 5, - "hash" : "cd1a870", - "message" : "auto-save 2026-05-20 20:27 (~5)", - "ts" : "2026-05-20T20:27:35+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "cd1a870", + "message": "auto-save 2026-05-20 20:27 (~5)", + "ts": "2026-05-20T20:27:35+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "0ebbe2e", - "message" : "auto-save 2026-05-20 20:32 (~2)", - "ts" : "2026-05-20T20:33:02+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "0ebbe2e", + "message": "auto-save 2026-05-20 20:32 (~2)", + "ts": "2026-05-20T20:33:02+08:00", + "type": "commit" }, { - "files_changed" : 5, - "hash" : "0869c74", - "message" : "feat: add active pack image downloads", - "ts" : "2026-05-20T20:42:45+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "0869c74", + "message": "feat: add active pack image downloads", + "ts": "2026-05-20T20:42:45+08:00", + "type": "commit" }, { - "files_changed" : 6, - "hash" : "0f389a0", - "message" : "auto-save 2026-05-20 20:49 (+2, ~4)", - "ts" : "2026-05-20T20:49:19+08:00", - "type" : "commit" + "files_changed": 6, + "hash": "0f389a0", + "message": "auto-save 2026-05-20 20:49 (+2, ~4)", + "ts": "2026-05-20T20:49:19+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "5180db7", - "message" : "auto-save 2026-05-20 20:54 (~3)", - "ts" : "2026-05-20T20:54:46+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "5180db7", + "message": "auto-save 2026-05-20 20:54 (~3)", + "ts": "2026-05-20T20:54:46+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "96afeee", - "message" : "auto-save 2026-05-20 21:05 (~2)", - "ts" : "2026-05-20T21:05:37+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "96afeee", + "message": "auto-save 2026-05-20 21:05 (~2)", + "ts": "2026-05-20T21:05:37+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "c12fe00", - "message" : "auto-save 2026-05-20 21:16 (~2)", - "ts" : "2026-05-20T21:16:29+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "c12fe00", + "message": "auto-save 2026-05-20 21:16 (~2)", + "ts": "2026-05-20T21:16:29+08:00", + "type": "commit" }, { - "files_changed" : 9, - "hash" : "765744d", - "message" : "feat: persist text and video outputs", - "ts" : "2026-05-20T21:20:41+08:00", - "type" : "commit" + "files_changed": 9, + "hash": "765744d", + "message": "feat: persist text and video outputs", + "ts": "2026-05-20T21:20:41+08:00", + "type": "commit" }, { - "files_changed" : 5, - "hash" : "52844b2", - "message" : "auto-save 2026-05-20 21:27 (+1, ~4)", - "ts" : "2026-05-20T21:27:22+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "52844b2", + "message": "auto-save 2026-05-20 21:27 (+1, ~4)", + "ts": "2026-05-20T21:27:22+08:00", + "type": "commit" }, { - "files_changed" : 4, - "hash" : "5d95e91", - "message" : "fix: archive generated videos locally", - "ts" : "2026-05-20T21:29:43+08:00", - "type" : "commit" + "files_changed": 4, + "hash": "5d95e91", + "message": "fix: archive generated videos locally", + "ts": "2026-05-20T21:29:43+08:00", + "type": "commit" }, { - "files_changed" : 1, - "hash" : "7106f3a", - "message" : "fix: make video prompts material adaptive", - "ts" : "2026-05-20T21:38:07+08:00", - "type" : "commit" + "files_changed": 1, + "hash": "7106f3a", + "message": "fix: make video prompts material adaptive", + "ts": "2026-05-20T21:38:07+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "33f87eb", - "message" : "auto-save 2026-05-20 22:43 (~2)", - "ts" : "2026-05-20T22:43:19+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "33f87eb", + "message": "auto-save 2026-05-20 22:43 (~2)", + "ts": "2026-05-20T22:43:19+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "a3d0c97", - "message" : "auto-save 2026-05-20 22:48 (~2)", - "ts" : "2026-05-20T22:48:44+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "a3d0c97", + "message": "auto-save 2026-05-20 22:48 (~2)", + "ts": "2026-05-20T22:48:44+08:00", + "type": "commit" }, { - "files_changed" : 3, - "hash" : "7697754", - "message" : "auto-save 2026-05-20 22:54 (~3)", - "ts" : "2026-05-20T22:54:10+08:00", - "type" : "commit" + "files_changed": 3, + "hash": "7697754", + "message": "auto-save 2026-05-20 22:54 (~3)", + "ts": "2026-05-20T22:54:10+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "e85be86", - "message" : "auto-save 2026-05-20 23:53 (~2)", - "ts" : "2026-05-20T23:55:28+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "e85be86", + "message": "auto-save 2026-05-20 23:53 (~2)", + "ts": "2026-05-20T23:55:28+08:00", + "type": "commit" }, { - "files_changed" : 5, - "hash" : "fa6e32b", - "message" : "auto-save 2026-05-21 02:09 (~5)", - "ts" : "2026-05-21T02:09:03+08:00", - "type" : "commit" + "files_changed": 5, + "hash": "fa6e32b", + "message": "auto-save 2026-05-21 02:09 (~5)", + "ts": "2026-05-21T02:09:03+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "da12ed0", - "message" : "auto-save 2026-05-21 02:19 (~2)", - "ts" : "2026-05-21T02:19:55+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "da12ed0", + "message": "auto-save 2026-05-21 02:19 (~2)", + "ts": "2026-05-21T02:19:55+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "7524b3c", - "message" : "auto-save 2026-05-21 02:25 (~2)", - "ts" : "2026-05-21T02:25:21+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "7524b3c", + "message": "auto-save 2026-05-21 02:25 (~2)", + "ts": "2026-05-21T02:25:21+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "9520d93", - "message" : "auto-save 2026-05-21 02:30 (~2)", - "ts" : "2026-05-21T02:30:46+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "9520d93", + "message": "auto-save 2026-05-21 02:30 (~2)", + "ts": "2026-05-21T02:30:46+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "515ef79", - "message" : "auto-save 2026-05-21 02:36 (~2)", - "ts" : "2026-05-21T02:36:11+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "515ef79", + "message": "auto-save 2026-05-21 02:36 (~2)", + "ts": "2026-05-21T02:36:11+08:00", + "type": "commit" }, { - "files_changed" : 2, - "hash" : "0c1a9ef", - "message" : "auto-save 2026-05-21 08:45 (~2)", - "ts" : "2026-05-21T08:45:25+08:00", - "type" : "commit" + "files_changed": 2, + "hash": "0c1a9ef", + "message": "auto-save 2026-05-21 08:45 (~2)", + "ts": "2026-05-21T08:45:25+08:00", + "type": "commit" }, { - "files_changed" : 2, - "message" : "启动 Codex 接力会话 · 已载入 Claude / Codex 最近会话,等待下一条指令 · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-21 08:45 (~2)", - "ts" : "2026-05-21T13:43:10Z", - "type" : "assistant-session" + "files_changed": 2, + "message": "启动 Codex 接力会话 · 已载入 Claude / Codex 最近会话,等待下一条指令 · 分支 master · 2 项未提交变更 · 最近提交:auto-save 2026-05-21 08:45 (~2)", + "ts": "2026-05-21T13:43:10Z", + "type": "assistant-session" + }, + { + "ts": "2026-05-21T21:48:19+08:00", + "type": "commit", + "message": "auto-save 2026-05-21 21:48 (~2)", + "hash": "aec48a7", + "files_changed": 2 + }, + { + "ts": "2026-05-21T13:53:12Z", + "type": "session-heartbeat", + "message": "Codex 会话活跃 · 最近命令:codex · 分支 master · 9 项未提交变更 · 最近提交:auto-save 2026-05-21 21:48 (~2)", + "files_changed": 9 + }, + { + "ts": "2026-05-21T21:53:46+08:00", + "type": "commit", + "message": "auto-save 2026-05-21 21:53 (~9)", + "hash": "41e22a3", + "files_changed": 9 } ] } diff --git a/src/app/api/img/[bucket]/[filename]/route.ts b/src/app/api/img/[bucket]/[filename]/route.ts index 8ceb50a..418ce17 100644 --- a/src/app/api/img/[bucket]/[filename]/route.ts +++ b/src/app/api/img/[bucket]/[filename]/route.ts @@ -1,5 +1,7 @@ import { NextResponse } from 'next/server'; -import { readImageFile, type ImageBucket } from '@/lib/storage'; +import { createReadStream } from 'node:fs'; +import { Readable } from 'node:stream'; +import { statImageFile, type ImageBucket } from '@/lib/storage'; export const runtime = 'nodejs'; @@ -11,9 +13,14 @@ export async function GET(_req: Request, ctx: { params: Promise<{ bucket: string if (filename.includes('..') || filename.includes('/')) { return NextResponse.json({ error: 'bad filename' }, { status: 400 }); } - const r = await readImageFile(bucket as ImageBucket, filename); + const r = await statImageFile(bucket as ImageBucket, filename); if (!r) return NextResponse.json({ error: 'not found' }, { status: 404 }); - return new NextResponse(new Uint8Array(r.buf), { - headers: { 'Content-Type': r.type, 'Cache-Control': 'public, max-age=31536000, immutable' }, + const stream = Readable.toWeb(createReadStream(r.filePath)); + return new Response(stream as ReadableStream, { + headers: { + 'Content-Type': r.type, + 'Content-Length': String(r.size), + 'Cache-Control': 'public, max-age=31536000, immutable', + }, }); } diff --git a/src/app/api/video-file/[filename]/route.ts b/src/app/api/video-file/[filename]/route.ts index c51d36d..a45cc15 100644 --- a/src/app/api/video-file/[filename]/route.ts +++ b/src/app/api/video-file/[filename]/route.ts @@ -1,20 +1,72 @@ import { NextResponse } from 'next/server'; -import { readVideoFile } from '@/lib/storage'; +import { createReadStream } from 'node:fs'; +import { Readable } from 'node:stream'; +import { statVideoFile } from '@/lib/storage'; export const runtime = 'nodejs'; export const dynamic = 'force-dynamic'; -export async function GET(_req: Request, ctx: { params: Promise<{ filename: string }> }) { +function parseRange(range: string | null, size: number): { start: number; end: number } | null { + if (!range) return null; + const match = range.match(/^bytes=(\d*)-(\d*)$/); + if (!match) return null; + + const [, rawStart, rawEnd] = match; + if (!rawStart && !rawEnd) return null; + + if (!rawStart) { + const suffixLength = Number(rawEnd); + if (!Number.isFinite(suffixLength) || suffixLength <= 0) return null; + return { start: Math.max(size - suffixLength, 0), end: size - 1 }; + } + + const start = Number(rawStart); + const end = rawEnd ? Number(rawEnd) : size - 1; + if (!Number.isFinite(start) || !Number.isFinite(end) || start < 0 || end < start || start >= size) { + return null; + } + return { start, end: Math.min(end, size - 1) }; +} + +export async function GET(req: Request, ctx: { params: Promise<{ filename: string }> }) { const { filename } = await ctx.params; - const video = await readVideoFile(filename); + const video = await statVideoFile(filename); if (!video) return NextResponse.json({ error: 'video not found' }, { status: 404 }); - return new Response(new Uint8Array(video.buf), { + const baseHeaders = { + 'Content-Type': video.type, + 'Cache-Control': 'private, max-age=3600', + 'Accept-Ranges': 'bytes', + }; + const requestedRange = req.headers.get('range'); + if (requestedRange) { + const range = parseRange(requestedRange, video.size); + if (!range) { + return new Response(null, { + status: 416, + headers: { + ...baseHeaders, + 'Content-Range': `bytes */${video.size}`, + }, + }); + } + const length = range.end - range.start + 1; + const stream = Readable.toWeb(createReadStream(video.filePath, { start: range.start, end: range.end })); + return new Response(stream as ReadableStream, { + status: 206, + headers: { + ...baseHeaders, + 'Content-Length': String(length), + 'Content-Range': `bytes ${range.start}-${range.end}/${video.size}`, + }, + }); + } + + const stream = Readable.toWeb(createReadStream(video.filePath)); + return new Response(stream as ReadableStream, { headers: { - 'Content-Type': video.type, - 'Content-Length': String(video.buf.length), - 'Cache-Control': 'private, max-age=3600', - 'Accept-Ranges': 'bytes', + ...baseHeaders, + 'Content-Length': String(video.size), }, }); } diff --git a/src/app/page.tsx b/src/app/page.tsx index f89e190..e7e8419 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -132,7 +132,7 @@ function ReferenceStrip({ session }: { session: GenSession }) {
{refs.slice(0, 6).map((ref, index) => (
- {ref.label} + {ref.label} {ref.label}
))} @@ -285,11 +285,12 @@ function ProjectBrief({ onBlur={() => setPreviewOpen(false)} >
- 当前主方案 { + 当前主方案 { const image = event.currentTarget; if (image.naturalWidth && image.naturalHeight) { setPrimaryAspectRatio(`${image.naturalWidth} / ${image.naturalHeight}`); @@ -303,7 +304,7 @@ function ProjectBrief({
{previewOpen && typeof document !== 'undefined' && createPortal( , document.body, )} diff --git a/src/components/HoverImagePreview.tsx b/src/components/HoverImagePreview.tsx index 5b34a8c..0b79453 100644 --- a/src/components/HoverImagePreview.tsx +++ b/src/components/HoverImagePreview.tsx @@ -65,12 +65,14 @@ export function HoverImagePreview({ imageClassName, aspectRatio, onImageLoad, + loading = 'lazy', }: { src: string; alt: string; imageClassName?: string; aspectRatio?: string; onImageLoad?: (image: HTMLImageElement) => void; + loading?: 'eager' | 'lazy'; }) { const [preview, setPreview] = useState(null); const [mounted, setMounted] = useState(false); @@ -85,6 +87,8 @@ export function HoverImagePreview({ src={src} alt={alt} className={imageClassName} + loading={loading} + decoding="async" onPointerMove={event => { if (event.pointerType === 'touch') return; setPreview(nextPreviewState(event, aspectRatio)); @@ -101,6 +105,7 @@ export function HoverImagePreview({ src={src} alt="" className="h-full w-full object-contain" + decoding="async" />
, document.body diff --git a/src/components/PackPanel.tsx b/src/components/PackPanel.tsx index 566a8c5..35bfa85 100644 --- a/src/components/PackPanel.tsx +++ b/src/components/PackPanel.tsx @@ -145,7 +145,7 @@ function AssetDetailDrawer({ detail, onClose }: {
{ready ? ( - {template.title} + {template.title} ) : (
待生成
)} diff --git a/src/components/ProjectGalleryDrawer.tsx b/src/components/ProjectGalleryDrawer.tsx index f4d812b..539398c 100644 --- a/src/components/ProjectGalleryDrawer.tsx +++ b/src/components/ProjectGalleryDrawer.tsx @@ -174,7 +174,7 @@ export default function ProjectGalleryDrawer({ session, activeNav, onAction }: P {image.mediaType === 'video' ? (
@@ -208,7 +208,7 @@ export default function ProjectGalleryDrawer({ session, activeNav, onAction }: P {preview.mediaType === 'video' ? (
) : null; @@ -268,7 +268,7 @@ export default function ProjectGalleryDrawer({ session, activeNav, onAction }: P {image.mediaType === 'video' ? (