UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

633 lines (632 loc) • 27.6 kB
import { t as closedObject } from "./closed-object-DGvQfpTV.mjs"; import { a as NonEmptyString, o as SecretInputSchema } from "./primitives-CWzZQjw3.mjs"; import { t as GatewayEventLoopHealthSchema } from "./runtime-vitals-BAzwMWci.mjs"; import { Type } from "typebox"; //#region packages/gateway-protocol/src/schema/channels.ts /** * Channel and Talk protocol schemas. * * Talk schemas are consumed by browser realtime clients, gateway relay sessions, * and channel adapters, so the mode/transport/brain unions below are shared * API vocabulary rather than provider-local implementation details. */ /** Toggles Talk mode for the gateway, with an optional rollout phase marker. */ const TalkModeParamsSchema = closedObject({ enabled: Type.Boolean(), phase: Type.Optional(Type.String()) }); /** Reads Talk configuration; secrets are included only for trusted callers. */ const TalkConfigParamsSchema = closedObject({ includeSecrets: Type.Optional(Type.Boolean()) }); /** One-shot text-to-speech request with provider-specific voice tuning knobs. */ const TalkSpeakParamsSchema = closedObject({ text: NonEmptyString, voiceId: Type.Optional(Type.String()), modelId: Type.Optional(Type.String()), outputFormat: Type.Optional(Type.String()), speed: Type.Optional(Type.Number()), rateWpm: Type.Optional(Type.Integer({ minimum: 1 })), stability: Type.Optional(Type.Number()), similarity: Type.Optional(Type.Number()), style: Type.Optional(Type.Number()), speakerBoost: Type.Optional(Type.Boolean()), seed: Type.Optional(Type.Integer({ minimum: 0 })), normalize: Type.Optional(Type.String()), language: Type.Optional(Type.String()), latencyTier: Type.Optional(Type.Integer({ minimum: 0 })) }); /** * One-shot text-to-speech request rendered with the configured TTS provider * chain (unlike `talk.speak`, which pins the Talk-mode provider). */ const TtsSpeakParamsSchema = closedObject({ text: NonEmptyString }); /** Supported Talk session shapes exposed to clients and providers. */ const TalkModeSchema = Type.Union([ Type.Literal("realtime"), Type.Literal("stt-tts"), Type.Literal("transcription") ]); /** Transport families; browser clients branch on this value to choose setup flow. */ const TalkTransportSchema = Type.Union([ Type.Literal("webrtc"), Type.Literal("provider-websocket"), Type.Literal("gateway-relay"), Type.Literal("managed-room") ]); /** How a Talk session delegates reasoning/tool use to the agent runtime. */ const TalkBrainSchema = Type.Union([ Type.Literal("agent-consult"), Type.Literal("direct-tools"), Type.Literal("none") ]); /** Agent control actions accepted from Talk clients and managed rooms. */ const TalkAgentControlModeSchema = Type.Union([ Type.Literal("status"), Type.Literal("steer"), Type.Literal("cancel"), Type.Literal("followup") ]); /** Stable event names emitted by Talk sessions across providers/transports. */ const TalkEventTypeSchema = Type.Union([ Type.Literal("session.started"), Type.Literal("session.ready"), Type.Literal("session.closed"), Type.Literal("session.error"), Type.Literal("session.replaced"), Type.Literal("turn.started"), Type.Literal("turn.ended"), Type.Literal("turn.cancelled"), Type.Literal("capture.started"), Type.Literal("capture.stopped"), Type.Literal("capture.cancelled"), Type.Literal("capture.once"), Type.Literal("input.audio.delta"), Type.Literal("input.audio.committed"), Type.Literal("transcript.delta"), Type.Literal("transcript.done"), Type.Literal("output.text.delta"), Type.Literal("output.text.done"), Type.Literal("output.audio.started"), Type.Literal("output.audio.delta"), Type.Literal("output.audio.done"), Type.Literal("tool.call"), Type.Literal("tool.progress"), Type.Literal("tool.result"), Type.Literal("tool.error"), Type.Literal("usage.metrics"), Type.Literal("latency.metrics"), Type.Literal("health.changed") ]); /** Event types that must carry a turn id for client-side stream correlation. */ const TURN_SCOPED_TALK_EVENT_TYPES = [ "turn.started", "turn.ended", "turn.cancelled", "input.audio.delta", "input.audio.committed", "transcript.delta", "transcript.done", "output.text.delta", "output.text.done", "output.audio.started", "output.audio.delta", "output.audio.done", "tool.call", "tool.progress", "tool.result", "tool.error" ]; /** Capture lifecycle events must include capture id to avoid cross-turn ambiguity. */ const CAPTURE_SCOPED_TALK_EVENT_TYPES = [ "capture.started", "capture.stopped", "capture.cancelled", "capture.once" ]; /** Builds JSON Schema conditional requirements while avoiding reserved word syntax. */ function requireJsonSchemaProperties(properties) { const conditionalRequirementKey = ["th", "en"].join(""); return Object.fromEntries([[conditionalRequirementKey, { required: properties }]]); } /** Canonical Talk event envelope emitted to browser, relay, and channel consumers. */ const TalkEventSchema = Type.Object({ id: NonEmptyString, type: TalkEventTypeSchema, sessionId: NonEmptyString, turnId: Type.Optional(Type.String()), captureId: Type.Optional(Type.String()), seq: Type.Integer({ minimum: 1 }), timestamp: NonEmptyString, mode: TalkModeSchema, transport: TalkTransportSchema, brain: TalkBrainSchema, provider: Type.Optional(Type.String()), final: Type.Optional(Type.Boolean()), callId: Type.Optional(Type.String()), itemId: Type.Optional(Type.String()), parentId: Type.Optional(Type.String()), payload: Type.Unknown() }, { additionalProperties: false, allOf: [{ if: { properties: { type: { enum: TURN_SCOPED_TALK_EVENT_TYPES } }, required: ["type"] }, ...requireJsonSchemaProperties(["turnId"]) }, { if: { properties: { type: { enum: CAPTURE_SCOPED_TALK_EVENT_TYPES } }, required: ["type"] }, ...requireJsonSchemaProperties(["captureId"]) }] }); const VoiceIdString = Type.String({ pattern: "^[A-Za-z0-9_-]{1,128}$" }); /** Creates a browser-facing Talk client session. */ const TalkClientCreateParamsSchema = closedObject({ sessionKey: Type.Optional(NonEmptyString), voiceSessionId: Type.Optional(VoiceIdString), voiceChangeId: Type.Optional(NonEmptyString), provider: Type.Optional(Type.String()), model: Type.Optional(Type.String()), voice: Type.Optional(Type.String()), vadThreshold: Type.Optional(Type.Number()), silenceDurationMs: Type.Optional(Type.Integer({ minimum: 1 })), prefixPaddingMs: Type.Optional(Type.Integer({ minimum: 0 })), reasoningEffort: Type.Optional(Type.String()), mode: Type.Optional(TalkModeSchema), transport: Type.Optional(TalkTransportSchema), brain: Type.Optional(TalkBrainSchema), capabilities: Type.Optional(Type.Array(Type.Union([ Type.Literal("camera-frame"), Type.Literal("voice-transcript"), Type.Literal("gateway-control-v1"), Type.Literal("voice-selection") ]), { uniqueItems: true })) }); /** Tool-call request from a browser/client session back into the agent runtime. */ const TalkClientToolCallParamsSchema = closedObject({ sessionKey: NonEmptyString, voiceSessionId: Type.Optional(VoiceIdString), callId: NonEmptyString, name: NonEmptyString, args: Type.Optional(Type.Unknown()), relaySessionId: Type.Optional(NonEmptyString) }); /** One finalized transcript item from a client-owned Talk session. */ const TalkClientTranscriptParamsSchema = closedObject({ sessionKey: NonEmptyString, voiceSessionId: VoiceIdString, entryId: VoiceIdString, role: Type.Union([Type.Literal("user"), Type.Literal("assistant")]), text: NonEmptyString, timestamp: Type.Optional(Type.Number()) }); /** Logical close for a client-owned Talk session. */ const TalkClientCloseParamsSchema = closedObject({ sessionKey: NonEmptyString, voiceSessionId: VoiceIdString }); /** Result for client-owned transcript and close mutations. */ const TalkClientMutationResultSchema = closedObject({ ok: Type.Literal(true) }); /** Agent run identity returned after accepting a Talk client tool call. */ const TalkClientToolCallResultSchema = closedObject({ runId: NonEmptyString, idempotencyKey: NonEmptyString, agentId: NonEmptyString, agentSessionKey: NonEmptyString }); /** Text steering request for a Talk session bound to an agent turn. */ const TalkClientSteerParamsSchema = closedObject({ sessionKey: NonEmptyString, text: NonEmptyString, mode: Type.Optional(TalkAgentControlModeSchema) }); /** Result of applying agent control to an embedded or reply-backed Talk run. */ const TalkAgentControlResultSchema = closedObject({ ok: Type.Boolean(), mode: TalkAgentControlModeSchema, sessionKey: NonEmptyString, sessionId: Type.Optional(NonEmptyString), active: Type.Boolean(), queued: Type.Optional(Type.Boolean()), aborted: Type.Optional(Type.Boolean()), target: Type.Optional(Type.Union([Type.Literal("embedded_run"), Type.Literal("reply_run")])), reason: Type.Optional(Type.String()), message: Type.String(), speak: Type.Boolean(), show: Type.Boolean(), suppress: Type.Boolean(), providerResult: Type.Optional(closedObject({ status: Type.Literal("cancelled"), message: Type.String() })), enqueuedAtMs: Type.Optional(Type.Number()), deliveredAtMs: Type.Optional(Type.Number()) }); /** Creates a gateway-managed Talk session for realtime, transcription, or relay use. */ const TalkSessionCreateParamsSchema = closedObject({ sessionKey: Type.Optional(Type.String()), voiceChangeId: Type.Optional(NonEmptyString), capabilities: Type.Optional(Type.Array(Type.Literal("voice-selection"), { uniqueItems: true })), spawnedBy: Type.Optional(NonEmptyString), provider: Type.Optional(Type.String()), model: Type.Optional(Type.String()), voice: Type.Optional(Type.String()), language: Type.Optional(Type.String({ pattern: "^[a-z]{2}$" })), vadThreshold: Type.Optional(Type.Number()), silenceDurationMs: Type.Optional(Type.Integer({ minimum: 1 })), prefixPaddingMs: Type.Optional(Type.Integer({ minimum: 0 })), reasoningEffort: Type.Optional(Type.String()), mode: Type.Optional(TalkModeSchema), transport: Type.Optional(TalkTransportSchema), brain: Type.Optional(TalkBrainSchema), ttlMs: Type.Optional(Type.Integer({ minimum: 1e3, maximum: 36e5 })) }); /** Appends base64 audio to an active Talk session. */ const TalkSessionAppendAudioParamsSchema = closedObject({ sessionId: NonEmptyString, audioBase64: NonEmptyString, timestamp: Type.Optional(Type.Number()) }); /** Cancels currently streaming Talk output without necessarily ending the turn. */ const TalkSessionCancelOutputParamsSchema = closedObject({ sessionId: NonEmptyString, turnId: Type.Optional(Type.String()), reason: Type.Optional(Type.String()) }); /** Reports whether a Talk output cancellation applied to the requested turn. */ const TalkSessionCancelOutputResultSchema = closedObject({ ok: Type.Literal(true), status: Type.Optional(Type.Union([ Type.Literal("applied"), Type.Literal("stale"), Type.Literal("idle") ])), turnId: Type.Optional(NonEmptyString) }); /** Submits a tool result back to a Talk provider session. */ const TalkSessionSubmitToolResultParamsSchema = closedObject({ sessionId: NonEmptyString, callId: NonEmptyString, result: Type.Unknown(), options: Type.Optional(closedObject({ suppressResponse: Type.Optional(Type.Boolean()), willContinue: Type.Optional(Type.Boolean()) })) }); /** Steers a managed Talk session by session id rather than transcript key. */ const TalkSessionSteerParamsSchema = closedObject({ sessionId: NonEmptyString, sessionKey: Type.Optional(NonEmptyString), text: NonEmptyString, mode: Type.Optional(TalkAgentControlModeSchema) }); /** Closes a gateway-managed Talk session. */ const TalkSessionCloseParamsSchema = closedObject({ sessionId: NonEmptyString }); /** Reads Talk provider capabilities with optional realtime launch overrides. */ const TalkCatalogParamsSchema = closedObject({ provider: Type.Optional(NonEmptyString), model: Type.Optional(NonEmptyString) }); const TalkCatalogAudioFormatProperties = { encoding: Type.Union([Type.Literal("pcm16"), Type.Literal("g711_ulaw")]), sampleRateHz: Type.Integer({ minimum: 1 }), channels: Type.Integer({ minimum: 1 }) }; /** One provider entry in the Talk capability catalog. */ const TalkCatalogProviderSchema = closedObject({ id: NonEmptyString, label: NonEmptyString, configured: Type.Boolean(), aliases: Type.Optional(Type.Array(NonEmptyString)), models: Type.Optional(Type.Array(Type.String())), voices: Type.Optional(Type.Array(Type.String())), activeVoices: Type.Optional(Type.Array(Type.String())), activeVoiceSelectionPolicy: Type.Optional(Type.Literal("allowlist-default")), voicesByModel: Type.Optional(Type.Record(Type.String(), Type.Array(Type.String()))), defaultModel: Type.Optional(Type.String()), modes: Type.Optional(Type.Array(TalkModeSchema)), transports: Type.Optional(Type.Array(TalkTransportSchema)), brains: Type.Optional(Type.Array(TalkBrainSchema)), inputAudioFormats: Type.Optional(Type.Array(closedObject(TalkCatalogAudioFormatProperties))), outputAudioFormats: Type.Optional(Type.Array(closedObject(TalkCatalogAudioFormatProperties))), supportsBrowserSession: Type.Optional(Type.Boolean()), supportsBargeIn: Type.Optional(Type.Boolean()), supportsToolCalls: Type.Optional(Type.Boolean()), supportsVideoFrames: Type.Optional(Type.Boolean()), supportsSessionResumption: Type.Optional(Type.Boolean()) }); /** Active provider plus all candidates for a Talk capability family. */ const TalkCatalogProviderGroupSchema = closedObject({ ready: Type.Optional(Type.Boolean()), activeProvider: Type.Optional(Type.String()), providers: Type.Array(TalkCatalogProviderSchema) }); /** Provider, mode, transport, and audio-format catalog returned to clients. */ const TalkCatalogResultSchema = closedObject({ modes: Type.Array(TalkModeSchema), transports: Type.Array(TalkTransportSchema), brains: Type.Array(TalkBrainSchema), speech: TalkCatalogProviderGroupSchema, transcription: TalkCatalogProviderGroupSchema, realtime: TalkCatalogProviderGroupSchema }); /** Audio format contract for realtime browser sessions. */ const BrowserRealtimeAudioContractSchema = closedObject({ inputEncoding: Type.Union([Type.Literal("pcm16"), Type.Literal("g711_ulaw")]), inputSampleRateHz: Type.Integer({ minimum: 1 }), outputEncoding: Type.Union([Type.Literal("pcm16"), Type.Literal("g711_ulaw")]), outputSampleRateHz: Type.Integer({ minimum: 1 }) }); /** Session creation result with transport-specific ids and credentials. */ const TalkSessionCreateResultSchema = closedObject({ sessionId: NonEmptyString, provider: Type.Optional(Type.String()), mode: TalkModeSchema, transport: TalkTransportSchema, brain: TalkBrainSchema, relaySessionId: Type.Optional(NonEmptyString), transcriptionSessionId: Type.Optional(NonEmptyString), handoffId: Type.Optional(NonEmptyString), roomId: Type.Optional(NonEmptyString), roomUrl: Type.Optional(NonEmptyString), token: Type.Optional(NonEmptyString), audio: Type.Optional(Type.Unknown()), model: Type.Optional(Type.String()), voice: Type.Optional(Type.String()), expiresAt: Type.Optional(Type.Number()) }); /** Generic success result for Talk session lifecycle calls. */ const TalkSessionOkResultSchema = closedObject({ ok: Type.Boolean() }); /** Browser WebRTC setup payload using provider SDP exchange. */ const BrowserRealtimeWebRtcSdpSessionSchema = closedObject({ provider: NonEmptyString, transport: Type.Literal("webrtc"), voiceSessionId: NonEmptyString, clientSecret: NonEmptyString, offerUrl: Type.Optional(Type.String()), offerHeaders: Type.Optional(Type.Record(Type.String(), Type.String())), model: Type.Optional(Type.String()), voice: Type.Optional(Type.String()), expiresAt: Type.Optional(Type.Number()), clientControl: Type.Optional(closedObject({ owner: Type.Literal("gateway") })) }); /** Browser websocket setup payload with JSON/PCM audio contract. */ const BrowserRealtimeJsonPcmWebSocketSessionSchema = closedObject({ provider: NonEmptyString, transport: Type.Literal("provider-websocket"), voiceSessionId: NonEmptyString, protocol: NonEmptyString, clientSecret: NonEmptyString, websocketUrl: NonEmptyString, audio: BrowserRealtimeAudioContractSchema, initialMessage: Type.Optional(Type.Unknown()), model: Type.Optional(Type.String()), voice: Type.Optional(Type.String()), expiresAt: Type.Optional(Type.Number()) }); /** Browser setup payload for gateway-relayed realtime audio. */ const BrowserRealtimeGatewayRelaySessionSchema = closedObject({ provider: NonEmptyString, transport: Type.Literal("gateway-relay"), voiceSessionId: Type.Optional(NonEmptyString), relaySessionId: NonEmptyString, audio: BrowserRealtimeAudioContractSchema, model: Type.Optional(Type.String()), voice: Type.Optional(Type.String()), expiresAt: Type.Optional(Type.Number()) }); /** Browser setup payload for managed-room Talk sessions. */ const BrowserRealtimeManagedRoomSessionSchema = closedObject({ provider: NonEmptyString, transport: Type.Literal("managed-room"), voiceSessionId: Type.Optional(NonEmptyString), roomUrl: NonEmptyString, token: Type.Optional(Type.String()), model: Type.Optional(Type.String()), voice: Type.Optional(Type.String()), expiresAt: Type.Optional(Type.Number()) }); /** Union of all browser Talk session setup payloads. */ const TalkClientCreateResultSchema = Type.Union([ BrowserRealtimeWebRtcSdpSessionSchema, BrowserRealtimeJsonPcmWebSocketSessionSchema, BrowserRealtimeGatewayRelaySessionSchema, BrowserRealtimeManagedRoomSessionSchema ]); /** Secret-bearing provider fields; extra provider options remain provider-owned. */ const TalkProviderConfigSchema = Type.Object({ apiKey: Type.Optional(SecretInputSchema) }, { additionalProperties: true }); /** Realtime Talk defaults and provider selection stored in config. */ const TalkRealtimeConfigSchema = closedObject({ provider: Type.Optional(Type.String()), providers: Type.Optional(Type.Record(Type.String(), TalkProviderConfigSchema)), model: Type.Optional(Type.String()), speakerVoice: Type.Optional(Type.String()), speakerVoiceId: Type.Optional(Type.String()), voice: Type.Optional(Type.String()), instructions: Type.Optional(Type.String()), mode: Type.Optional(TalkModeSchema), transport: Type.Optional(TalkTransportSchema), vadThreshold: Type.Optional(Type.Number({ minimum: 0, maximum: 1 })), silenceDurationMs: Type.Optional(Type.Integer({ minimum: 1 })), prefixPaddingMs: Type.Optional(Type.Integer({ minimum: 0 })), reasoningEffort: Type.Optional(Type.String({ minLength: 1 })), brain: Type.Optional(TalkBrainSchema), consultRouting: Type.Optional(Type.Union([Type.Literal("provider-direct"), Type.Literal("force-agent-consult")])) }); /** Resolved active Talk provider plus its normalized provider config. */ const ResolvedTalkConfigSchema = closedObject({ provider: Type.String(), config: TalkProviderConfigSchema }); /** Talk config subtree returned through gateway config APIs. */ const TalkConfigSchema = closedObject({ provider: Type.Optional(Type.String()), providers: Type.Optional(Type.Record(Type.String(), TalkProviderConfigSchema)), realtime: Type.Optional(TalkRealtimeConfigSchema), resolved: Type.Optional(ResolvedTalkConfigSchema), consultThinkingLevel: Type.Optional(Type.String()), consultFastMode: Type.Optional(Type.Boolean()), speechLocale: Type.Optional(Type.String()), interruptOnSpeech: Type.Optional(Type.Boolean()), silenceTimeoutMs: Type.Optional(Type.Integer({ minimum: 1 })) }); /** Full Talk config read result, including related session/UI context. */ const TalkConfigResultSchema = closedObject({ config: closedObject({ talk: Type.Optional(TalkConfigSchema), session: Type.Optional(closedObject({ mainKey: Type.Optional(Type.String()) })), ui: Type.Optional(closedObject({ seamColor: Type.Optional(Type.String()) })), clientHints: Type.Optional(closedObject({ realtime: Type.Optional(closedObject({ modelSource: Type.Optional(Type.Literal("gateway")), gatewayRelaySupported: Type.Optional(Type.Boolean()) })) })) }) }); /** Text-to-speech result with encoded audio and provider output metadata. */ const TalkSpeakResultSchema = closedObject({ audioBase64: NonEmptyString, provider: NonEmptyString, outputFormat: Type.Optional(Type.String()), voiceCompatible: Type.Optional(Type.Boolean()), mimeType: Type.Optional(Type.String()), fileExtension: Type.Optional(Type.String()) }); /** Text-to-speech result for `tts.speak` with encoded audio and provider metadata. */ const TtsSpeakResultSchema = closedObject({ audioBase64: NonEmptyString, provider: NonEmptyString, outputFormat: Type.Optional(Type.String()), mimeType: Type.Optional(Type.String()), fileExtension: Type.Optional(Type.String()) }); /** Channel status request, optionally probing one channel before returning. */ const ChannelsStatusParamsSchema = closedObject({ probe: Type.Optional(Type.Boolean()), timeoutMs: Type.Optional(Type.Integer({ minimum: 0 })), channel: Type.Optional(NonEmptyString) }); /** * Per-account channel status snapshot. * * This is intentionally schema-light so new channel-specific metadata can ship * without a gateway protocol update; known fields stay documented for UI use. */ const ChannelAccountSnapshotSchema = Type.Object({ accountId: NonEmptyString, name: Type.Optional(Type.String()), enabled: Type.Optional(Type.Boolean()), configured: Type.Optional(Type.Boolean()), linked: Type.Optional(Type.Boolean()), running: Type.Optional(Type.Boolean()), connected: Type.Optional(Type.Boolean()), reconnectAttempts: Type.Optional(Type.Integer({ minimum: 0 })), lastConnectedAt: Type.Optional(Type.Union([Type.Integer({ minimum: 0 }), Type.Null()])), lastError: Type.Optional(Type.Union([Type.String(), Type.Null()])), healthState: Type.Optional(Type.String()), lastStartAt: Type.Optional(Type.Union([Type.Integer({ minimum: 0 }), Type.Null()])), lastStopAt: Type.Optional(Type.Union([Type.Integer({ minimum: 0 }), Type.Null()])), lastInboundAt: Type.Optional(Type.Union([Type.Integer({ minimum: 0 }), Type.Null()])), lastOutboundAt: Type.Optional(Type.Union([Type.Integer({ minimum: 0 }), Type.Null()])), lastTransportActivityAt: Type.Optional(Type.Union([Type.Integer({ minimum: 0 }), Type.Null()])), busy: Type.Optional(Type.Boolean()), activeRuns: Type.Optional(Type.Integer({ minimum: 0 })), lastRunActivityAt: Type.Optional(Type.Union([Type.Integer({ minimum: 0 }), Type.Null()])), activeRunStartedAt: Type.Optional(Type.Union([Type.Integer({ minimum: 0 }), Type.Null()])), lastProbeAt: Type.Optional(Type.Union([Type.Integer({ minimum: 0 }), Type.Null()])), mode: Type.Optional(Type.String()), dmPolicy: Type.Optional(Type.String()), allowFrom: Type.Optional(Type.Array(Type.String())), tokenSource: Type.Optional(Type.String()), botTokenSource: Type.Optional(Type.String()), appTokenSource: Type.Optional(Type.String()), credentialSource: Type.Optional(Type.Union([Type.String(), Type.Null()])), audienceType: Type.Optional(Type.Union([Type.String(), Type.Null()])), audience: Type.Optional(Type.Union([Type.String(), Type.Null()])), webhookPath: Type.Optional(Type.Union([Type.String(), Type.Null()])), webhookUrl: Type.Optional(Type.Union([Type.String(), Type.Null()])), baseUrl: Type.Optional(Type.String()), allowUnmentionedGroups: Type.Optional(Type.Boolean()), cliPath: Type.Optional(Type.Union([Type.String(), Type.Null()])), dbPath: Type.Optional(Type.Union([Type.String(), Type.Null()])), port: Type.Optional(Type.Union([Type.Integer({ minimum: 0 }), Type.Null()])), probe: Type.Optional(Type.Unknown()), audit: Type.Optional(Type.Unknown()), application: Type.Optional(Type.Unknown()) }, { additionalProperties: true }); /** UI label and icon metadata for one channel. */ const ChannelUiMetaSchema = closedObject({ id: NonEmptyString, label: NonEmptyString, detailLabel: NonEmptyString, systemImage: Type.Optional(Type.String()) }); /** Event-loop health snapshot included with channel status responses. */ const ChannelEventLoopHealthSchema = closedObject({ ...GatewayEventLoopHealthSchema.properties, intervalMs: Type.Integer({ minimum: 0 }) }); /** Full channel status result for dashboard and operator diagnostics. */ const ChannelsStatusResultSchema = closedObject({ ts: Type.Integer({ minimum: 0 }), channelOrder: Type.Array(NonEmptyString), channelLabels: Type.Record(NonEmptyString, NonEmptyString), channelDetailLabels: Type.Optional(Type.Record(NonEmptyString, NonEmptyString)), channelSystemImages: Type.Optional(Type.Record(NonEmptyString, NonEmptyString)), channelMeta: Type.Optional(Type.Array(ChannelUiMetaSchema)), channels: Type.Record(NonEmptyString, Type.Unknown()), channelAccounts: Type.Record(NonEmptyString, Type.Array(ChannelAccountSnapshotSchema)), channelDefaultAccountId: Type.Record(NonEmptyString, NonEmptyString), eventLoop: Type.Optional(ChannelEventLoopHealthSchema), partial: Type.Optional(Type.Boolean()), warnings: Type.Optional(Type.Array(Type.String())), statusIssues: Type.Optional(Type.Array(closedObject({ channel: NonEmptyString, accountId: NonEmptyString, kind: Type.Union([ Type.Literal("intent"), Type.Literal("permissions"), Type.Literal("config"), Type.Literal("auth"), Type.Literal("runtime") ]), message: Type.String(), fix: Type.Optional(Type.String()) }), { maxItems: 50 })) }); /** Logs out one channel account. */ const ChannelsLogoutParamsSchema = closedObject({ channel: NonEmptyString, accountId: Type.Optional(Type.String()) }); /** Stops one channel account runtime. */ const ChannelsStopParamsSchema = closedObject(ChannelsLogoutParamsSchema.properties); /** Starts one channel account runtime. */ const ChannelsStartParamsSchema = closedObject(ChannelsLogoutParamsSchema.properties); /** Starts browser/web login for a channel account. */ const WebLoginStartParamsSchema = closedObject({ channel: Type.Optional(NonEmptyString), force: Type.Optional(Type.Boolean()), timeoutMs: Type.Optional(Type.Integer({ minimum: 0 })), verbose: Type.Optional(Type.Boolean()), accountId: Type.Optional(Type.String()) }); const QrDataUrlSchema = Type.String({ maxLength: 16384, pattern: "^data:image/png;base64," }); /** Waits for web login completion or the next QR code. */ const WebLoginWaitParamsSchema = closedObject({ channel: Type.Optional(NonEmptyString), sessionKey: Type.Optional(NonEmptyString), timeoutMs: Type.Optional(Type.Integer({ minimum: 0 })), accountId: Type.Optional(Type.String()), currentQrDataUrl: Type.Optional(QrDataUrlSchema) }); //#endregion export { TalkSpeakParamsSchema as A, TalkSessionCancelOutputResultSchema as C, TalkSessionOkResultSchema as D, TalkSessionCreateResultSchema as E, WebLoginWaitParamsSchema as F, TtsSpeakParamsSchema as M, TtsSpeakResultSchema as N, TalkSessionSteerParamsSchema as O, WebLoginStartParamsSchema as P, TalkSessionCancelOutputParamsSchema as S, TalkSessionCreateParamsSchema as T, TalkConfigParamsSchema as _, ChannelsStopParamsSchema as a, TalkModeParamsSchema as b, TalkCatalogResultSchema as c, TalkClientCreateResultSchema as d, TalkClientMutationResultSchema as f, TalkClientTranscriptParamsSchema as g, TalkClientToolCallResultSchema as h, ChannelsStatusResultSchema as i, TalkSpeakResultSchema as j, TalkSessionSubmitToolResultParamsSchema as k, TalkClientCloseParamsSchema as l, TalkClientToolCallParamsSchema as m, ChannelsStartParamsSchema as n, TalkAgentControlResultSchema as o, TalkClientSteerParamsSchema as p, ChannelsStatusParamsSchema as r, TalkCatalogParamsSchema as s, ChannelsLogoutParamsSchema as t, TalkClientCreateParamsSchema as u, TalkConfigResultSchema as v, TalkSessionCloseParamsSchema as w, TalkSessionAppendAudioParamsSchema as x, TalkEventSchema as y };