Skip to content

Storage

Triggerfish میں تمام stateful ڈیٹا ایک unified StorageProvider abstraction سے بہتا ہے۔ کوئی بھی module اپنا storage mechanism نہیں بناتا — ہر وہ component جسے persistence کی ضرورت ہے وہ ایک StorageProvider dependency لیتا ہے۔ یہ design backends کو business logic کو چھوئے بغیر swappable بناتا ہے اور تمام tests کو تیز اور یقینی رکھتا ہے۔

StorageProvider Interface

typescript
interface StorageProvider {
  /** key سے ایک value retrieve کریں۔ نہ ملنے پر null واپس کرتا ہے۔ */
  get(key: string): Promise<StorageValue | null>;

  /** ایک key پر ایک value store کریں۔ کوئی بھی موجودہ value overwrite کرتا ہے۔ */
  set(key: string, value: StorageValue): Promise<void>;

  /** ایک key delete کریں۔ اگر key موجود نہ ہو تو no-op۔ */
  delete(key: string): Promise<void>;

  /** اختیاری prefix سے match ہونے والی تمام keys کی فہرست۔ */
  list(prefix?: string): Promise<string[]>;

  /** تمام keys delete کریں۔ احتیاط سے استعمال کریں۔ */
  clear(): Promise<void>;
}

StorageValue ایک string ہے۔ تمام structured ڈیٹا (sessions، lineage

records، configuration) storage سے پہلے JSON میں serialize اور پڑھنے پر deserialize ہوتا ہے۔ یہ interface کو simple اور backend-agnostic رکھتا ہے۔ :::

Implementations

Backendاستعمال کا معاملہPersistenceConfiguration
MemoryStorageProviderTesting، ephemeral sessionsکوئی نہیں (restart پر ضائع)کوئی configuration درکار نہیں
SqliteStorageProviderPersonal tier کے لیے ڈیفالٹ~/.triggerfish/data/triggerfish.db پر SQLite WALZero configuration
Enterprise backendsEnterprise tierCustomer-managedPostgres، S3، یا دیگر backends

MemoryStorageProvider

تمام tests میں speed اور determinism کے لیے استعمال ہوتا ہے۔ ڈیٹا صرف memory میں موجود ہوتا ہے اور process exit پر ضائع ہو جاتا ہے۔ ہر test suite ایک تازہ MemoryStorageProvider بناتا ہے، اس بات کو یقینی کرتا ہے کہ tests isolated اور reproducible ہوں۔

SqliteStorageProvider

Personal tier deployments کے لیے ڈیفالٹ۔ Concurrent read access اور crash safety کے لیے SQLite کو WAL (Write-Ahead Logging) mode میں استعمال کرتا ہے۔ Database یہاں رہتا ہے:

~/.triggerfish/data/triggerfish.db

SQLite کو کوئی configuration، کوئی server process، اور کوئی network کی ضرورت نہیں۔ ایک واحد فائل تمام Triggerfish state محفوظ کرتی ہے۔ @db/sqlite Deno package binding فراہم کرتا ہے، جس کے لیے --allow-ffi permission درکار ہے۔

SQLite WAL mode متعدد readers کو ایک single writer کے ساتھ database تک

بیک وقت رسائی دیتا ہے۔ یہ Gateway کے لیے اہم ہے، جو ایجنٹ کے tool results لکھتے وقت session state پڑھ سکتا ہے۔ :::

Enterprise Backends

Enterprise deployments code تبدیل کیے بغیر بیرونی storage backends (Postgres، S3، وغیرہ) plug in کر سکتے ہیں۔ StorageProvider interface کی کوئی بھی implementation کام کرتی ہے۔ Backend triggerfish.yaml میں configure ہوتا ہے۔

Namespaced Keys

Storage سسٹم میں تمام keys ایک prefix کے ساتھ namespaced ہیں جو ڈیٹا کی قسم بتاتا ہے۔ یہ collisions روکتا ہے اور category کے مطابق ڈیٹا query، retain، اور purge کرنا ممکن بناتا ہے۔

