55 type OAuthProvider ,
66} from "@mariozechner/pi-ai" ;
77import { loadConfig , type OpenClawConfig } from "../../config/config.js" ;
8- import { isSecretRef } from "../../config/types.secrets.js" ;
8+ import { coerceSecretRef } from "../../config/types.secrets.js" ;
99import { withFileLock } from "../../infra/file-lock.js" ;
1010import { refreshQwenPortalCredentials } from "../../providers/qwen-portal-oauth.js" ;
1111import { resolveSecretRefString , type SecretRefResolveCache } from "../../secrets/resolve.js" ;
@@ -257,14 +257,34 @@ export async function resolveApiKeyForProfile(
257257 return null ;
258258 }
259259
260- const refResolveCache : SecretRefResolveCache = { fileSecretsPromise : null } ;
260+ const refResolveCache : SecretRefResolveCache = { } ;
261261 const configForRefResolution = cfg ?? loadConfig ( ) ;
262+ const refDefaults = configForRefResolution . secrets ?. defaults ;
262263
263264 if ( cred . type === "api_key" ) {
264265 let key = cred . key ?. trim ( ) ;
265- if ( ! key && isSecretRef ( cred . keyRef ) ) {
266+ if ( key ) {
267+ const inlineRef = coerceSecretRef ( key , refDefaults ) ;
268+ if ( inlineRef ) {
269+ try {
270+ key = await resolveSecretRefString ( inlineRef , {
271+ config : configForRefResolution ,
272+ env : process . env ,
273+ cache : refResolveCache ,
274+ } ) ;
275+ } catch ( err ) {
276+ log . debug ( "failed to resolve inline auth profile api_key ref" , {
277+ profileId,
278+ provider : cred . provider ,
279+ error : err instanceof Error ? err . message : String ( err ) ,
280+ } ) ;
281+ }
282+ }
283+ }
284+ const keyRef = coerceSecretRef ( cred . keyRef , refDefaults ) ;
285+ if ( ! key && keyRef ) {
266286 try {
267- key = await resolveSecretRefString ( cred . keyRef , {
287+ key = await resolveSecretRefString ( keyRef , {
268288 config : configForRefResolution ,
269289 env : process . env ,
270290 cache : refResolveCache ,
@@ -284,9 +304,28 @@ export async function resolveApiKeyForProfile(
284304 }
285305 if ( cred . type === "token" ) {
286306 let token = cred . token ?. trim ( ) ;
287- if ( ! token && isSecretRef ( cred . tokenRef ) ) {
307+ if ( token ) {
308+ const inlineRef = coerceSecretRef ( token , refDefaults ) ;
309+ if ( inlineRef ) {
310+ try {
311+ token = await resolveSecretRefString ( inlineRef , {
312+ config : configForRefResolution ,
313+ env : process . env ,
314+ cache : refResolveCache ,
315+ } ) ;
316+ } catch ( err ) {
317+ log . debug ( "failed to resolve inline auth profile token ref" , {
318+ profileId,
319+ provider : cred . provider ,
320+ error : err instanceof Error ? err . message : String ( err ) ,
321+ } ) ;
322+ }
323+ }
324+ }
325+ const tokenRef = coerceSecretRef ( cred . tokenRef , refDefaults ) ;
326+ if ( ! token && tokenRef ) {
288327 try {
289- token = await resolveSecretRefString ( cred . tokenRef , {
328+ token = await resolveSecretRefString ( tokenRef , {
290329 config : configForRefResolution ,
291330 env : process . env ,
292331 cache : refResolveCache ,
0 commit comments