| import { promises as fs } from "node:fs"; |
| import path from "node:path"; |
| import { fileURLToPath } from "node:url"; |
| import { ProtocolSchemas } from "../src/gateway/protocol/schema.js"; |
|
|
| const __dirname = path.dirname(fileURLToPath(import.meta.url)); |
| const repoRoot = path.resolve(__dirname, ".."); |
|
|
| async function writeJsonSchema() { |
| const definitions: Record<string, unknown> = {}; |
| for (const [name, schema] of Object.entries(ProtocolSchemas)) { |
| definitions[name] = schema; |
| } |
|
|
| const rootSchema = { |
| $schema: "http://json-schema.org/draft-07/schema#", |
| $id: "https://openclaw.ai/protocol.schema.json", |
| title: "OpenClaw Gateway Protocol", |
| description: "Handshake, request/response, and event frames for the Gateway WebSocket.", |
| oneOf: [ |
| { $ref: "#/definitions/RequestFrame" }, |
| { $ref: "#/definitions/ResponseFrame" }, |
| { $ref: "#/definitions/EventFrame" }, |
| ], |
| discriminator: { |
| propertyName: "type", |
| mapping: { |
| req: "#/definitions/RequestFrame", |
| res: "#/definitions/ResponseFrame", |
| event: "#/definitions/EventFrame", |
| }, |
| }, |
| definitions, |
| }; |
|
|
| const distDir = path.join(repoRoot, "dist"); |
| await fs.mkdir(distDir, { recursive: true }); |
| const jsonSchemaPath = path.join(distDir, "protocol.schema.json"); |
| await fs.writeFile(jsonSchemaPath, JSON.stringify(rootSchema, null, 2)); |
| console.log(`wrote ${jsonSchemaPath}`); |
| return { jsonSchemaPath, schemaString: JSON.stringify(rootSchema) }; |
| } |
|
|
| async function main() { |
| await writeJsonSchema(); |
| } |
|
|
| main().catch((err) => { |
| console.error(err); |
| process.exit(1); |
| }); |
|
|