@runic-labs/cache
Signaturbasierter Artefaktspeicher – im Arbeitsspeicher und dateibasiert.
@runic-labs/cache ordnet eine normalisierte Entscheidungssignatur dem dafür erzeugten Artefakt zu. Die meisten Integrationen benötigen dieses Paket nicht direkt – @runic-labs/sdk kapselt es –, aber es ist nützlich für benutzerdefinierte Store-Konfigurationen oder zur Untersuchung der Cache-Interna.
npm install @runic-labs/cachepnpm add @runic-labs/cacheyarn add @runic-labs/cachebun add @runic-labs/cachesignature(decision)
Normalisiert eine Decision und gibt ihre SHA-256-Signatur zurück. Objektschlüssel in params werden rekursiv sortiert, sodass die Schlüsselreihenfolge den Hash nie beeinflusst. Den vollständigen Algorithmus findest du unter So funktioniert es.
import { signature } from "@runic-labs/cache";
signature({ intent: "summarize_pr", params: { repo: "acme/widgets", pr: 482 } });
// => same hash regardless of param key order
createCache(store?)
import { createCache, FileCacheStore, defaultCacheFilePath } from "@runic-labs/cache";
const cache = createCache(new FileCacheStore({ filePath: defaultCacheFilePath() }));
Wenn kein Store übergeben wird, wird standardmäßig ein FileCacheStore unter .runic/cache.json (oder $RUNIC_HOME/cache.json) verwendet.
get(decision)?CachedEntry | null
Looks up a decision. Bumps hit stats on a hit.
CachedEntry | nullset(decision, artifact, meta)?CachedEntry
Stores an artifact for a decision. meta = { tokensSpent }.
CachedEntrylist()?CachedEntry[]
All entries currently in the store.
CachedEntry[]clear()?void
Removes all entries.
voidSpeicher-Backends
MemoryCacheStore
Nur im Arbeitsspeicher, lebt für die Lebensdauer des Prozesses. Wird sowohl von Benchmarks als auch von Tests verwendet, sodass Ausführungen eigenständig und reproduzierbar sind.
import { createCache, MemoryCacheStore } from "@runic-labs/cache";
const cache = createCache(new MemoryCacheStore({ staleAfterMs: 60_000 }));
FileCacheStore
Speichert in einer JSON-Datei, sodass ein CLI-Prozess und ein Agent-Prozess denselben Cache ohne laufenden Server lesen können.
import { createCache, FileCacheStore } from "@runic-labs/cache";
const cache = createCache(new FileCacheStore({ filePath: "./my-agent/.runic/cache.json" }));
Eine beschädigte oder nur teilweise geschriebene Datei wird als leer behandelt, statt einen Fehler auszulösen – ein Absturz während des Schreibens sollte niemals den nächsten Lesevorgang beeinträchtigen.
Deinen eigenen CacheStore implementieren
Beide integrierten Stores implementieren dieselbe kleine Schnittstelle, sodass ein Redis- oder SQLite-basierter Store ein direkter Ersatz ist:
interface CacheStore {
get(signature: string): CachedEntry | null;
set(signature: string, artifact: unknown, meta: { tokensSpent: number }): CachedEntry;
touch(signature: string): CachedEntry | null;
list(): CachedEntry[];
clear(): void;
}
touch wird intern bei jedem Cache-Treffer aufgerufen, um hitCount und lastUsedAt zu erhöhen – implementiere es als Lesen-Ändern-Schreiben für den von dir gewählten zugrunde liegenden Store.