




























@@ -2,6 +2,12 @@ import {
22REALTIME_VOICE_AGENT_CONSULT_TOOL_POLICIES,
33type RealtimeVoiceAgentConsultToolPolicy,
44} from "openclaw/plugin-sdk/realtime-voice";
5+import {
6+buildSecretInputSchema,
7+hasConfiguredSecretInput,
8+normalizeResolvedSecretInputString,
9+type SecretInput,
10+} from "openclaw/plugin-sdk/secret-input";
511import { z } from "openclaw/plugin-sdk/zod";
612import { TtsAutoSchema, TtsConfigSchema, TtsModeSchema, TtsProviderSchema } from "../api.js";
713import { deepMergeDefined } from "./deep-merge.js";
@@ -39,6 +45,8 @@ export type InboundPolicy = z.infer<typeof InboundPolicySchema>;
3945// Provider-Specific Configuration
4046// -----------------------------------------------------------------------------
414748+const SecretInputSchema = buildSecretInputSchema();
49+4250export const TelnyxConfigSchema = z
4351.object({
4452/** Telnyx API v2 key */
@@ -56,10 +64,12 @@ export const TwilioConfigSchema = z
5664/** Twilio Account SID */
5765accountSid: z.string().min(1).optional(),
5866/** Twilio Auth Token */
59-authToken: z.string().min(1).optional(),
67+authToken: SecretInputSchema.optional(),
6068})
6169.strict();
62-export type TwilioConfig = z.infer<typeof TwilioConfigSchema>;
70+export type TwilioConfig = Omit<z.infer<typeof TwilioConfigSchema>, "authToken"> & {
71+authToken?: SecretInput;
72+};
63736474export const PlivoConfigSchema = z
6575.object({
@@ -393,13 +403,15 @@ export const VoiceCallConfigSchema = z
393403.strict();
394404395405export type VoiceCallConfig = z.infer<typeof VoiceCallConfigSchema>;
396-type DeepPartial<T> =
397-T extends Array<infer U>
406+type DeepPartial<T> = T extends SecretInput
407+ ? T
408+ : T extends Array<infer U>
398409 ? DeepPartial<U>[]
399410 : T extends object
400411 ? { [K in keyof T]?: DeepPartial<T[K]> }
401412 : T;
402413export type VoiceCallConfigInput = DeepPartial<VoiceCallConfig>;
414+const TWILIO_AUTH_TOKEN_PATH = "plugins.entries.voice-call.config.twilio.authToken";
403415404416// -----------------------------------------------------------------------------
405417// Configuration Helpers
@@ -458,6 +470,15 @@ function sanitizeVoiceCallProviderConfigs(
458470);
459471}
460472473+export function resolveTwilioAuthToken(
474+config: Pick<VoiceCallConfig, "twilio">,
475+): string | undefined {
476+return normalizeResolvedSecretInputString({
477+value: config.twilio?.authToken,
478+path: TWILIO_AUTH_TOKEN_PATH,
479+});
480+}
481+461482export function normalizeVoiceCallConfig(config: VoiceCallConfigInput): VoiceCallConfig {
462483const defaults = cloneDefaultVoiceCallConfig();
463484const serve = { ...defaults.serve, ...config.serve };
@@ -608,7 +629,7 @@ export function validateProviderConfig(config: VoiceCallConfig): {
608629"plugins.entries.voice-call.config.twilio.accountSid is required (or set TWILIO_ACCOUNT_SID env)",
609630);
610631}
611-if (!config.twilio?.authToken) {
632+if (!hasConfiguredSecretInput(config.twilio?.authToken)) {
612633errors.push(
613634"plugins.entries.voice-call.config.twilio.authToken is required (or set TWILIO_AUTH_TOKEN env)",
614635);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。