Spaces:
Paused
Paused
| import type { OpenClawConfig } from "../../config/config.js"; | |
| import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../../routing/session-key.js"; | |
| type ChannelSectionBase = { | |
| name?: string; | |
| accounts?: Record<string, Record<string, unknown>>; | |
| }; | |
| function channelHasAccounts(cfg: OpenClawConfig, channelKey: string): boolean { | |
| const channels = cfg.channels as Record<string, unknown> | undefined; | |
| const base = channels?.[channelKey] as ChannelSectionBase | undefined; | |
| return Boolean(base?.accounts && Object.keys(base.accounts).length > 0); | |
| } | |
| function shouldStoreNameInAccounts(params: { | |
| cfg: OpenClawConfig; | |
| channelKey: string; | |
| accountId: string; | |
| alwaysUseAccounts?: boolean; | |
| }): boolean { | |
| if (params.alwaysUseAccounts) { | |
| return true; | |
| } | |
| if (params.accountId !== DEFAULT_ACCOUNT_ID) { | |
| return true; | |
| } | |
| return channelHasAccounts(params.cfg, params.channelKey); | |
| } | |
| export function applyAccountNameToChannelSection(params: { | |
| cfg: OpenClawConfig; | |
| channelKey: string; | |
| accountId: string; | |
| name?: string; | |
| alwaysUseAccounts?: boolean; | |
| }): OpenClawConfig { | |
| const trimmed = params.name?.trim(); | |
| if (!trimmed) { | |
| return params.cfg; | |
| } | |
| const accountId = normalizeAccountId(params.accountId); | |
| const channels = params.cfg.channels as Record<string, unknown> | undefined; | |
| const baseConfig = channels?.[params.channelKey]; | |
| const base = | |
| typeof baseConfig === "object" && baseConfig ? (baseConfig as ChannelSectionBase) : undefined; | |
| const useAccounts = shouldStoreNameInAccounts({ | |
| cfg: params.cfg, | |
| channelKey: params.channelKey, | |
| accountId, | |
| alwaysUseAccounts: params.alwaysUseAccounts, | |
| }); | |
| if (!useAccounts && accountId === DEFAULT_ACCOUNT_ID) { | |
| const safeBase = base ?? {}; | |
| return { | |
| ...params.cfg, | |
| channels: { | |
| ...params.cfg.channels, | |
| [params.channelKey]: { | |
| ...safeBase, | |
| name: trimmed, | |
| }, | |
| }, | |
| } as OpenClawConfig; | |
| } | |
| const baseAccounts: Record<string, Record<string, unknown>> = base?.accounts ?? {}; | |
| const existingAccount = baseAccounts[accountId] ?? {}; | |
| const baseWithoutName = | |
| accountId === DEFAULT_ACCOUNT_ID | |
| ? (({ name: _ignored, ...rest }) => rest)(base ?? {}) | |
| : (base ?? {}); | |
| return { | |
| ...params.cfg, | |
| channels: { | |
| ...params.cfg.channels, | |
| [params.channelKey]: { | |
| ...baseWithoutName, | |
| accounts: { | |
| ...baseAccounts, | |
| [accountId]: { | |
| ...existingAccount, | |
| name: trimmed, | |
| }, | |
| }, | |
| }, | |
| }, | |
| } as OpenClawConfig; | |
| } | |
| export function migrateBaseNameToDefaultAccount(params: { | |
| cfg: OpenClawConfig; | |
| channelKey: string; | |
| alwaysUseAccounts?: boolean; | |
| }): OpenClawConfig { | |
| if (params.alwaysUseAccounts) { | |
| return params.cfg; | |
| } | |
| const channels = params.cfg.channels as Record<string, unknown> | undefined; | |
| const base = channels?.[params.channelKey] as ChannelSectionBase | undefined; | |
| const baseName = base?.name?.trim(); | |
| if (!baseName) { | |
| return params.cfg; | |
| } | |
| const accounts: Record<string, Record<string, unknown>> = { | |
| ...base?.accounts, | |
| }; | |
| const defaultAccount = accounts[DEFAULT_ACCOUNT_ID] ?? {}; | |
| if (!defaultAccount.name) { | |
| accounts[DEFAULT_ACCOUNT_ID] = { ...defaultAccount, name: baseName }; | |
| } | |
| const { name: _ignored, ...rest } = base ?? {}; | |
| return { | |
| ...params.cfg, | |
| channels: { | |
| ...params.cfg.channels, | |
| [params.channelKey]: { | |
| ...rest, | |
| accounts, | |
| }, | |
| }, | |
| } as OpenClawConfig; | |
| } | |