import { Type } from "@sinclair/typebox"; import { NonEmptyString } from "./primitives.js"; export const PresenceEntrySchema = Type.Object( { host: Type.Optional(NonEmptyString), ip: Type.Optional(NonEmptyString), version: Type.Optional(NonEmptyString), platform: Type.Optional(NonEmptyString), deviceFamily: Type.Optional(NonEmptyString), modelIdentifier: Type.Optional(NonEmptyString), mode: Type.Optional(NonEmptyString), lastInputSeconds: Type.Optional(Type.Integer({ minimum: 0 })), reason: Type.Optional(NonEmptyString), tags: Type.Optional(Type.Array(NonEmptyString)), text: Type.Optional(Type.String()), ts: Type.Integer({ minimum: 0 }), deviceId: Type.Optional(NonEmptyString), roles: Type.Optional(Type.Array(NonEmptyString)), scopes: Type.Optional(Type.Array(NonEmptyString)), instanceId: Type.Optional(NonEmptyString), }, { additionalProperties: false }, ); export const HealthSnapshotSchema = Type.Any(); export const SessionDefaultsSchema = Type.Object( { defaultAgentId: NonEmptyString, mainKey: NonEmptyString, mainSessionKey: NonEmptyString, scope: Type.Optional(NonEmptyString), }, { additionalProperties: false }, ); export const StateVersionSchema = Type.Object( { presence: Type.Integer({ minimum: 0 }), health: Type.Integer({ minimum: 0 }), }, { additionalProperties: false }, ); export const SnapshotSchema = Type.Object( { presence: Type.Array(PresenceEntrySchema), health: HealthSnapshotSchema, stateVersion: StateVersionSchema, uptimeMs: Type.Integer({ minimum: 0 }), configPath: Type.Optional(NonEmptyString), stateDir: Type.Optional(NonEmptyString), sessionDefaults: Type.Optional(SessionDefaultsSchema), }, { additionalProperties: false }, );