import { Type } from "@sinclair/typebox"; import { NonEmptyString } from "./primitives.js"; const NodePendingWorkTypeSchema = Type.String({ enum: ["status.request", "location.request"], }); const NodePendingWorkPrioritySchema = Type.String({ enum: ["normal", "high"], }); export const NodePairRequestParamsSchema = Type.Object( { nodeId: NonEmptyString, displayName: Type.Optional(NonEmptyString), platform: Type.Optional(NonEmptyString), version: Type.Optional(NonEmptyString), coreVersion: Type.Optional(NonEmptyString), uiVersion: Type.Optional(NonEmptyString), deviceFamily: Type.Optional(NonEmptyString), modelIdentifier: Type.Optional(NonEmptyString), caps: Type.Optional(Type.Array(NonEmptyString)), commands: Type.Optional(Type.Array(NonEmptyString)), remoteIp: Type.Optional(NonEmptyString), silent: Type.Optional(Type.Boolean()), }, { additionalProperties: false }, ); export const NodePairListParamsSchema = Type.Object({}, { additionalProperties: false }); export const NodePairApproveParamsSchema = Type.Object( { requestId: NonEmptyString }, { additionalProperties: false }, ); export const NodePairRejectParamsSchema = Type.Object( { requestId: NonEmptyString }, { additionalProperties: false }, ); export const NodePairVerifyParamsSchema = Type.Object( { nodeId: NonEmptyString, token: NonEmptyString }, { additionalProperties: false }, ); export const NodeRenameParamsSchema = Type.Object( { nodeId: NonEmptyString, displayName: NonEmptyString }, { additionalProperties: false }, ); export const NodeListParamsSchema = Type.Object({}, { additionalProperties: false }); export const NodePendingAckParamsSchema = Type.Object( { ids: Type.Array(NonEmptyString, { minItems: 1 }), }, { additionalProperties: false }, ); export const NodeDescribeParamsSchema = Type.Object( { nodeId: NonEmptyString }, { additionalProperties: false }, ); export const NodeInvokeParamsSchema = Type.Object( { nodeId: NonEmptyString, command: NonEmptyString, params: Type.Optional(Type.Unknown()), timeoutMs: Type.Optional(Type.Integer({ minimum: 0 })), idempotencyKey: NonEmptyString, }, { additionalProperties: false }, ); export const NodeInvokeResultParamsSchema = Type.Object( { id: NonEmptyString, nodeId: NonEmptyString, ok: Type.Boolean(), payload: Type.Optional(Type.Unknown()), payloadJSON: Type.Optional(Type.String()), error: Type.Optional( Type.Object( { code: Type.Optional(NonEmptyString), message: Type.Optional(NonEmptyString), }, { additionalProperties: false }, ), ), }, { additionalProperties: false }, ); export const NodeEventParamsSchema = Type.Object( { event: NonEmptyString, payload: Type.Optional(Type.Unknown()), payloadJSON: Type.Optional(Type.String()), }, { additionalProperties: false }, ); export const NodePendingDrainParamsSchema = Type.Object( { maxItems: Type.Optional(Type.Integer({ minimum: 1, maximum: 10 })), }, { additionalProperties: false }, ); export const NodePendingDrainItemSchema = Type.Object( { id: NonEmptyString, type: NodePendingWorkTypeSchema, priority: Type.String({ enum: ["default", "normal", "high"] }), createdAtMs: Type.Integer({ minimum: 0 }), expiresAtMs: Type.Optional(Type.Union([Type.Integer({ minimum: 0 }), Type.Null()])), payload: Type.Optional(Type.Record(Type.String(), Type.Unknown())), }, { additionalProperties: false }, ); export const NodePendingDrainResultSchema = Type.Object( { nodeId: NonEmptyString, revision: Type.Integer({ minimum: 0 }), items: Type.Array(NodePendingDrainItemSchema), hasMore: Type.Boolean(), }, { additionalProperties: false }, ); export const NodePendingEnqueueParamsSchema = Type.Object( { nodeId: NonEmptyString, type: NodePendingWorkTypeSchema, priority: Type.Optional(NodePendingWorkPrioritySchema), expiresInMs: Type.Optional(Type.Integer({ minimum: 1_000, maximum: 86_400_000 })), wake: Type.Optional(Type.Boolean()), }, { additionalProperties: false }, ); export const NodePendingEnqueueResultSchema = Type.Object( { nodeId: NonEmptyString, revision: Type.Integer({ minimum: 0 }), queued: NodePendingDrainItemSchema, wakeTriggered: Type.Boolean(), }, { additionalProperties: false }, ); export const NodeInvokeRequestEventSchema = Type.Object( { id: NonEmptyString, nodeId: NonEmptyString, command: NonEmptyString, paramsJSON: Type.Optional(Type.String()), timeoutMs: Type.Optional(Type.Integer({ minimum: 0 })), idempotencyKey: Type.Optional(NonEmptyString), }, { additionalProperties: false }, );