Skip to content

Lagring

All tillståndsdata i Triggerfish flödar via en enhetlig StorageProvider-abstraktion. Ingen modul skapar sin egen lagringsmekanism — varje komponent som behöver persistens tar en StorageProvider som ett beroende. Den här designen gör backends utbytbara utan att påverka affärslogiken och håller alla tester snabba och deterministiska.

StorageProvider-gränssnitt

typescript
interface StorageProvider {
  /** Hämta ett värde med nyckel. Returnerar null om det inte hittas. */
  get(key: string): Promise<StorageValue | null>;

  /** Lagra ett värde vid en nyckel. Skriver över befintligt värde. */
  set(key: string, value: StorageValue): Promise<void>;

  /** Ta bort en nyckel. Ingen åtgärd om nyckeln inte finns. */
  delete(key: string): Promise<void>;

  /** Lista alla nycklar som matchar ett valfritt prefix. */
  list(prefix?: string): Promise<string[]>;

  /** Ta bort alla nycklar. Använd med försiktighet. */
  clear(): Promise<void>;
}

StorageValue är en sträng. All strukturerad data (sessioner, linjegrafipost, konfiguration) serialiseras till JSON innan lagring och deserialiseras vid läsning. Det håller gränssnittet enkelt och backend-agnostiskt. :::

Implementeringar

BackendAnvändningsfallPersistensKonfiguration
MemoryStorageProviderTestning, efemera sessionerIngen (förlorad vid omstart)Ingen konfiguration behövs
SqliteStorageProviderStandard för personlig nivåSQLite WAL på ~/.triggerfish/data/triggerfish.dbNoll konfiguration
FöretagsbackendsFöretagsnivåKundhanterardPostgres, S3 eller andra backends

MemoryStorageProvider

Används i alla tester för snabbhet och determinism. Data finns bara i minnet och försvinner när processen avslutas. Varje testsvit skapar en ny MemoryStorageProvider, vilket säkerställer att tester är isolerade och reproducerbara.

SqliteStorageProvider

Standard för personliga driftsättningar. Använder SQLite i WAL-läge (Write-Ahead Logging) för samtidig läsåtkomst och kraschsäkerhet. Databasen finns på:

~/.triggerfish/data/triggerfish.db

SQLite kräver ingen konfiguration, ingen serverprocess och inget nätverk. En enda fil lagrar hela Triggerfish-tillståndet. @db/sqlite Deno-paketet tillhandahåller bindningen, vilket kräver --allow-ffi-behörighet.

SQLite WAL-läge tillåter flera läsare att komma åt databasen samtidigt med en enda skrivare. Det här är viktigt för Gateway, som kan läsa sessionstillstånd medan agenten skriver verktygsresultat. :::

Företagsbackends

Företagsdriftsättningar kan koppla in externa lagringsbakends (Postgres, S3 osv.) utan kodändringar. Vilken som helst implementering av StorageProvider-gränssnittet fungerar. Bakenden konfigureras i triggerfish.yaml.

Namnrymdsnycklar

Alla nycklar i lagringssystemet är namnrymdsattade med ett prefix som identifierar datatypen. Det förhindrar kollisioner och gör det möjligt att fråga, behålla och rensa data per kategori.

NamnrymdNyckelmönsterBeskrivning
sessions:sessions:sess_abc123Sessionstillstånd (konversationshistorik, metadata)
taint:taint:sess_abc123Session-taint-nivå
lineage:lineage:lin_789xyzDatalinjegrafiposter (provensspårning)
audit:audit:2025-01-29T10:23:45Z:hook_pre_outputRevisionsloggposter
cron:cron:job_daily_reportCron-jobbtillstånd och körningshistorik
notifications:notifications:notif_456Notifieringskö
exec:exec:run_789Agentkörningsmiljöhistorik
skills:skills:skill_weatherInstallerad skill-metadata
config:config:v3Konfigurationsögonblicksbilder

Bevarandepolicyer

Varje namnrymd har en standardbevarandepolicy. Företagsdriftsättningar kan anpassa dessa.

NamnrymdStandardbevarandeMotivering
sessions:30 dagarKonversationshistorik åldras ut
taint:Matchar sessionsbevarandeTaint är meningslöst utan sin session
lineage:90 dagarEfterlevnadsdrivet, revisionsspår
audit:1 årEfterlevnadsdrivet, juridiskt och regulatoriskt
cron:30 dagarKörningshistorik för felsökning
notifications:Tills levererat + 7 dagarEj levererade notifieringar måste bevaras
exec:30 dagarKörningsartefakter för felsökning
skills:PermanentInstallerad skill-metadata ska inte löpa ut
config:10 versionerRullande konfigurationshistorik för återställning

Designprinciper

Alla moduler använder StorageProvider

Ingen modul i Triggerfish skapar sin egen lagringsmekanism. Sessionshantering, taint-spårning, lineage-registrering, revisionsloggning, cron-tillstånd, notifieringsköer, körningshistorik och konfiguration — allt flödar via StorageProvider.

Det innebär:

  • Att byta backends kräver att man ändrar en enda beroendeinjektionspunkt
  • Tester använder MemoryStorageProvider för snabbhet — ingen SQLite-installation, inget filsystem
  • Det finns exakt ett ställe att implementera kryptering-i-vila, säkerhetskopiering eller replikering

Serialisering

All strukturerad data serialiseras till JSON-strängar innan lagring. Serialiserings-/deserialiseringslagret hanterar:

  • Date-objekt (serialiserade som ISO 8601-strängar via toISOString(), deserialiserade via new Date())
  • Brandade typer (serialiserade som deras underliggande strängvärde)
  • Kapslade objekt och arrayer
typescript
// Lagra en session
const session = {
  id: "sess_abc",
  taint: "CONFIDENTIAL",
  createdAt: new Date(),
};
await storage.set("sessions:sess_abc", JSON.stringify(session));

// Hämta en session
const raw = await storage.get("sessions:sess_abc");
if (raw) {
  const session = JSON.parse(raw);
  session.createdAt = new Date(session.createdAt); // Återställ Date
}

Oföränderlighet

Sessionsoperationer är oföränderliga. Att läsa en session, ändra den och skriva tillbaka den ger alltid ett nytt objekt. Funktioner muterar aldrig det lagrade objektet på plats. Det stämmer överens med den bredare Triggerfish-principen att funktioner returnerar nya objekt och aldrig muterar.

Katalogstruktur

~/.triggerfish/
  config/          # Agentkonfiguration, SPINE.md, TRIGGER.md
  data/            # triggerfish.db (SQLite)
  workspace/       # Agents körningsmiljö
    <agent-id>/    # Per-agentarbetsyta (bevaras)
    background/    # Bakgrundssessionsarbetsytor
  skills/          # Installerade skills
  logs/            # Revisionsloggar
  secrets/         # Krypterat autentiseringsuppgiftslager

SÄKERHET Katalogen secrets/ innehåller krypterade uppgifter hanterade av OS-nyckelringsintegrationen. Lagra aldrig hemligheter i konfigurationsfiler eller i StorageProvider. Använd OS-nyckelringen (personlig nivå) eller vault-integration (företagsnivå). :::