NamespaceKey Patternوضاحت
sessions:sessions:sess_abc123Session state (conversation history، metadata)
taint:taint:sess_abc123Session taint level
lineage:lineage:lin_789xyzڈیٹا lineage records (provenance tracking)
audit:audit:2025-01-29T10:23:45Z:hook_pre_outputAudit log entries
cron:cron:job_daily_reportCron job state اور execution history
notifications:notifications:notif_456Notification queue
exec:exec:run_789Agent execution environment history
skills:skills:skill_weatherانسٹال شدہ skill metadata
config:config:v3Configuration snapshots

Retention Policies

ہر namespace کی ایک ڈیفالٹ retention policy ہے۔ Enterprise deployments انہیں کسٹمائز کر سکتے ہیں۔

Namespaceڈیفالٹ Retentionوجہ
sessions:30 دنConversation history expire ہو جاتی ہے
taint:Session retention سے میلTaint اپنے session کے بغیر بے معنی ہے
lineage:90 دنCompliance-driven، audit trail
audit:1 سالCompliance-driven، قانونی اور regulatory
cron:30 دنDebugging کے لیے Execution history
notifications:Deliver ہونے تک + 7 دنUndelivered notifications محفوظ رہنی چاہئیں
exec:30 دنDebugging کے لیے Execution artifacts
skills:مستقلانسٹال شدہ skill metadata expire نہیں ہونی چاہیے
config:10 ورژنRollback کے لیے Rolling config history

ڈیزائن اصول

تمام Modules StorageProvider استعمال کرتے ہیں

Triggerfish میں کوئی بھی module اپنا storage mechanism نہیں بناتا۔ Session management، taint tracking، lineage recording، audit logging، cron state، notification queues، execution history، اور configuration — سب StorageProvider سے بہتے ہیں۔

اس کا مطلب ہے:

  • Backends swap کرنے کے لیے ایک dependency injection point تبدیل کرنا ضروری ہے
  • Tests speed کے لیے MemoryStorageProvider استعمال کرتے ہیں — کوئی SQLite setup، کوئی filesystem نہیں
  • Encryption-at-rest، backup، یا replication implement کرنے کی بالکل ایک جگہ ہے

Serialization

تمام structured ڈیٹا storage سے پہلے JSON strings میں serialize ہوتا ہے۔ serialize/deserialize پرت handle کرتی ہے:

  • Date objects (toISOString() کے ذریعے ISO 8601 strings کے طور پر serialize، new Date() کے ذریعے deserialize)
  • Branded types (ان کی underlying string value کے طور پر serialize)
  • Nested objects اور arrays
typescript
// ایک session store کرنا
const session = {
  id: "sess_abc",
  taint: "CONFIDENTIAL",
  createdAt: new Date(),
};
await storage.set("sessions:sess_abc", JSON.stringify(session));

// ایک session retrieve کرنا
const raw = await storage.get("sessions:sess_abc");
if (raw) {
  const session = JSON.parse(raw);
  session.createdAt = new Date(session.createdAt); // Date بحال کریں
}

Immutability

Session operations immutable ہیں۔ ایک session پڑھنا، اسے modify کرنا، اور واپس لکھنا ہمیشہ ایک نئی object بناتا ہے۔ Functions کبھی stored object کو in place mutate نہیں کرتے۔ یہ Triggerfish کے وسیع اصول سے ہم آہنگ ہے کہ functions نئی objects واپس کرتے ہیں اور کبھی mutate نہیں کرتے۔

Directory ساخت

~/.triggerfish/
  config/          # Agent configuration، SPINE.md، TRIGGER.md
  data/            # triggerfish.db (SQLite)
  workspace/       # Agent exec environment
    <agent-id>/    # Per-agent workspace (محفوظ رہتا ہے)
    background/    # Background session workspaces
  skills/          # انسٹال شدہ skills
  logs/            # Audit logs
  secrets/         # Encrypted credential store

سیکیورٹی secrets/ directory میں OS keychain integration کی طرف سے manage

کردہ encrypted credentials ہیں۔ Configuration files یا StorageProvider میں secrets کبھی store نہ کریں۔ OS keychain (personal tier) یا vault integration (enterprise tier) استعمال کریں۔ :::