Files
openclaw/src/agents/subagent-registry.persistence.test-support.ts
2026-05-01 12:14:08 +01:00

79 lines
2.6 KiB
TypeScript

import fs from "node:fs/promises";
import path from "node:path";
import { vi } from "vitest";
type SessionStore = Record<string, Record<string, unknown>>;
function resolveSubagentSessionStorePath(stateDir: string, agentId: string): string {
return path.join(stateDir, "agents", agentId, "sessions", "sessions.json");
}
export async function readSubagentSessionStore(storePath: string): Promise<SessionStore> {
try {
const raw = await fs.readFile(storePath, "utf8");
const parsed = JSON.parse(raw) as unknown;
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
return parsed as SessionStore;
}
} catch {
// ignore
}
return {};
}
export async function writeSubagentSessionEntry(params: {
stateDir: string;
sessionKey: string;
sessionId?: string;
updatedAt?: number;
abortedLastRun?: boolean;
agentId: string;
defaultSessionId: string;
}): Promise<string> {
const storePath = resolveSubagentSessionStorePath(params.stateDir, params.agentId);
const store = await readSubagentSessionStore(storePath);
store[params.sessionKey] = {
...store[params.sessionKey],
sessionId: params.sessionId ?? params.defaultSessionId,
updatedAt: params.updatedAt ?? Date.now(),
...(typeof params.abortedLastRun === "boolean"
? { abortedLastRun: params.abortedLastRun }
: {}),
};
await fs.mkdir(path.dirname(storePath), { recursive: true });
await fs.writeFile(storePath, `${JSON.stringify(store)}\n`, "utf8");
return storePath;
}
export async function removeSubagentSessionEntry(params: {
stateDir: string;
sessionKey: string;
agentId: string;
}): Promise<string> {
const storePath = resolveSubagentSessionStorePath(params.stateDir, params.agentId);
const store = await readSubagentSessionStore(storePath);
delete store[params.sessionKey];
await fs.mkdir(path.dirname(storePath), { recursive: true });
await fs.writeFile(storePath, `${JSON.stringify(store)}\n`, "utf8");
return storePath;
}
export function createSubagentRegistryTestDeps(
extra: Record<string, unknown> = {},
): Record<string, unknown> {
return {
cleanupBrowserSessionsForLifecycleEnd: vi.fn(async () => {}),
ensureContextEnginesInitialized: vi.fn(),
ensureRuntimePluginsLoaded: vi.fn(),
getRuntimeConfig: vi.fn(() => ({})),
resolveAgentTimeoutMs: vi.fn(() => 100),
resolveContextEngine: vi.fn(async () => ({
info: { id: "test", name: "Test", version: "0.0.1" },
ingest: vi.fn(async () => ({ ingested: false })),
assemble: vi.fn(async ({ messages }) => ({ messages, estimatedTokens: 0 })),
compact: vi.fn(async () => ({ ok: false, compacted: false })),
})),
...extra,
};
}