refactor: cache reply and visibility runtimes

This commit is contained in:
Peter Steinberger
2026-04-18 20:52:17 +01:00
parent 8ba5865383
commit b3a97df754
4 changed files with 30 additions and 4 deletions

View File

@@ -34,12 +34,18 @@ function getMemorySearchManagerCacheStore(): MemorySearchManagerCacheStore {
const log = createSubsystemLogger("memory");
const { qmdManagerCache: QMD_MANAGER_CACHE } = getMemorySearchManagerCacheStore();
let managerRuntimePromise: Promise<typeof import("../../manager-runtime.js")> | null = null;
let qmdManagerModulePromise: Promise<typeof import("./qmd-manager.js")> | null = null;
function loadManagerRuntime() {
managerRuntimePromise ??= import("../../manager-runtime.js");
return managerRuntimePromise;
}
function loadQmdManagerModule() {
qmdManagerModulePromise ??= import("./qmd-manager.js");
return qmdManagerModulePromise;
}
export type MemorySearchManagerResult = {
manager: MemorySearchManager | null;
error?: string;
@@ -90,7 +96,7 @@ export async function getMemorySearchManager(params: {
);
} else {
try {
const { QmdMemoryManager } = await import("./qmd-manager.js");
const { QmdMemoryManager } = await loadQmdManagerModule();
const primary = await QmdMemoryManager.create({
cfg: params.cfg,
agentId: params.agentId,

View File

@@ -26,6 +26,13 @@ const HIDDEN_CLASS_NAMES = new Set([
"offscreen",
]);
let parseHtmlPromise: Promise<typeof import("linkedom").parseHTML> | null = null;
async function loadParseHTML(): Promise<typeof import("linkedom").parseHTML> {
parseHtmlPromise ??= import("linkedom").then(({ parseHTML }) => parseHTML);
return parseHtmlPromise;
}
function hasHiddenClass(className: string): boolean {
const classes = normalizeLowercaseStringOrEmpty(className).split(/\s+/);
return classes.some((cls) => HIDDEN_CLASS_NAMES.has(cls));
@@ -137,7 +144,7 @@ export async function sanitizeHtml(html: string): Promise<string> {
let document: Document;
try {
const { parseHTML } = await import("linkedom");
const parseHTML = await loadParseHTML();
({ document } = parseHTML(sanitized) as { document: Document });
} catch {
return sanitized;

View File

@@ -9,6 +9,13 @@ import {
import type { CommandHandler } from "./commands-types.js";
import { stripMentions, stripStructuralPrefixes } from "./mentions.js";
let compactRuntimePromise: Promise<typeof import("./commands-compact.runtime.js")> | null = null;
function loadCompactRuntime(): Promise<typeof import("./commands-compact.runtime.js")> {
compactRuntimePromise ??= import("./commands-compact.runtime.js");
return compactRuntimePromise;
}
function extractCompactInstructions(params: {
rawBody?: string;
ctx: import("../templating.js").MsgContext;
@@ -88,7 +95,7 @@ export const handleCompactCommand: CommandHandler = async (params) => {
reply: { text: "⚙️ Compaction unavailable (missing session id)." },
};
}
const runtime = await import("./commands-compact.runtime.js");
const runtime = await loadCompactRuntime();
const sessionId = targetSessionEntry.sessionId;
if (runtime.isEmbeddedPiRunActive(sessionId)) {
runtime.abortEmbeddedPiRun(sessionId);

View File

@@ -7,6 +7,12 @@ import type { OpenClawConfig } from "../../config/types.openclaw.js";
* See #26905.
*/
const DEFAULT_PARENT_FORK_MAX_TOKENS = 100_000;
let sessionForkRuntimePromise: Promise<typeof import("./session-fork.runtime.js")> | null = null;
function loadSessionForkRuntime(): Promise<typeof import("./session-fork.runtime.js")> {
sessionForkRuntimePromise ??= import("./session-fork.runtime.js");
return sessionForkRuntimePromise;
}
export function resolveParentForkMaxTokens(cfg: OpenClawConfig): number {
const configured = cfg.session?.parentForkMaxTokens;
@@ -21,6 +27,6 @@ export async function forkSessionFromParent(params: {
agentId: string;
sessionsDir: string;
}): Promise<{ sessionId: string; sessionFile: string } | null> {
const runtime = await import("./session-fork.runtime.js");
const runtime = await loadSessionForkRuntime();
return runtime.forkSessionFromParentRuntime(params);
}