fix: sync all codex sessions

This commit is contained in:
mac
2026-07-15 18:45:40 +08:00
parent b29670250f
commit 49892454f6
7 changed files with 362 additions and 67 deletions
+29 -21
View File
@@ -181,42 +181,50 @@ function toMarkdown(item, conv) {
return lines.join("\n");
}
// 备份:把整个 sessions/ 与索引复制到目标目录下的 codex-sessions-backup/
// 备份:把 sessions/、archived_sessions/ 与索引复制到目标目录下的 codex-sessions-backup/
function backupAll(destDir, log = () => {}) {
const out = path.join(destDir, "codex-sessions-backup");
fs.mkdirSync(out, { recursive: true });
const files = findRolloutFiles(SESSIONS_DIR);
let n = 0;
for (const f of files) {
const rel = path.relative(SESSIONS_DIR, f);
const dst = path.join(out, "sessions", rel);
fs.mkdirSync(path.dirname(dst), { recursive: true });
fs.copyFileSync(f, dst);
n++;
for (const [name, dir] of [["sessions", SESSIONS_DIR], ["archived_sessions", ARCHIVED_SESSIONS_DIR]]) {
const files = findRolloutFiles(dir);
for (const f of files) {
const rel = path.relative(dir, f);
const dst = path.join(out, name, rel);
fs.mkdirSync(path.dirname(dst), { recursive: true });
fs.copyFileSync(f, dst);
n++;
}
}
if (fs.existsSync(SESSION_INDEX)) fs.copyFileSync(SESSION_INDEX, path.join(out, "session_index.jsonl"));
log(`已备份 ${n} 个会话文件到 ${out}`);
return { path: out, count: n };
}
// 导入:把外部备份目录里的 rollout-*.jsonl 合并进本机 sessions/(按原年月日结构,已存在则跳过)
// 导入:把外部备份目录里的 rollout-*.jsonl 合并进本机 sessions/ 与 archived_sessions/(已存在则跳过)
function importSessions(srcDir, log = () => {}) {
// 支持传入 backup 根目录或其中的 sessions/ 子目录
let base = srcDir;
if (fs.existsSync(path.join(srcDir, "sessions"))) base = path.join(srcDir, "sessions");
const files = findRolloutFiles(base);
let added = 0;
let skipped = 0;
for (const f of files) {
const rel = path.relative(base, f);
const dst = path.join(SESSIONS_DIR, rel);
if (fs.existsSync(dst)) {
skipped++;
continue;
const roots = fs.existsSync(path.join(srcDir, "sessions"))
? [
{ base: path.join(srcDir, "sessions"), dest: SESSIONS_DIR },
{ base: path.join(srcDir, "archived_sessions"), dest: ARCHIVED_SESSIONS_DIR },
]
: [{ base: srcDir, dest: SESSIONS_DIR }];
for (const root of roots) {
const files = findRolloutFiles(root.base);
for (const f of files) {
const rel = path.relative(root.base, f);
const dst = path.join(root.dest, rel);
if (fs.existsSync(dst)) {
skipped++;
continue;
}
fs.mkdirSync(path.dirname(dst), { recursive: true });
fs.copyFileSync(f, dst);
added++;
}
fs.mkdirSync(path.dirname(dst), { recursive: true });
fs.copyFileSync(f, dst);
added++;
}
log(`导入完成:新增 ${added} 个,跳过 ${skipped} 个(已存在)`);
return { added, skipped };