From ec4733ec412653f33b6ef75ae9877e616edfa0fe Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 8 May 2026 14:04:56 +0100 Subject: [PATCH] refactor: remove plugin session file resolver --- docs/refactor/database-first.md | 3 +++ extensions/google-meet/index.test.ts | 1 - extensions/skill-workshop/index.test.ts | 18 +----------------- .../voice-call/src/response-generator.test.ts | 8 -------- extensions/voice-call/src/runtime.test.ts | 1 - src/auto-reply/reply/session-updates.test.ts | 1 - src/config/sessions/sessions.test.ts | 12 ++++-------- src/plugin-sdk/session-store-runtime.ts | 6 +----- .../test-helpers/plugin-runtime-mock.ts | 3 --- src/plugins/runtime/index.test.ts | 1 - src/plugins/runtime/runtime-agent.ts | 2 -- src/plugins/runtime/types-core.ts | 1 - src/talk/agent-consult-runtime.test.ts | 4 ---- 13 files changed, 9 insertions(+), 52 deletions(-) diff --git a/docs/refactor/database-first.md b/docs/refactor/database-first.md index 1c527ae42a3..bfec259afa9 100644 --- a/docs/refactor/database-first.md +++ b/docs/refactor/database-first.md @@ -203,6 +203,9 @@ The remaining cleanup is mostly consolidation and deletion: `agents//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 diff --git a/extensions/google-meet/index.test.ts b/extensions/google-meet/index.test.ts index cc8bc269477..311c30fab39 100644 --- a/extensions/google-meet/index.test.ts +++ b/extensions/google-meet/index.test.ts @@ -159,7 +159,6 @@ function createSessionRuntimeMock(sessionStore: Record) { upsertSessionEntry: vi.fn(({ sessionKey, entry }: { sessionKey: string; entry: unknown }) => { sessionStore[sessionKey] = entry; }), - resolveSessionFilePath: vi.fn(() => "/tmp/session.json"), }; } diff --git a/extensions/skill-workshop/index.test.ts b/extensions/skill-workshop/index.test.ts index 918b052b4cc..685d5488fd9 100644 --- a/extensions/skill-workshop/index.test.ts +++ b/extensions/skill-workshop/index.test.ts @@ -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: { diff --git a/extensions/voice-call/src/response-generator.test.ts b/extensions/voice-call/src/response-generator.test.ts index d491e77264d..fea16eeea63 100644 --- a/extensions/voice-call/src/response-generator.test.ts +++ b/extensions/voice-call/src/response-generator.test.ts @@ -32,12 +32,6 @@ function createAgentRuntime(payloads: Array>) { 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>) { 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>) { resolveAgentDir, resolveAgentWorkspaceDir, resolveAgentIdentity, - resolveSessionFilePath, }; } diff --git a/extensions/voice-call/src/runtime.test.ts b/extensions/voice-call/src/runtime.test.ts index cc8b38d09db..16dd1976aa3 100644 --- a/extensions/voice-call/src/runtime.test.ts +++ b/extensions/voice-call/src/runtime.test.ts @@ -170,7 +170,6 @@ function createSessionRuntimeMock(sessionStore: Record) { upsertSessionEntry: vi.fn(({ sessionKey, entry }: { sessionKey: string; entry: unknown }) => { sessionStore[sessionKey] = entry; }), - resolveSessionFilePath: vi.fn(() => "/tmp/session.json"), }; } diff --git a/src/auto-reply/reply/session-updates.test.ts b/src/auto-reply/reply/session-updates.test.ts index d0040e79f9b..cbf7093c87a 100644 --- a/src/auto-reply/reply/session-updates.test.ts +++ b/src/auto-reply/reply/session-updates.test.ts @@ -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", () => ({ diff --git a/src/config/sessions/sessions.test.ts b/src/config/sessions/sessions.test.ts index 0a7ed3a5c5f..b0572662d87 100644 --- a/src/config/sessions/sessions.test.ts +++ b/src/config/sessions/sessions.test.ts @@ -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" })); }); diff --git a/src/plugin-sdk/session-store-runtime.ts b/src/plugin-sdk/session-store-runtime.ts index c824f5e8e24..b1861db3c2a 100644 --- a/src/plugin-sdk/session-store-runtime.ts +++ b/src/plugin-sdk/session-store-runtime.ts @@ -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"; diff --git a/src/plugin-sdk/test-helpers/plugin-runtime-mock.ts b/src/plugin-sdk/test-helpers/plugin-runtime-mock.ts index 6044937c22e..103f746e242 100644 --- a/src/plugin-sdk/test-helpers/plugin-runtime-mock.ts +++ b/src/plugin-sdk/test-helpers/plugin-runtime-mock.ts @@ -356,9 +356,6 @@ export function createPluginRuntimeMock(overrides: DeepPartial = 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: { diff --git a/src/plugins/runtime/index.test.ts b/src/plugins/runtime/index.test.ts index 857f9eae066..3a4b2648cfc 100644 --- a/src/plugins/runtime/index.test.ts +++ b/src/plugins/runtime/index.test.ts @@ -312,7 +312,6 @@ describe("plugin runtime command execution", () => { "listSessionEntries", "patchSessionEntry", "upsertSessionEntry", - "resolveSessionFilePath", ]); }, }, diff --git a/src/plugins/runtime/runtime-agent.ts b/src/plugins/runtime/runtime-agent.ts index b9eba835d60..158bd25f1f7 100644 --- a/src/plugins/runtime/runtime-agent.ts +++ b/src/plugins/runtime/runtime-agent.ts @@ -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"]; diff --git a/src/plugins/runtime/types-core.ts b/src/plugins/runtime/types-core.ts index ca3539c13b8..9dc6e97de91 100644 --- a/src/plugins/runtime/types-core.ts +++ b/src/plugins/runtime/types-core.ts @@ -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: { diff --git a/src/talk/agent-consult-runtime.test.ts b/src/talk/agent-consult-runtime.test.ts index 0ce5b3552df..439e681f0df 100644 --- a/src/talk/agent-consult-runtime.test.ts +++ b/src/talk/agent-consult-runtime.test.ts @@ -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, },