@@ -2,12 +2,18 @@ import type { BaseTokenResolution } from "openclaw/plugin-sdk/channel-contract";
22import type { OpenClawConfig } from "openclaw/plugin-sdk/config-types" ;
33import { DEFAULT_ACCOUNT_ID , normalizeAccountId } from "openclaw/plugin-sdk/routing" ;
44import { resolveAccountEntry } from "openclaw/plugin-sdk/routing" ;
5- import { normalizeResolvedSecretInputString } from "openclaw/plugin-sdk/secret-input" ;
5+ import {
6+ normalizeResolvedSecretInputString ,
7+ resolveSecretInputString ,
8+ type SecretInputStringResolution ,
9+ } from "openclaw/plugin-sdk/secret-input" ;
610
711type DiscordTokenSource = "env" | "config" | "none" ;
12+ type DiscordCredentialStatus = SecretInputStringResolution [ "status" ] ;
813
914export type DiscordTokenResolution = BaseTokenResolution & {
1015 source : DiscordTokenSource ;
16+ tokenStatus : DiscordCredentialStatus ;
1117} ;
1218
1319export function normalizeDiscordToken ( raw : unknown , path : string ) : string | undefined {
@@ -18,6 +24,20 @@ export function normalizeDiscordToken(raw: unknown, path: string): string | unde
1824 return trimmed . replace ( / ^ B o t \s + / i, "" ) ;
1925}
2026
27+ function inspectDiscordToken (
28+ raw : unknown ,
29+ path : string ,
30+ ) : {
31+ token : string ;
32+ tokenStatus : DiscordCredentialStatus ;
33+ } {
34+ const resolved = resolveSecretInputString ( { value : raw , path, mode : "inspect" } ) ;
35+ if ( resolved . status !== "available" ) {
36+ return { token : "" , tokenStatus : resolved . status } ;
37+ }
38+ return { token : resolved . value . replace ( / ^ B o t \s + / i, "" ) , tokenStatus : "available" } ;
39+ }
40+
2141export function resolveDiscordToken (
2242 cfg : OpenClawConfig ,
2343 opts : { accountId ?: string | null ; envToken ?: string | null } = { } ,
@@ -29,32 +49,50 @@ export function resolveDiscordToken(
2949 accountCfg &&
3050 Object . prototype . hasOwnProperty . call ( accountCfg as Record < string , unknown > , "token" ) ,
3151 ) ;
32- const accountToken = normalizeDiscordToken (
33- ( accountCfg as { token ?: unknown } | undefined ) ?. token ?? undefined ,
52+ const inspectedAccountToken = inspectDiscordToken (
53+ ( accountCfg as { token ?: unknown } | undefined ) ?. token ,
3454 `channels.discord.accounts.${ accountId } .token` ,
3555 ) ;
56+ const accountToken = inspectedAccountToken . token ;
3657 if ( accountToken ) {
37- return { token : accountToken , source : "config" } ;
58+ return {
59+ token : accountToken ,
60+ source : "config" ,
61+ tokenStatus : inspectedAccountToken . tokenStatus ,
62+ } ;
3863 }
3964 if ( hasAccountToken ) {
40- return { token : "" , source : "none" } ;
65+ return {
66+ token : inspectedAccountToken . token ,
67+ source : inspectedAccountToken . tokenStatus === "configured_unavailable" ? "config" : "none" ,
68+ tokenStatus : inspectedAccountToken . tokenStatus ,
69+ } ;
4170 }
4271
43- const configToken = normalizeDiscordToken (
44- discordCfg ?. token ?? undefined ,
45- "channels.discord.token" ,
46- ) ;
72+ const inspectedConfigToken = inspectDiscordToken ( discordCfg ?. token , "channels.discord.token" ) ;
73+ const configToken = inspectedConfigToken . token ;
4774 if ( configToken ) {
48- return { token : configToken , source : "config" } ;
75+ return {
76+ token : configToken ,
77+ source : "config" ,
78+ tokenStatus : inspectedConfigToken . tokenStatus ,
79+ } ;
80+ }
81+ if ( inspectedConfigToken . tokenStatus === "configured_unavailable" ) {
82+ return {
83+ token : inspectedConfigToken . token ,
84+ source : "config" ,
85+ tokenStatus : "configured_unavailable" ,
86+ } ;
4987 }
5088
5189 const allowEnv = accountId === DEFAULT_ACCOUNT_ID ;
5290 const envToken = allowEnv
5391 ? normalizeDiscordToken ( opts . envToken ?? process . env . DISCORD_BOT_TOKEN , "DISCORD_BOT_TOKEN" )
5492 : undefined ;
5593 if ( envToken ) {
56- return { token : envToken , source : "env" } ;
94+ return { token : envToken , source : "env" , tokenStatus : "available" } ;
5795 }
5896
59- return { token : "" , source : "none" } ;
97+ return { token : "" , source : "none" , tokenStatus : "missing" } ;
6098}
0 commit comments