refactor: mark legacy transcript dirs explicitly

This commit is contained in:
Peter Steinberger
2026-05-08 17:57:21 +01:00
parent 6791e7d6aa
commit 984b9aa77f
3 changed files with 33 additions and 13 deletions

View File

@@ -4,7 +4,7 @@ import path from "node:path";
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
import { HEARTBEAT_TRANSCRIPT_PROMPT } from "../auto-reply/heartbeat.js";
import type { OpenClawConfig } from "../config/config.js";
import { resolveSessionTranscriptsDirForAgent } from "../config/sessions/paths.js";
import { resolveLegacySessionTranscriptsDirForAgent } from "../config/sessions/paths.js";
import {
deleteSessionEntry,
listSessionEntries,
@@ -69,7 +69,7 @@ function restoreEnv(snapshot: EnvSnapshot) {
function setupSessionState(env: NodeJS.ProcessEnv, homeDir: string) {
const agentId = "main";
const sessionsDir = resolveSessionTranscriptsDirForAgent(agentId, env, () => homeDir);
const sessionsDir = resolveLegacySessionTranscriptsDirForAgent(agentId, env, () => homeDir);
fs.mkdirSync(sessionsDir, { recursive: true });
}
@@ -163,7 +163,11 @@ async function runOrphanTranscriptCheckWithQmdSessions(enabled: boolean, homeDir
},
};
setupSessionState(process.env, homeDir);
const sessionsDir = resolveSessionTranscriptsDirForAgent("main", process.env, () => homeDir);
const sessionsDir = resolveLegacySessionTranscriptsDirForAgent(
"main",
process.env,
() => homeDir,
);
fs.writeFileSync(path.join(sessionsDir, "orphan-session.jsonl"), '{"type":"session"}\n');
const confirmRuntimeRepair = vi.fn(async () => false);
await noteStateIntegrity(cfg, { confirmRuntimeRepair, note: noteMock });
@@ -448,7 +452,11 @@ describe("doctor state integrity oauth dir checks", () => {
it("detects orphan transcripts and offers delete remediation", async () => {
const cfg: OpenClawConfig = {};
setupSessionState(process.env, process.env.HOME ?? "");
const sessionsDir = resolveSessionTranscriptsDirForAgent("main", process.env, () => tempHome);
const sessionsDir = resolveLegacySessionTranscriptsDirForAgent(
"main",
process.env,
() => tempHome,
);
fs.writeFileSync(path.join(sessionsDir, "orphan-session.jsonl"), '{"type":"session"}\n');
const confirmRuntimeRepair = vi.fn(async (params: { message: string }) =>
params.message.includes("Delete 1 orphan transcript file"),
@@ -469,7 +477,11 @@ describe("doctor state integrity oauth dir checks", () => {
it("does not auto-delete orphan transcripts from non-interactive repair mode", async () => {
const cfg: OpenClawConfig = {};
setupSessionState(process.env, process.env.HOME ?? "");
const sessionsDir = resolveSessionTranscriptsDirForAgent("main", process.env, () => tempHome);
const sessionsDir = resolveLegacySessionTranscriptsDirForAgent(
"main",
process.env,
() => tempHome,
);
fs.writeFileSync(path.join(sessionsDir, "orphan-session.jsonl"), '{"type":"session"}\n');
const confirmRuntimeRepair = vi.fn(
async (params: { initialValue?: boolean; requiresInteractiveConfirmation?: boolean }) =>
@@ -501,7 +513,7 @@ describe("doctor state integrity oauth dir checks", () => {
process.env.OPENCLAW_STATE_DIR = path.join(symlinkHome, ".openclaw");
setupSessionState(process.env, symlinkHome);
const sessionsDir = resolveSessionTranscriptsDirForAgent(
const sessionsDir = resolveLegacySessionTranscriptsDirForAgent(
"main",
process.env,
() => symlinkHome,
@@ -568,7 +580,11 @@ describe("doctor state integrity oauth dir checks", () => {
it("moves a heartbeat-poisoned main session and clears stale TUI restore pointers", async () => {
const cfg: OpenClawConfig = {};
setupSessionState(process.env, tempHome);
const sessionsDir = resolveSessionTranscriptsDirForAgent("main", process.env, () => tempHome);
const sessionsDir = resolveLegacySessionTranscriptsDirForAgent(
"main",
process.env,
() => tempHome,
);
const heartbeatTranscriptPath = path.join(sessionsDir, "heartbeat-session.jsonl");
replaceSqliteSessionTranscriptEvents({
agentId: "main",
@@ -622,7 +638,11 @@ describe("doctor state integrity oauth dir checks", () => {
it("does not move a mixed main transcript that has real user activity", async () => {
const cfg: OpenClawConfig = {};
setupSessionState(process.env, tempHome);
const sessionsDir = resolveSessionTranscriptsDirForAgent("main", process.env, () => tempHome);
const sessionsDir = resolveLegacySessionTranscriptsDirForAgent(
"main",
process.env,
() => tempHome,
);
const mixedTranscriptPath = path.join(sessionsDir, "mixed-session.jsonl");
replaceSqliteSessionTranscriptEvents({
agentId: "main",

View File

@@ -12,8 +12,8 @@ import { resolveOAuthDir, resolveStateDir } from "../config/paths.js";
import { isPrimarySessionTranscriptFileName } from "../config/sessions/artifacts.js";
import { resolveMainSessionKey } from "../config/sessions/main-session.js";
import {
resolveLegacySessionTranscriptsDirForAgent,
resolveSessionTranscriptLocator,
resolveSessionTranscriptsDirForAgent,
} from "../config/sessions/paths.js";
import { listSessionEntries, upsertSessionEntry } from "../config/sessions/store.js";
import {
@@ -657,7 +657,7 @@ export async function noteStateIntegrity(
const defaultStateDir = path.join(homedir(), ".openclaw");
const oauthDir = resolveOAuthDir(env, stateDir);
const agentId = resolveDefaultAgentId(cfg);
const sessionsDir = resolveSessionTranscriptsDirForAgent(agentId, env, homedir);
const sessionsDir = resolveLegacySessionTranscriptsDirForAgent(agentId, env, homedir);
const displayStateDir = shortenHomePath(stateDir);
const displayOauthDir = shortenHomePath(oauthDir);
const displaySessionsDir = shortenHomePath(sessionsDir);

View File

@@ -5,7 +5,7 @@ import { DEFAULT_AGENT_ID, normalizeAgentId } from "../../routing/session-key.js
import { resolveStateDir } from "../paths.js";
import { isCompactionCheckpointTranscriptFileName } from "./artifacts.js";
function resolveAgentSessionsDir(
function resolveLegacyAgentSessionsDir(
agentId?: string,
env: NodeJS.ProcessEnv = process.env,
homedir: () => string = () => resolveRequiredHomeDir(env, os.homedir),
@@ -15,12 +15,12 @@ function resolveAgentSessionsDir(
return path.join(root, "agents", id, "sessions");
}
export function resolveSessionTranscriptsDirForAgent(
export function resolveLegacySessionTranscriptsDirForAgent(
agentId?: string,
env: NodeJS.ProcessEnv = process.env,
homedir: () => string = () => resolveRequiredHomeDir(env, os.homedir),
): string {
return resolveAgentSessionsDir(agentId, env, homedir);
return resolveLegacyAgentSessionsDir(agentId, env, homedir);
}
export type SessionTranscriptLocatorOptions = {