Skip to main content
TypeBox adalah pustaka skema yang mengutamakan TypeScript. OpenClaw menggunakannya untuk mendefinisikan protokol WebSocket Gateway (handshake, permintaan/respons, peristiwa server). Skema tersebut menggerakkan validasi runtime (AJV), ekspor JSON Schema, dan pembuatan kode Swift untuk aplikasi macOS. Satu sumber kebenaran; semua yang lain dihasilkan darinya. Untuk konteks protokol tingkat lebih tinggi, mulailah dengan arsitektur Gateway.

Model mental (30 detik)

Setiap pesan WS Gateway merupakan salah satu dari tiga frame:
  • Permintaan: { type: "req", id, method, params }
  • Respons: { type: "res", id, ok, payload | error }
  • Peristiwa: { type: "event", event, payload, seq?, stateVersion? }
Frame pertama harus berupa permintaan connect. Setelah itu, klien memanggil metode (misalnya health, send, chat.send) dan berlangganan peristiwa (misalnya presence, tick, agent). Alur koneksi (minimal):
Metode dan peristiwa umum: Inventaris penemuan resmi yang diumumkan berada di src/gateway/server-methods-list.ts (listGatewayMethods, GATEWAY_EVENTS).

Lokasi skema

  • Barrel sumber: packages/gateway-protocol/src/schema.ts mengekspor ulang modul domain di bawah packages/gateway-protocol/src/schema/*.ts (frames.ts untuk envelope tingkat atas dan handshake, serta agent.ts, sessions.ts, cron.ts, dan sebagainya untuk setiap area fitur). protocol-schemas.ts adalah registri pusat ProtocolSchemas yang memetakan nama skema ke definisi TypeBox-nya.
  • Validator runtime (AJV): packages/gateway-protocol/src/index.ts
  • Registri fitur/penemuan yang diumumkan: src/gateway/server-methods-list.ts
  • Handshake server dan pengiriman metode: src/gateway/server.impl.ts
  • Klien Node: src/gateway/client.ts
  • JSON Schema yang dihasilkan: dist/protocol.schema.json (keluaran build, tidak di-commit)
  • Model Swift yang dihasilkan: apps/shared/OpenClawKit/Sources/OpenClawProtocol/GatewayModels.swift

Alur saat ini

  • pnpm protocol:gen menulis JSON Schema (draft-07) ke dist/protocol.schema.json.
  • pnpm protocol:gen:swift menghasilkan model Gateway Swift.
  • pnpm protocol:check menjalankan kedua generator dan memverifikasi bahwa keluaran Swift telah di-commit (keluaran JSON Schema adalah artefak build yang diabaikan Git).

Cara skema digunakan saat runtime

  • Sisi server: setiap frame masuk divalidasi dengan AJV. Handshake hanya menerima permintaan connect yang parameternya cocok dengan ConnectParams.
  • Sisi klien: klien JS memvalidasi frame peristiwa dan respons sebelum menggunakannya.
  • Penemuan fitur: Gateway mengirim daftar konservatif features.methods dan features.events dalam hello-ok, dari listGatewayMethods() dan GATEWAY_EVENTS.
  • Daftar penemuan tersebut bukan hasil pembuatan otomatis yang memuat setiap helper yang dapat dipanggil dalam coreGatewayHandlers; beberapa RPC helper diterapkan dalam src/gateway/server-methods/*.ts tanpa dicantumkan dalam daftar fitur yang diumumkan.

Contoh frame

Koneksi (pesan pertama):
Respons hello-ok:
Permintaan dan respons:
Peristiwa:

Klien minimal (Node.js)

Alur berguna paling sederhana: koneksi + pemeriksaan kesehatan.

Contoh lengkap: menambahkan metode dari awal hingga akhir

Contoh: tambahkan permintaan system.echo baru yang mengembalikan { ok: true, text }.
  1. Skema (sumber kebenaran)
Tambahkan ke packages/gateway-protocol/src/schema/system.ts (atau modul fitur terdekat yang sesuai):
Impor keduanya ke packages/gateway-protocol/src/schema/protocol-schemas.ts, tambahkan ke registri ProtocolSchemas, lalu ekspor tipe turunannya:
  1. Validasi
Di packages/gateway-protocol/src/index.ts, ekspor validator AJV:
  1. Perilaku server
Tambahkan handler di src/gateway/server-methods/system.ts:
Daftarkan di src/gateway/server-methods.ts (yang sudah menggabungkan systemHandlers), lalu tambahkan "system.echo" ke input listGatewayMethods di src/gateway/server-methods-list.ts. Jika metode tersebut dapat dipanggil oleh klien operator atau node, klasifikasikan juga di src/gateway/method-scopes.ts agar penerapan cakupan dan pengumuman fitur hello-ok tetap selaras.
  1. Buat ulang
  1. Pengujian dan dokumentasi
Tambahkan pengujian server di src/gateway/server.*.test.ts dan catat metode tersebut dalam dokumentasi.

Perilaku pembuatan kode Swift

Generator Swift menghasilkan:
  • enum GatewayFrame dengan kasus req, res, event, dan unknown
  • struct/enum payload dengan tipe yang kuat
  • nilai ErrorCode, GATEWAY_PROTOCOL_VERSION, dan GATEWAY_MIN_PROTOCOL_VERSION
Jenis frame yang tidak dikenal dipertahankan sebagai payload mentah untuk kompatibilitas ke depan.

Pembuatan versi dan kompatibilitas

  • PROTOCOL_VERSION berada di packages/gateway-protocol/src/version.ts (nilai saat ini: 4).
  • Klien mengirim minProtocol dan maxProtocol; server menolak rentang yang tidak mencakup protokolnya saat ini.
  • Model Swift mempertahankan jenis frame yang tidak dikenal agar tidak merusak klien lama.

Pola dan konvensi skema

  • Sebagian besar objek menggunakan additionalProperties: false untuk payload yang ketat.
  • NonEmptyString (Type.String({ minLength: 1 })) adalah nilai baku untuk ID serta nama metode/peristiwa.
  • GatewayFrame tingkat atas menggunakan diskriminator pada type.
  • Metode dengan efek samping biasanya memerlukan idempotencyKey dalam parameter (contoh: send, poll, agent, chat.send).
  • agent menerima internalEvents opsional untuk konteks orkestrasi yang dihasilkan runtime (misalnya serah terima penyelesaian tugas subagen/cron); perlakukan ini sebagai permukaan API internal.

JSON skema langsung

JSON Schema yang dihasilkan adalah artefak build dan tidak di-commit ke repositori. Berkas mentah yang dipublikasikan biasanya tersedia di:

Saat Anda mengubah skema

  1. Perbarui skema TypeBox dalam modul pemilik packages/gateway-protocol/src/schema/*.ts dan daftarkan di protocol-schemas.ts.
  2. Daftarkan metode/peristiwa di src/gateway/server-methods-list.ts.
  3. Perbarui src/gateway/method-scopes.ts ketika RPC baru memerlukan klasifikasi cakupan operator atau node.
  4. Jalankan pnpm protocol:check.
  5. Commit model Swift yang dibuat ulang.

Terkait