Skip to content

Storage

Lahat ng stateful data sa Triggerfish ay dumadaan sa unified StorageProvider abstraction. Walang module ang gumagawa ng sariling storage mechanism -- bawat component na nangangailangan ng persistence ay tumatanggap ng StorageProvider bilang dependency. Ang design na ito ay nagpapadali ng pag-swap ng backends nang hindi ginagalaw ang business logic at nagpapanatiling mabilis at deterministic ang lahat ng tests.

StorageProvider Interface

typescript
interface StorageProvider {
  /** Kunin ang value gamit ang key. Nagbabalik ng null kung hindi natagpuan. */
  get(key: string): Promise<StorageValue | null>;

  /** I-store ang value sa isang key. Ino-overwrite ang anumang existing value. */
  set(key: string, value: StorageValue): Promise<void>;

  /** I-delete ang isang key. Walang ginagawa kung walang key. */
  delete(key: string): Promise<void>;

  /** I-list ang lahat ng keys na tumutugma sa optional prefix. */
  list(prefix?: string): Promise<string[]>;

  /** I-delete ang lahat ng keys. Gamitin nang maingat. */
  clear(): Promise<void>;
}

String ang StorageValue. Lahat ng structured data (sessions, lineage

records, configuration) ay sine-serialize sa JSON bago i-store at dine-deserialize sa pagbasa. Pinapanatili nitong simple at backend-agnostic ang interface. :::

Mga Implementation

BackendGamitPersistenceConfiguration
MemoryStorageProviderTesting, ephemeral sessionsWala (nawawala sa restart)Walang configuration na kailangan
SqliteStorageProviderDefault para sa personal tierSQLite WAL sa ~/.triggerfish/data/triggerfish.dbZero configuration
Enterprise backendsEnterprise tierCustomer-managedPostgres, S3, o ibang backends

MemoryStorageProvider

Ginagamit sa lahat ng tests para sa bilis at determinism. Nasa memory lang ang data at nawawala kapag nag-exit ang process. Bawat test suite ay gumagawa ng bagong MemoryStorageProvider, na nagtitiyak na isolated at reproducible ang tests.

SqliteStorageProvider

Ang default para sa personal tier deployments. Gumagamit ng SQLite sa WAL (Write-Ahead Logging) mode para sa concurrent read access at crash safety. Ang database ay nandito:

~/.triggerfish/data/triggerfish.db

Hindi nangangailangan ang SQLite ng configuration, walang server process, at walang network. Isang file ang nag-iimbak ng lahat ng Triggerfish state. Ang @db/sqlite Deno package ang nagbibigay ng binding, na nangangailangan ng --allow-ffi permission.

Pinapayagan ng SQLite WAL mode ang maramihang readers na i-access ang database

nang sabay-sabay kasama ng isang writer. Mahalaga ito para sa Gateway, na maaaring magbasa ng session state habang nagsusulat ang agent ng tool results. :::

Enterprise Backends

Maaaring mag-plug in ang enterprise deployments ng external storage backends (Postgres, S3, etc.) nang walang code changes. Gumagana ang anumang implementation ng StorageProvider interface. Kino-configure ang backend sa triggerfish.yaml.

Namespaced Keys

Lahat ng keys sa storage system ay namespaced na may prefix na tumutukoy sa data type. Pinipigilan nito ang collisions at pinapadali ang pag-query, pag-retain, at pag-purge ng data ayon sa category.

NamespaceKey PatternPaglalarawan
sessions:sessions:sess_abc123Session state (conversation history, metadata)
taint:taint:sess_abc123Session taint level
lineage:lineage:lin_789xyzData lineage records (provenance tracking)
audit:audit:2025-01-29T10:23:45Z:hook_pre_outputAudit log entries
cron:cron:job_daily_reportCron job state at execution history
notifications:notifications:notif_456Notification queue
exec:exec:run_789Agent execution environment history
skills:skills:skill_weatherInstalled skill metadata
config:config:v3Configuration snapshots

Mga Retention Policy

Bawat namespace ay may default na retention policy. Maaaring i-customize ng enterprise deployments ang mga ito.

NamespaceDefault RetentionDahilan
sessions:30 arawNag-age out ang conversation history
taint:Katugma ng session retentionWalang kahulugan ang taint nang walang session nito
lineage:90 arawCompliance-driven, audit trail
audit:1 taonCompliance-driven, legal at regulatory
cron:30 arawExecution history para sa debugging
notifications:Hanggang na-deliver + 7 arawKailangang mag-persist ang undelivered notifications
exec:30 arawExecution artifacts para sa debugging
skills:PermanentHindi dapat mag-expire ang installed skill metadata
config:10 versionsRolling config history para sa rollback

Mga Prinsipyo ng Design

Lahat ng Modules ay Gumagamit ng StorageProvider

Walang module sa Triggerfish ang gumagawa ng sariling storage mechanism. Session management, taint tracking, lineage recording, audit logging, cron state, notification queues, execution history, at configuration -- lahat ay dumadaan sa StorageProvider.

Ibig sabihin nito:

  • Ang pag-swap ng backends ay nangangailangan lang ng pagbabago sa isang dependency injection point
  • Gumagamit ang tests ng MemoryStorageProvider para sa bilis -- walang SQLite setup, walang filesystem
  • May eksaktong isang lugar lang para mag-implement ng encryption-at-rest, backup, o replication

Serialization

Lahat ng structured data ay sine-serialize sa JSON strings bago i-store. Ang serialize/deserialize layer ay nagha-handle ng:

  • Date objects (sine-serialize bilang ISO 8601 strings sa pamamagitan ng toISOString(), dine-deserialize sa pamamagitan ng new Date())
  • Branded types (sine-serialize bilang kanilang underlying string value)
  • Nested objects at arrays
typescript
// Pag-store ng session
const session = {
  id: "sess_abc",
  taint: "CONFIDENTIAL",
  createdAt: new Date(),
};
await storage.set("sessions:sess_abc", JSON.stringify(session));

// Pagkuha ng session
const raw = await storage.get("sessions:sess_abc");
if (raw) {
  const session = JSON.parse(raw);
  session.createdAt = new Date(session.createdAt); // I-restore ang Date
}

Immutability

Immutable ang session operations. Ang pagbasa ng session, pagbabago nito, at pag-write pabalik ay palaging gumagawa ng bagong object. Hindi kailanman nagmu-mutate ang functions ng stored object in place. Naaayon ito sa mas malawak na prinsipyo ng Triggerfish na ang functions ay nagbabalik ng bagong objects at hindi kailanman nagmu-mutate.

Directory Structure

~/.triggerfish/
  config/          # Agent configuration, SPINE.md, TRIGGER.md
  data/            # triggerfish.db (SQLite)
  workspace/       # Agent exec environment
    <agent-id>/    # Per-agent workspace (persistent)
    background/    # Background session workspaces
  skills/          # Installed skills
  logs/            # Audit logs
  secrets/         # Encrypted credential store

SECURITY Ang secrets/ directory ay naglalaman ng encrypted credentials

na minamanage ng OS keychain integration. Huwag kailanman mag-store ng secrets sa configuration files o sa StorageProvider. Gamitin ang OS keychain (personal tier) o vault integration (enterprise tier). :::