openclaw/docs/reference/secretref-credential-surface.md
Omar Shahine 88c56ec432
feat(plugins): add experimental FaceTime realtime voice bridge (#119291)
* feat(plugins): add experimental FaceTime realtime voice bridge

Co-authored-by: Peter Steinberger <steipete@gmail.com>

Co-authored-by: Dallin Romney <dallinromney@gmail.com>

* test(facetime): align portable release gates

* ci: refresh FaceTime PR checks

* fix(facetime): retain startup suppression through hangup

Begin carrier closure before startup teardown and keep native suppression pending until carrier absence is confirmed.

* fix(facetime): retain cancellation until carrier safety is confirmed

* fix(facetime): separate carrier closure from startup teardown

* test(pr): model authoritative repository identity in sibling fixtures

* fix(facetime): retain suppression without carrier proof

Do not treat the capture watchdog shutdown as evidence that the native carrier terminated. Keep the call unresolved and process suppression retained until exact termination or stable absence is observed.\n\nCo-authored-by: Codex <noreply@openai.com>

* fix(facetime): retain disconnected carrier proof

* fix(facetime): stabilize live audio startup and routing

* fix(facetime): refresh merged lockfile

* refactor(facetime): separate helper result projection

* fix(facetime): align published package metadata

* fix(facetime): satisfy preflight lint checks

* fix(facetime): preserve consult and carrier ownership

* test(facetime): declare regression fixture types

* test(release): align merged publisher inventory

* fix(facetime): retain runtime across safe uninstall

* fix(facetime): restore responsive call opening

* refactor(facetime): keep greeting policy localized

* fix(facetime): accept trusted stock Xcode

* fix(facetime): use compiler link drivers

* fix(facetime): repair portable lifecycle checks

* fix(facetime): normalize installed driver permissions

* fix(facetime): preserve consults during caller speech

* fix(facetime): make answered-call greeting reliable

* fix(facetime): honor explicit agent session owner

* fix(facetime): finish voice consults promptly

* fix(facetime): preserve repeated voice consults

* fix(facetime): settle consult delivery before reporting success

* fix(facetime): retain suppression until carrier closure is proven

* docs(facetime): refresh merged plugin reference count

* fix(facetime): preserve installed driver when backup fails

* test(facetime): prove rejected calls cannot start media

* fix(facetime): verify unknown SIP status before setup advice

* test(facetime): prove caller rejection at authenticated media boundary

---------

Co-authored-by: Omar Shahine <10343873+omarshahine@users.noreply.github.com>
Co-authored-by: Dallin Romney <dallinromney@gmail.com>
2026-09-19 20:36:04 -07:00

10 KiB

summary read_when title
Canonical supported vs unsupported SecretRef credential surface
Verifying SecretRef credential coverage
Auditing whether a credential is eligible for `secrets configure` or `secrets apply`
Verifying why a credential is outside the supported surface
SecretRef credential surface

This page defines the canonical SecretRef credential surface: which credential fields accept a SecretRef (env/file/exec/store-backed reference) instead of a raw secret value.

Scope:

  • In scope: strictly user-supplied credentials that OpenClaw does not mint or rotate.
  • Out of scope: runtime-minted or rotating credentials, OAuth refresh material, and session-like artifacts.

The lists below are generated from the source target registry and checked against docs/reference/secretref-user-supplied-credentials-matrix.json in CI; do not hand-edit entries.

Source generation fails if a present channel secret-contract artifact cannot load, rather than publishing an incomplete list. A plugin without that optional artifact contributes no channel targets. This generation check does not change runtime SecretRef owner-isolation behavior.

Supported credentials

openclaw.json targets (secrets configure + secrets apply + secrets audit)

agents

  • agents.entries.*.memory.search.remote.apiKey
  • agents.entries.*.tts.personas.*.providers.*.apiKey
  • agents.entries.*.tts.providers.*.apiKey

channels

  • channels.buzz.accounts.*.authTag
  • channels.buzz.accounts.*.privateKey
  • channels.buzz.authTag
  • channels.buzz.privateKey
  • channels.clickclack.accounts.*.token
  • channels.clickclack.token
  • channels.discord.accounts.*.pluralkit.token
  • channels.discord.accounts.*.token
  • channels.discord.accounts.*.voice.realtime.providers.*.apiKey
  • channels.discord.accounts.*.voice.tts.personas.*.providers.*.apiKey
  • channels.discord.accounts.*.voice.tts.providers.*.apiKey
  • channels.discord.pluralkit.token
  • channels.discord.token
  • channels.discord.voice.realtime.providers.*.apiKey
  • channels.discord.voice.tts.personas.*.providers.*.apiKey
  • channels.discord.voice.tts.providers.*.apiKey
  • channels.feishu.accounts.*.appSecret
  • channels.feishu.accounts.*.encryptKey
  • channels.feishu.accounts.*.verificationToken
  • channels.feishu.appSecret
  • channels.feishu.encryptKey
  • channels.feishu.verificationToken
  • channels.googlechat.accounts.*.serviceAccount
  • channels.googlechat.serviceAccount
  • channels.irc.accounts.*.nickserv.password
  • channels.irc.accounts.*.password
  • channels.irc.nickserv.password
  • channels.irc.password
  • channels.matrix.accessToken
  • channels.matrix.accounts.*.accessToken
  • channels.matrix.accounts.*.password
  • channels.matrix.password
  • channels.mattermost.accounts.*.botToken
  • channels.mattermost.botToken
  • channels.msteams.appPassword
  • channels.nextcloud-talk.accounts.*.apiPassword
  • channels.nextcloud-talk.accounts.*.botSecret
  • channels.nextcloud-talk.apiPassword
  • channels.nextcloud-talk.botSecret
  • channels.nostr.privateKey
  • channels.qqbot.accounts.*.clientSecret
  • channels.qqbot.clientSecret
  • channels.slack.accounts.*.appToken
  • channels.slack.accounts.*.botToken
  • channels.slack.accounts.*.relay.authToken
  • channels.slack.accounts.*.signingSecret
  • channels.slack.accounts.*.userToken
  • channels.slack.appToken
  • channels.slack.botToken
  • channels.slack.relay.authToken
  • channels.slack.signingSecret
  • channels.slack.userToken
  • channels.sms.accounts.*.authToken
  • channels.sms.authToken
  • channels.telegram.accounts.*.botToken
  • channels.telegram.accounts.*.webhookSecret
  • channels.telegram.botToken
  • channels.telegram.webhookSecret
  • channels.zalo.accounts.*.botToken
  • channels.zalo.accounts.*.webhookSecret
  • channels.zalo.botToken
  • channels.zalo.webhookSecret

cron

  • cron.webhookToken

gateway

  • gateway.auth.password
  • gateway.auth.token
  • gateway.remote.password
  • gateway.remote.token

memory

  • memory.search.remote.apiKey

models

  • models.providers.*.apiKey
  • models.providers.*.headers.*
  • models.providers.*.request.auth.token
  • models.providers.*.request.auth.value
  • models.providers.*.request.headers.*
  • models.providers.*.request.proxy.tls.ca
  • models.providers.*.request.proxy.tls.cert
  • models.providers.*.request.proxy.tls.key
  • models.providers.*.request.proxy.tls.passphrase
  • models.providers.*.request.tls.ca
  • models.providers.*.request.tls.cert
  • models.providers.*.request.tls.key
  • models.providers.*.request.tls.passphrase

plugins

  • plugins.entries.acpx.config.mcpServers.*.env.*
  • plugins.entries.brave.config.webSearch.apiKey
  • plugins.entries.codex.config.appServer.authToken
  • plugins.entries.codex.config.appServer.headers.*
  • plugins.entries.comfy.config.headers.*
  • plugins.entries.exa.config.webSearch.apiKey
  • plugins.entries.facetime.config.realtime.providers.*.apiKey
  • plugins.entries.firecrawl.config.webFetch.apiKey
  • plugins.entries.firecrawl.config.webSearch.apiKey
  • plugins.entries.google-meet.config.realtime.providers.*.apiKey
  • plugins.entries.google.config.webSearch.apiKey
  • plugins.entries.google.config.webSearch.headers.*
  • plugins.entries.imap.config.accounts.*.password
  • plugins.entries.minimax.config.webSearch.apiKey
  • plugins.entries.moonshot.config.webSearch.apiKey
  • plugins.entries.parallel.config.webSearch.apiKey
  • plugins.entries.perplexity.config.webSearch.apiKey
  • plugins.entries.tavily.config.webSearch.apiKey
  • plugins.entries.team-reports.config.discord.token
  • plugins.entries.team-reports.config.github.token
  • plugins.entries.typesafe.config.apiKey
  • plugins.entries.voice-call.config.realtime.providers.*.apiKey
  • plugins.entries.voice-call.config.streaming.providers.*.apiKey
  • plugins.entries.voice-call.config.tts.providers.*.apiKey
  • plugins.entries.voice-call.config.twilio.authToken
  • plugins.entries.webhooks.config.routes.*.secret
  • plugins.entries.xai.config.webSearch.apiKey

skills

  • skills.entries.*.apiKey

talk

  • talk.providers.*.apiKey
  • talk.realtime.providers.*.apiKey

tts

  • tts.personas.*.providers.*.apiKey
  • tts.providers.*.apiKey

SQLite auth-profile targets (secrets configure + secrets apply + secrets audit)

  • profiles.*.keyRef (type: "api_key"; unsupported when auth.profiles.<id>.mode = "oauth")
  • profiles.*.tokenRef (type: "token"; unsupported when auth.profiles.<id>.mode = "oauth")

Node-host connection targets

  • gateway.cloudflareAccess.clientId
  • gateway.cloudflareAccess.clientSecret

These fields live in the node host's canonical nodeHost.config SQLite machine-state value, not openclaw.json. They accept the same SecretInput forms and resolve through the configured SecretRef providers when the node starts. The conventional CF_ACCESS_CLIENT_ID / CF_ACCESS_CLIENT_SECRET fallback persists env refs for these fields automatically. They are not targets for secrets configure or secrets apply.

Notes:

  • Store refs use names matching ^[A-Z][A-Z0-9_]{0,127}$ and resolve only from the Gateway-wide team scope; no other store scope exists. A typical ref is {"source":"store","provider":"default","id":"OPENAI_API_KEY"}.
  • Auth-profile plan targets require agentId; plan entries target profiles.*.key / profiles.*.token and write sibling refs (keyRef / tokenRef). Auth-profile refs are included in runtime resolution and audit coverage.
  • In openclaw.json, SecretRefs must use structured objects such as {"source":"env","provider":"default","id":"DISCORD_BOT_TOKEN"}. Legacy secretref-env:<ENV_VAR> marker strings are rejected on SecretRef credential paths; run openclaw doctor --fix to migrate valid markers.
  • OAuth policy guard: auth.profiles.<id>.mode = "oauth" cannot be combined with SecretRef inputs for that profile. Startup/reload and auth-profile resolution fail fast when this policy is violated.
  • For SecretRef-managed model providers, generated agents/*/agent/models.json entries persist non-secret markers (not resolved secret values) for apiKey/header surfaces. Marker persistence is source-authoritative: OpenClaw writes markers from the active source config snapshot (pre-resolution), not from resolved runtime secret values.
  • Cold Gateway startup can isolate retryable resolution failures for mapped, non-Gateway owners. Current mapped classes include model providers and skills, media/TTS/cron providers, eligible auth profiles, per-agent memory, sandbox SSH, channel accounts, and manifest-declared plugin routes. Startup keeps each failed owner's explicit refs in the runtime snapshot, reports the owner through status and doctor, and rejects requests for that owner without trying lower-precedence credentials. Reload and config-write preflight use the same owner-aware policy: healthy owners refresh; an eligible failed owner stays stale only when its ref identities, provider definitions, and complete non-secret owner contract are unchanged; a new or changed failure becomes cold. Gateway ingress auth, structurally invalid refs or values, fail-closed owners, and currently unmapped owners remain strict.
  • For web search: in explicit provider mode (tools.web.search.provider set), only the selected provider key is active. In auto mode (tools.web.search.provider unset), only the first provider key that resolves by precedence is active, and non-selected provider refs are treated as inactive until selected. Provider credentials use plugins.entries.<plugin>.config.webSearch.*.
  • Slack identity: "user" uses channels.slack.userToken with channels.slack.appToken for Socket Mode or channels.slack.signingSecret for HTTP mode. The same pairing applies under channels.slack.accounts.*; no bot token is required for this identity.

Unsupported credentials

These credentials are minted, rotated, session-bearing, or OAuth-durable classes that do not fit read-only external SecretRef resolution:

  • hooks.token
  • hooks.gmail.pushToken
  • hooks.mappings[].sessionKey
  • auth-profiles.oauth.*
  • channels.discord.accounts.*.threadBindings.webhookToken
  • channels.discord.threadBindings.webhookToken
  • channels.whatsapp.accounts.*.creds.json
  • channels.whatsapp.creds.json