refactor: remove plugin session file resolver

This commit is contained in:
Peter Steinberger
2026-05-08 14:04:56 +01:00
parent b70e48bb63
commit ec4733ec41
13 changed files with 9 additions and 52 deletions

View File

@@ -203,6 +203,9 @@ The remaining cleanup is mostly consolidation and deletion:
`agents/<agentId>/sessions/*.jsonl` paths. The old path builders remain for
doctor imports, explicit debug/export artifacts, and path-compatibility
tests.
- Plugin runtime no longer exposes `api.runtime.agent.session.resolveSessionFilePath`;
plugin code either uses the SQLite row helpers or creates a
`sqlite-transcript://...` locator through `session-store-runtime`.
- Active-memory blocking subagent runs now pass virtual SQLite transcript
locators to embedded agents instead of creating temporary or persisted
`session.jsonl` files under plugin state. The old `transcriptDir` option is

View File

@@ -159,7 +159,6 @@ function createSessionRuntimeMock(sessionStore: Record<string, unknown>) {
upsertSessionEntry: vi.fn(({ sessionKey, entry }: { sessionKey: string; entry: unknown }) => {
sessionStore[sessionKey] = entry;
}),
resolveSessionFilePath: vi.fn(() => "/tmp/session.json"),
};
}

View File

