## Summary - add server-backed speech capabilities and transcription endpoints plus UI settings for speech configuration - add push-to-talk prompt voice input with microphone controls, transcription insertion, and browser capability gating - keep prompt controls aligned by restoring right-side nav placement and moving the mic beside the expand control
41 lines
1.1 KiB
TypeScript
41 lines
1.1 KiB
TypeScript
import type { SettingsDoc } from "./yaml-doc-store"
|
|
|
|
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
return typeof value === "object" && value !== null && !Array.isArray(value)
|
|
}
|
|
|
|
function sanitizeServerOwner(value: SettingsDoc): SettingsDoc {
|
|
const next: SettingsDoc = { ...value }
|
|
const speech = isPlainObject(next.speech) ? { ...next.speech } : null
|
|
|
|
if (!speech) {
|
|
return next
|
|
}
|
|
|
|
const rawApiKey = typeof speech.apiKey === "string" ? speech.apiKey.trim() : ""
|
|
if (rawApiKey) {
|
|
delete speech.apiKey
|
|
speech.hasApiKey = true
|
|
} else if (!("hasApiKey" in speech)) {
|
|
speech.hasApiKey = false
|
|
}
|
|
|
|
next.speech = speech
|
|
return next
|
|
}
|
|
|
|
export function sanitizeConfigOwner(owner: string, value: SettingsDoc): SettingsDoc {
|
|
if (owner !== "server") {
|
|
return value
|
|
}
|
|
return sanitizeServerOwner(value)
|
|
}
|
|
|
|
export function sanitizeConfigDoc(value: SettingsDoc): SettingsDoc {
|
|
const next: SettingsDoc = { ...value }
|
|
if (isPlainObject(next.server)) {
|
|
next.server = sanitizeServerOwner(next.server)
|
|
}
|
|
return next
|
|
}
|