fix(sdk): preserve nullable Kilo gateway fields

This commit is contained in:
marius-kilocode
2026-06-03 13:36:08 +02:00
parent cdf46c9735
commit fc4cf10b0a
5 changed files with 173 additions and 48 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"@kilocode/sdk": patch
---
Preserve nullable Kilo gateway response fields in the generated TypeScript SDK.
@@ -49,6 +49,26 @@ export function matchLegacyKiloOpenApi(input: Record<string, unknown>) {
const props = ref ? spec.components?.schemas?.[ref]?.properties : body?.properties
if (props?.organizationId) props.organizationId = nullable(props.organizationId)
const json = (path: string) => spec.paths?.[path]?.get?.responses?.["200"]?.content?.["application/json"]
const profile = json("/kilo/profile")?.schema?.properties
if (profile?.balance) profile.balance = nullable(profile.balance)
if (profile?.currentOrgId) profile.currentOrgId = nullable(profile.currentOrgId)
const sessions = json("/kilo/cloud-sessions")?.schema?.properties
const session = sessions?.cliSessions?.items?.properties
if (session?.title) session.title = nullable(session.title)
if (sessions?.nextCursor) sessions.nextCursor = nullable(sessions.nextCursor)
const claw = json("/kilo/claw/status")?.schema?.properties
if (claw?.status) claw.status = nullable(claw.status)
if (claw?.openclawVersion) claw.openclawVersion = nullable(claw.openclawVersion)
if (claw?.lastStartedAt) claw.lastStartedAt = nullable(claw.lastStartedAt)
if (claw?.lastStoppedAt) claw.lastStoppedAt = nullable(claw.lastStoppedAt)
if (claw?.botName) claw.botName = nullable(claw.botName)
const credentials = json("/kilo/claw/chat-credentials")
if (credentials?.schema) credentials.schema = nullable(credentials.schema)
const provider = spec.components?.schemas?.Config?.properties?.provider
if (provider?.additionalProperties && typeof provider.additionalProperties === "object")
provider.additionalProperties = nullable(provider.additionalProperties)
@@ -6,6 +6,7 @@ import { PublicApi } from "../../../src/server/routes/instance/httpapi/public"
type Schema = {
anyOf?: Schema[]
items?: Schema
properties?: Record<string, Schema>
type?: string
minLength?: number
@@ -51,6 +52,34 @@ describe("Kilo PublicApi OpenAPI contract", () => {
expect(props?.organizationId).toEqual({ anyOf: [{ type: "string" }, { type: "null" }] })
})
test("keeps Kilo gateway responses nullable", () => {
const spec = OpenApi.fromApi(PublicApi)
const response = (path: string) => {
const body = spec.paths[path]?.get?.responses?.["200"] as Body | undefined
return body?.content?.["application/json"]?.schema
}
const profile = response(KiloGatewayPaths.profile)?.properties
expect(profile?.balance).toEqual({ anyOf: [expect.objectContaining({ type: "object" }), { type: "null" }] })
expect(profile?.currentOrgId).toEqual({ anyOf: [{ type: "string" }, { type: "null" }] })
const sessions = response(KiloGatewayPaths.cloudSessions)?.properties
expect(sessions?.cliSessions?.items?.properties?.title).toEqual({
anyOf: [{ type: "string" }, { type: "null" }],
})
expect(sessions?.nextCursor).toEqual({ anyOf: [{ type: "string" }, { type: "null" }] })
const claw = response(KiloGatewayPaths.clawStatus)?.properties
expect(claw?.status).toEqual({ anyOf: [expect.objectContaining({ type: "string" }), { type: "null" }] })
for (const field of ["openclawVersion", "lastStartedAt", "lastStoppedAt", "botName"]) {
expect(claw?.[field]).toEqual({ anyOf: [{ type: "string" }, { type: "null" }] })
}
expect(response(KiloGatewayPaths.clawChatCredentials)).toEqual({
anyOf: [expect.objectContaining({ type: "object" }), { type: "null" }],
})
})
test("keeps transcription prompts in the public contract", () => {
const spec = OpenApi.fromApi(PublicApi)
const body = spec.paths[KiloGatewayPaths.audioTranscriptions]?.post?.requestBody as Body | undefined
+10 -9
View File
@@ -8268,8 +8268,8 @@ export type KiloProfileResponses = {
}
balance: {
balance: number
}
currentOrgId: string
} | null
currentOrgId: string | null
}
}
@@ -8557,19 +8557,20 @@ export type KiloClawStatusResponses = {
| "stopped"
| "destroying"
| "restoring"
| null
sandboxId?: string
flyRegion?: string
machineSize?: {
cpus: number
memory_mb: number
}
openclawVersion?: string
lastStartedAt?: string
lastStoppedAt?: string
openclawVersion?: string | null
lastStartedAt?: string | null
lastStoppedAt?: string | null
channelCount?: number
secretCount?: number
userId?: string
botName?: string
botName?: string | null
}
}
@@ -8594,7 +8595,7 @@ export type KiloClawChatCredentialsResponses = {
expiresAt: string
kiloChatUrl: string
eventServiceUrl: string
}
} | null
}
export type KiloClawChatCredentialsResponse = KiloClawChatCredentialsResponses[keyof KiloClawChatCredentialsResponses]
@@ -8628,12 +8629,12 @@ export type KiloCloudSessionsResponses = {
200: {
cliSessions: Array<{
session_id: string
title: string
title: string | null
created_at: string
updated_at: string
version: number
}>
nextCursor: string
nextCursor: string | null
}
}
+109 -39
View File
@@ -10950,17 +10950,31 @@
"additionalProperties": false
},
"balance": {
"type": "object",
"properties": {
"balance": {
"type": "number"
"anyOf": [
{
"type": "object",
"properties": {
"balance": {
"type": "number"
}
},
"required": ["balance"],
"additionalProperties": false
},
{
"type": "null"
}
},
"required": ["balance"],
"additionalProperties": false
]
},
"currentOrgId": {
"type": "string"
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": ["profile", "balance", "currentOrgId"],
@@ -11712,16 +11726,23 @@
"type": "object",
"properties": {
"status": {
"type": "string",
"enum": [
"provisioned",
"starting",
"restarting",
"recovering",
"running",
"stopped",
"destroying",
"restoring"
"anyOf": [
{
"type": "string",
"enum": [
"provisioned",
"starting",
"restarting",
"recovering",
"running",
"stopped",
"destroying",
"restoring"
]
},
{
"type": "null"
}
]
},
"sandboxId": {
@@ -11744,13 +11765,34 @@
"additionalProperties": false
},
"openclawVersion": {
"type": "string"
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"lastStartedAt": {
"type": "string"
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"lastStoppedAt": {
"type": "string"
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"channelCount": {
"type": "number"
@@ -11762,7 +11804,14 @@
"type": "string"
},
"botName": {
"type": "string"
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": ["status"],
@@ -11821,23 +11870,30 @@
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"token": {
"type": "string"
"anyOf": [
{
"type": "object",
"properties": {
"token": {
"type": "string"
},
"expiresAt": {
"type": "string"
},
"kiloChatUrl": {
"type": "string"
},
"eventServiceUrl": {
"type": "string"
}
},
"required": ["token", "expiresAt", "kiloChatUrl", "eventServiceUrl"],
"additionalProperties": false
},
"expiresAt": {
"type": "string"
},
"kiloChatUrl": {
"type": "string"
},
"eventServiceUrl": {
"type": "string"
{
"type": "null"
}
},
"required": ["token", "expiresAt", "kiloChatUrl", "eventServiceUrl"],
"additionalProperties": false
]
}
}
}
@@ -11916,7 +11972,14 @@
"type": "string"
},
"title": {
"type": "string"
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"created_at": {
"type": "string"
@@ -11933,7 +11996,14 @@
}
},
"nextCursor": {
"type": "string"
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": ["cliSessions", "nextCursor"],