wiwiway / src /lib /memory /settings.ts
Claude Code
Sync gateway codebase without binaries
116b4cb
Raw
History Blame Contribute Delete
3.14 kB
import { getSettings } from "@/lib/db/settings";
import type { MemoryConfig } from "./types";
export interface MemorySettings {
enabled: boolean;
maxTokens: number;
retentionDays: number;
strategy: "recent" | "semantic" | "hybrid";
skillsEnabled: boolean;
}
export const DEFAULT_MEMORY_SETTINGS: MemorySettings = {
enabled: true,
maxTokens: 2000,
retentionDays: 30,
strategy: "hybrid",
skillsEnabled: false,
};
let cachedMemorySettings: MemorySettings | null = null;
function toBoolean(value: unknown, fallback: boolean): boolean {
return typeof value === "boolean" ? value : fallback;
}
function clampInteger(value: unknown, fallback: number, min: number, max: number): number {
if (typeof value !== "number" || !Number.isFinite(value)) return fallback;
return Math.min(Math.max(Math.round(value), min), max);
}
function normalizeStrategy(value: unknown): MemorySettings["strategy"] {
return value === "recent" || value === "semantic" || value === "hybrid"
? value
: DEFAULT_MEMORY_SETTINGS.strategy;
}
export function normalizeMemorySettings(rawSettings: Record<string, unknown> = {}): MemorySettings {
return {
enabled: toBoolean(rawSettings.memoryEnabled, DEFAULT_MEMORY_SETTINGS.enabled),
maxTokens: clampInteger(
rawSettings.memoryMaxTokens,
DEFAULT_MEMORY_SETTINGS.maxTokens,
0,
16000
),
retentionDays: clampInteger(
rawSettings.memoryRetentionDays,
DEFAULT_MEMORY_SETTINGS.retentionDays,
1,
365
),
strategy: normalizeStrategy(rawSettings.memoryStrategy),
skillsEnabled: toBoolean(rawSettings.skillsEnabled, DEFAULT_MEMORY_SETTINGS.skillsEnabled),
};
}
export function toMemorySettingsUpdates(
settings: Partial<MemorySettings>
): Record<string, unknown> {
const updates: Record<string, unknown> = {};
if (settings.enabled !== undefined) updates.memoryEnabled = settings.enabled;
if (settings.maxTokens !== undefined) updates.memoryMaxTokens = settings.maxTokens;
if (settings.retentionDays !== undefined) updates.memoryRetentionDays = settings.retentionDays;
if (settings.strategy !== undefined) updates.memoryStrategy = settings.strategy;
if (settings.skillsEnabled !== undefined) updates.skillsEnabled = settings.skillsEnabled;
return updates;
}
export function toMemoryRetrievalConfig(settings: MemorySettings): Partial<MemoryConfig> {
const enabled = settings.enabled && settings.maxTokens > 0;
return {
enabled,
maxTokens: enabled ? settings.maxTokens : 0,
retrievalStrategy: settings.strategy === "recent" ? "exact" : settings.strategy,
autoSummarize: false,
persistAcrossModels: false,
retentionDays: settings.retentionDays,
scope: "apiKey",
};
}
export async function getMemorySettings(): Promise<MemorySettings> {
if (cachedMemorySettings !== null) {
return cachedMemorySettings;
}
const settings = (await getSettings()) as Record<string, unknown>;
cachedMemorySettings = normalizeMemorySettings(settings);
return cachedMemorySettings;
}
export function invalidateMemorySettingsCache(): void {
cachedMemorySettings = null;
}