mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-11 12:11:41 +00:00
fix: compaction safeguard extension not loading in production builds (openclaw#22349) thanks @Glucksberg
Verified: - pnpm build - pnpm check - pnpm test:macmini (local run had unrelated baseline failures; Tak approved proceed) Co-authored-by: Glucksberg <80581902+Glucksberg@users.noreply.github.com> Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
This commit is contained in:
@@ -1,25 +1,17 @@
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
import type { Api, Model } from "@mariozechner/pi-ai";
|
||||
import type { SessionManager } from "@mariozechner/pi-coding-agent";
|
||||
import type { ExtensionFactory, SessionManager } from "@mariozechner/pi-coding-agent";
|
||||
import type { OpenClawConfig } from "../../config/config.js";
|
||||
import { resolveContextWindowInfo } from "../context-window-guard.js";
|
||||
import { DEFAULT_CONTEXT_TOKENS } from "../defaults.js";
|
||||
import { setCompactionSafeguardRuntime } from "../pi-extensions/compaction-safeguard-runtime.js";
|
||||
import compactionSafeguardExtension from "../pi-extensions/compaction-safeguard.js";
|
||||
import contextPruningExtension from "../pi-extensions/context-pruning.js";
|
||||
import { setContextPruningRuntime } from "../pi-extensions/context-pruning/runtime.js";
|
||||
import { computeEffectiveSettings } from "../pi-extensions/context-pruning/settings.js";
|
||||
import { makeToolPrunablePredicate } from "../pi-extensions/context-pruning/tools.js";
|
||||
import { ensurePiCompactionReserveTokens } from "../pi-settings.js";
|
||||
import { isCacheTtlEligibleProvider, readLastCacheTtlTimestamp } from "./cache-ttl.js";
|
||||
|
||||
function resolvePiExtensionPath(id: string): string {
|
||||
const self = fileURLToPath(import.meta.url);
|
||||
const dir = path.dirname(self);
|
||||
// In dev this file is `.ts` (tsx), in production it's `.js`.
|
||||
const ext = path.extname(self) === ".ts" ? "ts" : "js";
|
||||
return path.join(dir, "..", "pi-extensions", `${id}.${ext}`);
|
||||
}
|
||||
|
||||
function resolveContextWindowTokens(params: {
|
||||
cfg: OpenClawConfig | undefined;
|
||||
provider: string;
|
||||
@@ -35,24 +27,24 @@ function resolveContextWindowTokens(params: {
|
||||
}).tokens;
|
||||
}
|
||||
|
||||
function buildContextPruningExtension(params: {
|
||||
function buildContextPruningFactory(params: {
|
||||
cfg: OpenClawConfig | undefined;
|
||||
sessionManager: SessionManager;
|
||||
provider: string;
|
||||
modelId: string;
|
||||
model: Model<Api> | undefined;
|
||||
}): { additionalExtensionPaths?: string[] } {
|
||||
}): ExtensionFactory | undefined {
|
||||
const raw = params.cfg?.agents?.defaults?.contextPruning;
|
||||
if (raw?.mode !== "cache-ttl") {
|
||||
return {};
|
||||
return undefined;
|
||||
}
|
||||
if (!isCacheTtlEligibleProvider(params.provider, params.modelId)) {
|
||||
return {};
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const settings = computeEffectiveSettings(raw);
|
||||
if (!settings) {
|
||||
return {};
|
||||
return undefined;
|
||||
}
|
||||
|
||||
setContextPruningRuntime(params.sessionManager, {
|
||||
@@ -62,23 +54,21 @@ function buildContextPruningExtension(params: {
|
||||
lastCacheTouchAt: readLastCacheTtlTimestamp(params.sessionManager),
|
||||
});
|
||||
|
||||
return {
|
||||
additionalExtensionPaths: [resolvePiExtensionPath("context-pruning")],
|
||||
};
|
||||
return contextPruningExtension;
|
||||
}
|
||||
|
||||
function resolveCompactionMode(cfg?: OpenClawConfig): "default" | "safeguard" {
|
||||
return cfg?.agents?.defaults?.compaction?.mode === "safeguard" ? "safeguard" : "default";
|
||||
}
|
||||
|
||||
export function buildEmbeddedExtensionPaths(params: {
|
||||
export function buildEmbeddedExtensionFactories(params: {
|
||||
cfg: OpenClawConfig | undefined;
|
||||
sessionManager: SessionManager;
|
||||
provider: string;
|
||||
modelId: string;
|
||||
model: Model<Api> | undefined;
|
||||
}): string[] {
|
||||
const paths: string[] = [];
|
||||
}): ExtensionFactory[] {
|
||||
const factories: ExtensionFactory[] = [];
|
||||
if (resolveCompactionMode(params.cfg) === "safeguard") {
|
||||
const compactionCfg = params.cfg?.agents?.defaults?.compaction;
|
||||
const contextWindowInfo = resolveContextWindowInfo({
|
||||
@@ -92,13 +82,13 @@ export function buildEmbeddedExtensionPaths(params: {
|
||||
maxHistoryShare: compactionCfg?.maxHistoryShare,
|
||||
contextWindowTokens: contextWindowInfo.tokens,
|
||||
});
|
||||
paths.push(resolvePiExtensionPath("compaction-safeguard"));
|
||||
factories.push(compactionSafeguardExtension);
|
||||
}
|
||||
const pruning = buildContextPruningExtension(params);
|
||||
if (pruning.additionalExtensionPaths) {
|
||||
paths.push(...pruning.additionalExtensionPaths);
|
||||
const pruningFactory = buildContextPruningFactory(params);
|
||||
if (pruningFactory) {
|
||||
factories.push(pruningFactory);
|
||||
}
|
||||
return paths;
|
||||
return factories;
|
||||
}
|
||||
|
||||
export { ensurePiCompactionReserveTokens };
|
||||
|
||||
Reference in New Issue
Block a user