66 resolveMergedAccountConfig ,
77 type OpenClawConfig ,
88} from "openclaw/plugin-sdk/account-resolution" ;
9+ import { resolveAccountEntry } from "openclaw/plugin-sdk/routing" ;
910import { normalizeOptionalString } from "openclaw/plugin-sdk/string-coerce-runtime" ;
1011import type { IMessageAccountConfig } from "./account-types.js" ;
1112
@@ -25,14 +26,95 @@ const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("im
2526export const listIMessageAccountIds = listAccountIds ;
2627export const resolveDefaultIMessageAccountId = resolveDefaultAccountId ;
2728
29+ function resolveIMessageAccountConfig (
30+ cfg : OpenClawConfig ,
31+ accountId : string ,
32+ ) : IMessageAccountConfig | undefined {
33+ return resolveAccountEntry ( cfg . channels ?. imessage ?. accounts , accountId ) ;
34+ }
35+
36+ type IMessageStreamingConfig = NonNullable < IMessageAccountConfig [ "streaming" ] > ;
37+
38+ function asStreamingConfigObject ( value : unknown ) : IMessageStreamingConfig | undefined {
39+ return value && typeof value === "object" && ! Array . isArray ( value )
40+ ? ( value as IMessageStreamingConfig )
41+ : undefined ;
42+ }
43+
44+ function asOwnBooleanProperty ( value : unknown , key : string ) : boolean | undefined {
45+ if ( ! value || typeof value !== "object" || Array . isArray ( value ) ) {
46+ return undefined ;
47+ }
48+ const record = value as Record < string , unknown > ;
49+ return Object . hasOwn ( record , key ) && typeof record [ key ] === "boolean" ? record [ key ] : undefined ;
50+ }
51+
52+ function mergeIMessageStreamingConfig (
53+ base : unknown ,
54+ account : unknown ,
55+ accountFlatBlockStreaming : unknown ,
56+ ) : IMessageStreamingConfig | undefined {
57+ const baseConfig = asStreamingConfigObject ( base ) ;
58+ const accountConfig = asStreamingConfigObject ( account ) ;
59+ const accountBlockEnabled = asOwnBooleanProperty ( accountConfig ?. block , "enabled" ) ;
60+ const flatAccountBlockEnabled =
61+ accountBlockEnabled === undefined && typeof accountFlatBlockStreaming === "boolean"
62+ ? accountFlatBlockStreaming
63+ : undefined ;
64+ const applyFlatAccountBlockEnabled = (
65+ config : IMessageStreamingConfig | undefined ,
66+ ) : IMessageStreamingConfig | undefined => {
67+ if ( flatAccountBlockEnabled === undefined || config === undefined ) {
68+ return config ;
69+ }
70+ return {
71+ ...config ,
72+ block : {
73+ ...config . block ,
74+ enabled : flatAccountBlockEnabled ,
75+ } ,
76+ } ;
77+ } ;
78+ if ( ! baseConfig || ! accountConfig ) {
79+ return applyFlatAccountBlockEnabled ( accountConfig ?? baseConfig ) ;
80+ }
81+ return applyFlatAccountBlockEnabled ( {
82+ ...baseConfig ,
83+ ...accountConfig ,
84+ ...( baseConfig . block || accountConfig . block
85+ ? {
86+ block : {
87+ ...baseConfig . block ,
88+ ...accountConfig . block ,
89+ ...( baseConfig . block ?. coalesce || accountConfig . block ?. coalesce
90+ ? {
91+ coalesce : {
92+ ...baseConfig . block ?. coalesce ,
93+ ...accountConfig . block ?. coalesce ,
94+ } ,
95+ }
96+ : { } ) ,
97+ } ,
98+ }
99+ : { } ) ,
100+ } ) ;
101+ }
102+
28103function mergeIMessageAccountConfig ( cfg : OpenClawConfig , accountId : string ) : IMessageAccountConfig {
29- return resolveMergedAccountConfig < IMessageAccountConfig > ( {
104+ const accountConfig = resolveIMessageAccountConfig ( cfg , accountId ) ;
105+ const merged = resolveMergedAccountConfig < IMessageAccountConfig > ( {
30106 channelConfig : cfg . channels ?. imessage as IMessageAccountConfig | undefined ,
31107 accounts : cfg . channels ?. imessage ?. accounts as
32108 | Record < string , Partial < IMessageAccountConfig > >
33109 | undefined ,
34110 accountId,
35111 } ) ;
112+ const streaming = mergeIMessageStreamingConfig (
113+ ( cfg . channels ?. imessage as Record < string , unknown > | undefined ) ?. streaming ,
114+ ( accountConfig as Record < string , unknown > | undefined ) ?. streaming ,
115+ ( accountConfig as Record < string , unknown > | undefined ) ?. blockStreaming ,
116+ ) ;
117+ return streaming !== undefined ? ( { ...merged , streaming } as IMessageAccountConfig ) : merged ;
36118}
37119
38120export function resolveIMessageAccount ( params : {
0 commit comments