Skip to content

Lagring

All tilstandsbasert data i Triggerfish flyter gjennom en enhetlig StorageProvider-abstraksjon. Ingen modul oppretter sin egen lagringsmekanisme — hver komponent som trenger persistens tar en StorageProvider som avhengighet. Dette designet gjør backends utskiftbare uten å berøre forretningslogikken og holder alle tester raske og deterministiske.

StorageProvider-grensesnitt

typescript
interface StorageProvider {
  /** Hent en verdi etter nøkkel. Returnerer null hvis ikke funnet. */
  get(key: string): Promise<StorageValue | null>;

  /** Lagre en verdi ved en nøkkel. Overskriver eksisterende verdi. */
  set(key: string, value: StorageValue): Promise<void>;

  /** Slett en nøkkel. Ingen operasjon hvis nøkkelen ikke eksisterer. */
  delete(key: string): Promise<void>;

  /** List alle nøkler som samsvarer med et valgfritt prefiks. */
  list(prefix?: string): Promise<string[]>;

  /** Slett alle nøkler. Bruk med forsiktighet. */
  clear(): Promise<void>;
}

StorageValue er en streng. All strukturert data (sesjoner, linjeoppføringer, konfigurasjon) serialiseres til JSON før lagring og deserialiseres ved lesing. Dette holder grensesnittet enkelt og backend-agnostisk. :::

Implementasjoner

BackendBrukstilfellePersistensKonfigurasjon
MemoryStorageProviderTesting, flyktige sesjonerIngen (tapt ved omstart)Ingen konfigurasjon nødvendig
SqliteStorageProviderStandard for personlig nivåSQLite WAL på ~/.triggerfish/data/triggerfish.dbNullkonfigurasjon
BedriftsbackendsBedriftsnivåKundadministrertPostgres, S3 eller andre backends

MemoryStorageProvider

Brukt i alle tester for hastighet og determinisme. Data eksisterer bare i minne og er tapt når prosessen avsluttes. Hver testpakke oppretter en frisk MemoryStorageProvider, noe som sikrer at tester er isolerte og reproduserbare.

SqliteStorageProvider

Standarden for distribusjoner på personlig nivå. Bruker SQLite i WAL-modus (Write-Ahead Logging) for samtidig lesetilgang og krasjsikkerhet. Databasen bor på:

~/.triggerfish/data/triggerfish.db

SQLite krever ingen konfigurasjon, ingen serverprosess og intet nettverk. En enkelt fil lagrer all Triggerfish-tilstand. @db/sqlite Deno-pakken gir bindingen, som krever --allow-ffi-tillatelse.

SQLite WAL-modus lar flere lesere få tilgang til databasen samtidig med én enkelt skriver. Dette er viktig for Gateway, som kan lese sesjonstilstand mens agenten skriver verktøyresultater. :::

Bedriftsbackends

Bedriftsdistribusjoner kan koble inn eksterne lagringsbackends (Postgres, S3 osv.) uten kodeendringer. Enhver implementasjon av StorageProvider-grensesnittet fungerer. Backend konfigureres i triggerfish.yaml.

Alle nøkler i lagringssystemet er navnedelt med et prefiks som identifiserer datatypen. Dette forhindrer kollisjoner og gjør det mulig å spørre, beholde og rense data etter kategori.

NavneromNøkkelmønsterBeskrivelse
sessions:sessions:sess_abc123Sesjonstilstand (samtalehistorikk, metadata)
taint:taint:sess_abc123Session taint-nivå
lineage:lineage:lin_789xyzDatalinjeoppføringer (provenansssporing)
audit:audit:2025-01-29T10:23:45Z:hook_pre_outputRevisjonsloggoppføringer
cron:cron:job_daily_reportCron-jobbtilstand og utførelseshistorikk
notifications:notifications:notif_456Varslingskon
exec:exec:run_789Agentutførelseemiljøhistorikk
skills:skills:skill_weatherInstallert skill-metadata
config:config:v3Konfigurasjonsøyeblikksbilder

Oppbevaringspolicyer

Hvert navnerom har en standard oppbevaringspolicy. Bedriftsdistribusjoner kan tilpasse disse.

NavneromStandard oppbevaringBegrunnelse
sessions:30 dagerSamtalehistorikk eldes ut
taint:Matcher sesjonoppbevaringTaint er meningsløs uten sin sesjon
lineage:90 dagerSamsvarsdrevet, revisjonslogg
audit:1 årSamsvarsdrevet, juridisk og regulatorisk
cron:30 dagerUtførelseshistorikk for feilsøking
notifications:Inntil levert + 7 dagerUleverte varsler må vedvare
exec:30 dagerUtførelsesobjekter for feilsøking
skills:PermanentInstallert skill-metadata bør ikke utløpe
config:10 versjonerRullende konfigurasjonshistorikk for tilbakestilling

Designprinsipper

Alle moduler bruker StorageProvider

Ingen modul i Triggerfish oppretter sin egen lagringsmekanisme. Sesjonsadministrasjon, taint-sporing, linjeregistrering, revisjonslogging, cron-tilstand, varslingskon, utørelseshistorikk og konfigurasjon — alt flyter gjennom StorageProvider.

Dette betyr:

  • Bytte av backends krever å endre ett avhengighetsinjeksjonspunkt
  • Tester bruker MemoryStorageProvider for hastighet — ingen SQLite-oppsett, ingen filsystem
  • Det er nøyaktig ett sted å implementere kryptering-i-ro, sikkerhetskopiering eller replikering

Serialisering

All strukturert data serialiseres til JSON-strenger før lagring. Serialiserings-/deserialiseringslagen håndterer:

  • Date-objekter (serialisert som ISO 8601-strenger via toISOString(), deserialisert via new Date())
  • Merkede typer (serialisert som sin underliggende strengverdi)
  • Nestede objekter og arrays
typescript
// Lagre en sesjon
const session = {
  id: "sess_abc",
  taint: "CONFIDENTIAL",
  createdAt: new Date(),
};
await storage.set("sessions:sess_abc", JSON.stringify(session));

// Hente en sesjon
const raw = await storage.get("sessions:sess_abc");
if (raw) {
  const session = JSON.parse(raw);
  session.createdAt = new Date(session.createdAt); // Gjenopprett Date
}

Uforanderlighet

Sesjonsoperasjoner er uforanderlige. Å lese en sesjon, endre den og skrive den tilbake produserer alltid et nytt objekt. Funksjoner muterer aldri det lagrede objektet på stedet. Dette er i tråd med det bredere Triggerfish-prinsippet om at funksjoner returnerer nye objekter og aldri muterer.

Katalogstruktur

~/.triggerfish/
  config/          # Agentkonfigurasjon, SPINE.md, TRIGGER.md
  data/            # triggerfish.db (SQLite)
  workspace/       # Agent utførelseemiljø
    <agent-id>/    # Per-agent arbeidsområde (vedvarer)
    background/    # Bakgrunnssesjon-arbeidsområder
  skills/          # Installerte skills
  logs/            # Revisjonslogger
  secrets/         # Kryptert legitimasjonslager

SIKKERHET secrets/-katalogen inneholder kryptert legitimasjon administrert av OS-nøkkelringintegrasjonen. Lagre aldri hemmeligheter i konfigurasjonsfiler eller i StorageProvider. Bruk OS-nøkkelringen (personlig nivå) eller vault-integrasjonen (bedriftsnivå). :::