@@ -716,10 +716,6 @@ describe("skill-workshop", () => {
agent: {
defaults: { provider: "openai", model: "gpt-5.4" },
resolveAgentDir: () => path.join(workspaceDir, ".agent"),
session: {
resolveSessionFilePath: (sessionId: string) =>
path.join(stateDir, "agents", "main", "sessions", `${sessionId}.jsonl`),
},
runEmbeddedPiAgent,
},
state: {
@@ -754,7 +750,7 @@ describe("skill-workshop", () => {
expect.objectContaining({
disableTools: true,
toolsAllow: [],
sessionFile: expect.stringContaining(path.join("agents", "main", "sessions")),
sessionFile: expect.stringMatching(/^sqlite-transcript:\/\/main\/skill-workshop-review-/u),
provider: "openai",
model: "gpt-5.4",
}),
@@ -780,10 +776,6 @@ describe("skill-workshop", () => {
agent: {
defaults: { provider: "openai", model: "gpt-5.4" },
resolveAgentDir: () => path.join(workspaceDir, ".agent"),
session: {
resolveSessionFilePath: (sessionId: string) =>
path.join(stateDir, "agents", "main", "sessions", `${sessionId}.jsonl`),
},
runEmbeddedPiAgent,
},
state: {
@@ -854,10 +846,6 @@ describe("skill-workshop", () => {
agent: {
defaults: { provider: "openai", model: "gpt-5.4" },
resolveAgentDir: () => path.join(workspaceDir, ".agent"),
session: {
resolveSessionFilePath: (sessionId: string) =>
path.join(stateDir, "agents", "main", "sessions", `${sessionId}.jsonl`),
},
runEmbeddedPiAgent,
},
state: {
@@ -917,10 +905,6 @@ describe("skill-workshop", () => {
defaults: { provider: "openai", model: "gpt-5.4" },
resolveAgentWorkspaceDir: () => workspaceDir,
resolveAgentDir: () => path.join(workspaceDir, ".agent"),
session: {
resolveSessionFilePath: (sessionId: string) =>
path.join(stateDir, "agents", "main", "sessions", `${sessionId}.jsonl`),
},
runEmbeddedPiAgent,
},
state: {

View File

@@ -32,12 +32,6 @@ function createAgentRuntime(payloads: Array<Record<string, unknown>>) {
const resolveAgentIdentity = vi.fn((_cfg: CoreConfig, agentId: string) => ({
name: `${agentId} tester`,
}));
const resolveSessionFilePath = vi.fn(
(_sessionId: string, _entry: unknown, params: { agentId?: string }) => {
return `/tmp/openclaw/${params.agentId ?? "main"}/sessions/session.jsonl`;
},
);
const runtime = {
defaults: {
provider: "together",
@@ -56,7 +50,6 @@ function createAgentRuntime(payloads: Array<Record<string, unknown>>) {
Object.entries(sessionStore).map(([sessionKey, entry]) => ({ sessionKey, entry })),
upsertSessionEntry,
patchSessionEntry: async () => null,
resolveSessionFilePath,
},
} as unknown as CoreAgentDeps;
@@ -69,7 +62,6 @@ function createAgentRuntime(payloads: Array<Record<string, unknown>>) {
resolveAgentDir,
resolveAgentWorkspaceDir,
resolveAgentIdentity,
resolveSessionFilePath,
};
}

View File

@@ -170,7 +170,6 @@ function createSessionRuntimeMock(sessionStore: Record<string, unknown>) {
upsertSessionEntry: vi.fn(({ sessionKey, entry }: { sessionKey: string; entry: unknown }) => {
sessionStore[sessionKey] = entry;
}),
resolveSessionFilePath: vi.fn(() => "/tmp/session.json"),
};
}

View File

@@ -41,7 +41,6 @@ vi.mock("../../agents/skills/refresh.js", () => ({
vi.mock("../../config/sessions.js", () => ({
upsertSessionEntry: vi.fn(),
resolveSessionFilePath: vi.fn(),
}));
vi.mock("../../infra/skills-remote.js", () => ({

View File

@@ -45,14 +45,10 @@ describe("session path safety", () => {
expect(resolved).toBe(path.resolve(sessionsDir, "sess-1-topic-topic%2Fa%2Bb.jsonl"));
});
it("ignores legacy sessionFile paths even when a sessions dir is provided", () => {
const sessionsDir = "/tmp/openclaw/agents/main/sessions";
const resolved = resolveSessionFilePath(
"sess-1",
{ sessionFile: "/tmp/openclaw/agents/work/not-sessions/abc-123.jsonl" },
{ sessionsDir },
);
it("ignores legacy sessionFile paths", () => {
const resolved = resolveSessionFilePath("sess-1", {
sessionFile: "/tmp/openclaw/agents/work/not-sessions/abc-123.jsonl",
});
expect(resolved).toBe(createSqliteSessionTranscriptLocator({ sessionId: "sess-1" }));
});

View File

@@ -1,11 +1,7 @@
// Narrow SQLite session row helpers for channel hot paths.
export { resolveSessionRowEntry } from "../config/sessions/store-entry.js";
export {
createSqliteSessionTranscriptLocator,
resolveSessionTranscriptPath,
resolveSessionTranscriptPathInDir,
} from "../config/sessions/paths.js";
export { createSqliteSessionTranscriptLocator } from "../config/sessions/paths.js";
export { resolveAndPersistSessionFile } from "../config/sessions/session-file.js";
export { resolveSessionKey } from "../config/sessions/session-key.js";
export { resolveGroupSessionKey } from "../config/sessions/group.js";

View File

@@ -356,9 +356,6 @@ export function createPluginRuntimeMock(overrides: DeepPartial<PluginRuntime> =
upsertSessionEntry: vi.fn(
() => undefined,
) as unknown as PluginRuntime["agent"]["session"]["upsertSessionEntry"],
resolveSessionFilePath: vi.fn(
(sessionId: string) => `/tmp/${sessionId}.json`,
) as unknown as PluginRuntime["agent"]["session"]["resolveSessionFilePath"],
},
},
system: {

View File

@@ -312,7 +312,6 @@ describe("plugin runtime command execution", () => {
"listSessionEntries",
"patchSessionEntry",
"upsertSessionEntry",
"resolveSessionFilePath",
]);
},
},

View File

@@ -9,7 +9,6 @@ import { resolveAgentTimeoutMs } from "../../agents/timeout.js";
import { ensureAgentWorkspace } from "../../agents/workspace.js";
import { normalizeThinkLevel, resolveThinkingProfile } from "../../auto-reply/thinking.js";
import { getRuntimeConfig } from "../../config/config.js";
import { resolveSessionFilePath } from "../../config/sessions/paths.js";
import {
getSessionEntry,
listSessionEntries,
@@ -74,7 +73,6 @@ export function createRuntimeAgent(): PluginRuntime["agent"] {
listSessionEntries,
patchSessionEntry,
upsertSessionEntry,
resolveSessionFilePath,
}));
return agentRuntime as PluginRuntime["agent"];

View File

@@ -206,7 +206,6 @@ export type PluginRuntimeCore = {
listSessionEntries: typeof import("../../config/sessions/store.js").listSessionEntries;
patchSessionEntry: typeof import("../../config/sessions/store.js").patchSessionEntry;
upsertSessionEntry: typeof import("../../config/sessions/store.js").upsertSessionEntry;
resolveSessionFilePath: typeof import("../../config/sessions/paths.js").resolveSessionFilePath;
};
};
system: {

View File

@@ -79,10 +79,6 @@ function createAgentRuntime(payloads: unknown[] = [{ text: "Speak this." }]) {
listSessionEntries,
patchSessionEntry,
upsertSessionEntry,
resolveSessionFilePath: vi.fn(
(_sessionId: string, entry?: { sessionFile?: string }) =>
entry?.sessionFile ?? "/tmp/session.json",
),
},
runEmbeddedPiAgent,
},