TypeBox là nguồn sự thật cho giao thức
Cập nhật lần cuối: 2026-01-10 TypeBox là một thư viện schema ưu tiên TypeScript. Chúng tôi dùng nó để định nghĩa giao thức Gateway WebSocket (bắt tay, yêu cầu/phản hồi, sự kiện máy chủ). Các schema đó thúc đẩy xác thực thời gian chạy, xuất JSON Schema và sinh mã Swift cho ứng dụng macOS. Một nguồn sự thật; mọi thứ khác đều được sinh ra. Nếu bạn muốn bối cảnh giao thức ở mức cao hơn, hãy bắt đầu với Kiến trúc Gateway.Mô hình tư duy (30 giây)
Mỗi thông điệp WS của Gateway là một trong ba frame:- Request:
{ type: "req", id, method, params } - Response:
{ type: "res", id, ok, payload | error } - Event:
{ type: "event", event, payload, seq?, stateVersion? }Khung đầu tiên phải là một yêu cầuconnect.
health, send, chat.send) và đăng ký sự kiện (ví dụ:
presence, tick, agent). Phía máy chủ: mọi khung đến đều được xác thực bằng AJV.
Luồng kết nối (tối thiểu):
| Danh mục | Ví dụ | Ghi chú |
|---|---|---|
| Core | connect, health, status | connect phải là đầu tiên |
| Messaging | send, poll, agent, agent.wait | tác dụng phụ cần idempotencyKey |
| Chat | chat.history, chat.send, chat.abort, chat.inject | WebChat dùng các mục này |
| Sessions | sessions.list, sessions.patch, sessions.delete | quản trị phiên |
| Nodes | node.list, node.invoke, node.pair.* | Gateway WS + hành động node |
| Events | tick, presence, agent, chat, health, shutdown | server push |
src/gateway/server.ts (METHODS, EVENTS).
Nơi đặt các schema
- Nguồn:
src/gateway/protocol/schema.ts - Trình xác thực lúc chạy (AJV):
src/gateway/protocol/index.ts - Bắt tay máy chủ + điều phối method:
src/gateway/server.ts - Client node:
src/gateway/client.ts - JSON Schema được sinh:
dist/protocol.schema.json - Model Swift được sinh:
apps/macos/Sources/OpenClawProtocol/GatewayModels.swift
Pipeline hiện tại
pnpm protocol:gen- ghi JSON Schema (draft‑07) vào
dist/protocol.schema.json
- ghi JSON Schema (draft‑07) vào
pnpm protocol:gen:swift- sinh các model Gateway cho Swift
pnpm protocol:check- chạy cả hai bộ sinh và xác minh đầu ra đã được commit
Cách các schema được dùng lúc chạy
- Bắt tay chỉ
chấp nhận một yêu cầu
connectcó params khớp vớiConnectParams. JSON Schema được sinh ra nằm trong repo tạidist/protocol.schema.json. - Phía client: client JS xác thực các frame sự kiện và phản hồi trước khi sử dụng chúng.
- Bề mặt method: Gateway công bố các
methodsvàeventsđược hỗ trợ tronghello-ok.
Ví dụ frame
Kết nối (thông điệp đầu tiên):Client tối thiểu (Node.js)
Luồng nhỏ nhất hữu ích: kết nối + health.Ví dụ hoàn chỉnh: thêm một method từ đầu đến cuối
Ví dụ: thêm một requestsystem.echo mới trả về { ok: true, text }.
- Schema (nguồn sự thật)
src/gateway/protocol/schema.ts:
ProtocolSchemas và export type:
- Xác thực
src/gateway/protocol/index.ts, export một trình xác thực AJV:
- Hành vi máy chủ
src/gateway/server-methods/system.ts:
src/gateway/server-methods.ts (đã gộp systemHandlers),
sau đó thêm "system.echo" vào METHODS trong src/gateway/server.ts.
- Sinh lại
- Kiểm thử + tài liệu
src/gateway/server.*.test.ts và ghi chú method trong tài liệu.
Hành vi codegen Swift
Bộ sinh Swift phát ra:- enum
GatewayFramevới các casereq,res,event, vàunknown - Các struct/enum payload được gõ kiểu chặt chẽ
- Các giá trị
ErrorCodevàGATEWAY_PROTOCOL_VERSION
Phiên bản + khả năng tương thích
PROTOCOL_VERSIONnằm trongsrc/gateway/protocol/schema.ts.- Client gửi
minProtocol+maxProtocol; máy chủ từ chối nếu không khớp. - Các model Swift giữ lại các loại frame không xác định để tránh làm hỏng client cũ.
Mẫu schema và quy ước
- Hầu hết các object dùng
additionalProperties: falsecho payload chặt chẽ. NonEmptyStringlà mặc định cho ID và tên method/event.GatewayFramecấp cao nhất dùng discriminator trêntype.- Các method có tác dụng phụ thường yêu cầu một
idempotencyKeytrong params (ví dụ:send,poll,agent,chat.send).
JSON schema trực tiếp
Tệp thô đã phát hành thường có sẵn tại: Chỉ báo đang gõ được gửi tới kênh chat trong khi một lần chạy đang hoạt động.Khi bạn thay đổi schema
- Cập nhật các schema TypeBox.
- Chạy
pnpm protocol:check. - Commit schema và các model Swift đã được sinh lại.