-
-
Notifications
You must be signed in to change notification settings - Fork 80.7k
[Bug]: iOS Talk treats SecretRef-backed ElevenLabs API keys as missing #98209
Copy link
Copy link
Closed
Labels
P1High-priority user-facing bug, regression, or broken workflow.High-priority user-facing bug, regression, or broken workflow.clawsweeper:linked-pr-openClawSweeper found an open linked pull request for this issue.ClawSweeper found an open linked pull request for this issue.clawsweeper:needs-security-reviewClawSweeper marked this issue as needing security-sensitive review.ClawSweeper marked this issue as needing security-sensitive review.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.ClawSweeper does not recommend queueing a new automated fix PR for this issue.clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.ClawSweeper found a high-confidence source-level issue reproduction.impact:auth-providerAuth, provider routing, model choice, or SecretRef resolution may break.Auth, provider routing, model choice, or SecretRef resolution may break.impact:securitySecurity boundary, credential, authz, sandbox, or sensitive-data risk.Security boundary, credential, authz, sandbox, or sensitive-data risk.issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.Very strong issue quality with high-confidence source-level or clear reproduction.maturity:stableIssue affects a taxonomy feature currently scored M4/M5.Issue affects a taxonomy feature currently scored M4/M5.
Description
Metadata
Metadata
Assignees
Labels
P1High-priority user-facing bug, regression, or broken workflow.High-priority user-facing bug, regression, or broken workflow.clawsweeper:linked-pr-openClawSweeper found an open linked pull request for this issue.ClawSweeper found an open linked pull request for this issue.clawsweeper:needs-security-reviewClawSweeper marked this issue as needing security-sensitive review.ClawSweeper marked this issue as needing security-sensitive review.clawsweeper:no-new-fix-prClawSweeper does not recommend queueing a new automated fix PR for this issue.ClawSweeper does not recommend queueing a new automated fix PR for this issue.clawsweeper:source-reproClawSweeper found a high-confidence source-level issue reproduction.ClawSweeper found a high-confidence source-level issue reproduction.impact:auth-providerAuth, provider routing, model choice, or SecretRef resolution may break.Auth, provider routing, model choice, or SecretRef resolution may break.impact:securitySecurity boundary, credential, authz, sandbox, or sensitive-data risk.Security boundary, credential, authz, sandbox, or sensitive-data risk.issue-rating: 🦞 diamond lobsterVery strong issue quality with high-confidence source-level or clear reproduction.Very strong issue quality with high-confidence source-level or clear reproduction.maturity:stableIssue affects a taxonomy feature currently scored M4/M5.Issue affects a taxonomy feature currently scored M4/M5.
Type
Fields
Priority
None yet
Summary
iOS Talk can report
Voice API key missingeven when the Gateway has a resolved ElevenLabs Talk API key, if the configured Talk provider key is stored as aSecretRef.Real environment observed
2026.6.11-beta.2operator.talk.secretseleven_v3)talk.providers.elevenlabs.apiKeyconfigured through SecretRef rather than plaintextThe same account/key became usable when the key was temporarily stored as plaintext in the local OpenClaw config, and the iOS Talk screen moved from
Voice API key missingtoPermission Ready. That makes this a SecretRef/readback contract issue rather than an ElevenLabs plan or key-permission issue.User-visible symptom
After pairing the phone and opening Talk, iOS shows
Voice API key missing/API keyforNative - eleven_v3even though the Gateway runtime has already resolved the provider key. Users can mistake this for a bad ElevenLabs subscription or a missing key and may work around it by storing provider secrets as plaintext.Source-level repro on current main
Current
main(6cb82eaab865) gatestalk.config({ includeSecrets: true })onoperator.talk.secrets, butresolveTalkResponseFromConfigreturns the source-shaped payload before the runtime-resolved config path runs. Iftalk.providers.<id>.apiKeyis a SecretRef, the authorized response can therefore put the SecretRef object intalk.resolved.config.apiKey.That is not usable for iOS native Talk:
TalkModeGatewayConfigParserreadsactiveConfig["apiKey"]?.stringValue, so a SecretRef object is parsed as missing.Related prior attempt: #91020 identified the same early-return seam and was closed by its author over the credential-boundary question. The current docs still describe
operator.talk.secretsas the scope for native Talk configuration reads, so this report tracks the remaining user-visible regression separately and calls out the trust-boundary decision explicitly.Expected behavior
For a caller authorized with
operator.talk.secrets,talk.config({ includeSecrets: true })should make the effective resolved provider credential available intalk.resolved.config.apiKeyso native Talk can use the configured provider.For callers without Talk secret scope, the runtime key must not be exposed; the existing redacted/source-shaped response should remain redacted.
Actual behavior
Authorized native clients can receive the source SecretRef object instead of a resolved API key string. iOS then treats the key as missing and blocks native ElevenLabs Talk until the user stores the key as plaintext or enters a separate local mobile key.
Scope / non-goals
operator.readclients.Proposed fix
Keep the source-shaped provider map intact, but do not return early for
includeSecrets. Let the existing runtime-resolved config path run, and only useresolvedConfigfortalk.resolved.configwhen the caller already has Talk secret scope.Regression coverage should prove both sides:
includeSecrets: truewithoperator.talk.secretsreturns a string intalk.resolved.config.apiKeywhen the source key is a SecretRef and runtime config has the resolved key.talk.configread scope still redacts the runtime key and does not leak the resolved value or SecretRef id.