Skip to main content

Protokol için doğruluk kaynağı olarak TypeBox

Son güncelleme: 2026-01-10 TypeBox, TypeScript öncelikli bir şema kütüphanesidir. Bunu Gateway WebSocket protokolünü (el sıkışma, istek/yanıt, sunucu olayları) tanımlamak için kullanıyoruz. Bu şemalar çalışma zamanı doğrulamasını, JSON Schema dışa aktarımını ve macOS uygulaması için Swift codegen’i yönlendirir. Tek bir doğruluk kaynağı vardır; diğer her şey buradan üretilir. Daha üst düzey protokol bağlamı için Gateway architecture ile başlayın.

Zihinsel model (30 saniye)

Her Gateway WS mesajı üç çerçeveden (frame) biridir:
  • İstek: { type: "req", id, method, params }
  • Yanıt: { type: "res", id, ok, payload | error }
  • Olay: { type: "event", event, payload, seq?, stateVersion? }
İlk çerçeve mutlaka bir connect isteği olmalıdır. Bundan sonra istemciler metotları çağırabilir (örn. health, send, chat.send) ve olaylara abone olabilir (örn. presence, tick, agent). Bağlantı akışı (asgari):
Yaygın metotlar + olaylar: Yetkili liste src/gateway/server.ts’te bulunur (METHODS, EVENTS).

Where the schemas live

  • Kaynak: src/gateway/protocol/schema.ts
  • Çalışma zamanı doğrulayıcıları (AJV): src/gateway/protocol/index.ts
  • Sunucu el sıkışması + metot yönlendirme: src/gateway/server.ts
  • Node istemcisi: src/gateway/client.ts
  • Üretilmiş JSON Schema: dist/protocol.schema.json
  • Üretilmiş Swift modelleri: apps/macos/Sources/OpenClawProtocol/GatewayModels.swift

Mevcut boru hattı

  • pnpm protocol:gen
    • JSON Schema’yı (draft‑07) dist/protocol.schema.json’e yazar
  • pnpm protocol:gen:swift
    • Swift gateway modellerini üretir
  • pnpm protocol:check
    • her iki üreticiyi de çalıştırır ve çıktının commit edildiğini doğrular

How the schemas are used at runtime

  • Sunucu tarafı: gelen her çerçeve AJV ile doğrulanır. El sıkışma yalnızca parametreleri ConnectParams ile eşleşen bir connect isteğini kabul eder.
  • İstemci tarafı: JS istemcisi, olay ve yanıt çerçevelerini kullanmadan önce doğrular.
  • Metot yüzeyi: Gateway, desteklenen methods ve events’ü hello-ok içinde ilan eder.

Örnek çerçeveler

Bağlan (ilk mesaj):
Hello-ok yanıtı:
İstek + yanıt:
Olay:

Minimal istemci (Node.js)

En küçük kullanışlı akış: bağlan + health.

Worked example: add a method end‑to‑end

Örnek: { ok: true, text } döndüren yeni bir system.echo isteği ekleyin.
  1. Şema (doğruluk kaynağı)
src/gateway/protocol/schema.ts’e ekleyin:
Her ikisini de ProtocolSchemas’e ekleyin ve türleri dışa aktarın:
  1. Doğrulama
src/gateway/protocol/index.ts içinde bir AJV doğrulayıcısı dışa aktarın:
  1. Sunucu davranışı
src/gateway/server-methods/system.ts’e bir handler ekleyin:
Bunu src/gateway/server-methods.ts’de kaydedin (systemHandlers’ü zaten birleştirir), ardından src/gateway/server.ts içindeki METHODS’e "system.echo" ekleyin.
  1. Yeniden üret
  1. Testler + dokümanlar
src/gateway/server.*.test.ts içinde bir sunucu testi ekleyin ve metodu dokümanlarda belirtin.

Swift codegen davranışı

Swift üreticisi şunları üretir:
  • req, res, event ve unknown durumlarını içeren bir GatewayFrame enum’u
  • Güçlü tiplenmiş payload struct/enum’ları
  • ErrorCode değerleri ve GATEWAY_PROTOCOL_VERSION
Bilinmeyen çerçeve türleri, ileriye dönük uyumluluk için ham payload’lar olarak korunur.

Sürümleme + uyumluluk

  • PROTOCOL_VERSION, src/gateway/protocol/schema.ts içinde bulunur.
  • İstemciler minProtocol + maxProtocol gönderir; sunucu uyumsuzlukları reddeder.
  • Swift modelleri, eski istemcilerin bozulmasını önlemek için bilinmeyen çerçeve türlerini saklar.

Schema patterns and conventions

  • Çoğu nesne, katı payload’lar için additionalProperties: false kullanır.
  • Kimlikler ve metot/olay adları için varsayılan NonEmptyString’dır.
  • En üst düzey GatewayFrame, type üzerinde bir discriminator kullanır.
  • Yan etkili metotlar genellikle parametrelerde bir idempotencyKey gerektirir (örnek: send, poll, agent, chat.send).

Canlı şema JSON’u

Üretilmiş JSON Schema, repoda dist/protocol.schema.json yolunda bulunur. Yayımlanan ham dosya genellikle şurada mevcuttur:

When you change schemas

  1. TypeBox şemalarını güncelleyin.
  2. pnpm protocol:check çalıştırın.
  3. Yeniden üretilmiş şemayı + Swift modellerini commit edin.