/** * 飞书应用真·改名 / 真·改头像 —— 复用 `botmux setup` 的开放平台自动化机制 * (缓存的飞书 Web 登录态 + console 内部 `/developers/v1/*` 接口),把 dashboard * 的「机器人改名 / 改头像」落到飞书应用本身,而不只是 botmux 侧展示。 * * 实测链路(2026-07-04 在测试 app 上打通;先读后写,读取/解析失败零副作用): * 1. `app/:clientId` — 读当前基础信息(langs / primaryLang / i18n / desc) * 2. `visible/online/:clientId` — 读**线上版本**的可见范围(白/黑名单)并 * fail-closed 解析;`app_version/list` 算下一个版本号 * 3. `base_info/:clientId` — 写新名字(所有已配语言的 name 都改,desc 保留) * 4. `app_version/create`(可见范围原样镜像线上版本,绝不收窄/放宽) * → `publish/commit` * 关键事实:只改基础信息时,群里 bot 显示名**不会**变——它跟随已发布版本; * 必须建新版本并发布(自建应用租户内秒过审)后 `/bot/v3/info` 才返回新名。 * * 失败面(全部结构化返回,调用方降级为仅改 botmux 展示名): * • unsupported_brand — console 自动化只支持 feishu.cn 租户 * • no_session — 服务器上没有可用的飞书 Web 登录态(要跑 botmux setup 扫码) * • session_expired — 登录态失效 / 开放平台页面拿不到 csrfToken * • no_access — 当前登录账号不是该应用的协作者(console code=10003) * • api_error — 其余 console API 失败(含审核中无法建版等) */ import { type OpenPlatformClientResult, type StoredCookie } from '../setup/open-platform-automation.js'; import { type Brand } from '../im/lark/lark-hosts.js'; export type OpenPlatformRenameFailureReason = 'unsupported_brand' | 'no_session' | 'session_expired' | 'no_access' | 'api_error'; export type OpenPlatformRenameResult = { ok: true; name: string; versionId?: string; } | { ok: false; reason: OpenPlatformRenameFailureReason; message: string; }; /** 测试注入缝:cookie 加载与 console client 构造都可替换。 */ export interface OpenPlatformRenameDeps { loadCookies?: () => StoredCookie[] | null; clientFactory?: (cookies: StoredCookie[]) => Promise; } /** * 把飞书应用改名并发布新版本让群内显示名生效。名字会写到应用已配置的**每种 * 语言**(用户输入什么就统一显示什么),描述等其余基础信息保持不变。 */ export declare function renameBotOnOpenPlatform(appId: string, newName: string, brand: Brand | undefined, deps?: OpenPlatformRenameDeps): Promise; export type OpenPlatformAvatarResult = { ok: true; avatarUrl: string; versionId?: string; } | { ok: false; reason: OpenPlatformRenameFailureReason | 'invalid_image'; message: string; }; /** console 图片上传链路只实测过 512×512 PNG(上传表单的 scale 也如此声明), * 收紧到这一种形态——前端上传前会用 canvas 归一化,非法输入在这里兜底拒绝。 */ export declare const AVATAR_IMAGE_SIZE = 512; export declare const AVATAR_IMAGE_MAX_BYTES: number; /** PNG 魔数 + IHDR chunk 结构(长度/类型/CRC)+ 尺寸校验。只认魔数会把 * offset 16/20 上伪造尺寸、实际没有 IHDR 的字节流放进 console 上传;CRC * 校验(覆盖 chunk 类型+数据,PNG 规范)把手工拼接的伪头也挡在本地 400。 */ export declare function validateAvatarPng(data: Buffer): { ok: true; } | { ok: false; message: string; }; /** * 把飞书应用头像换成给定图片并发布新版本让群内头像生效。链路与改名同款: * 先上传图片到 console 拿 url(对应用本身无副作用),再全量回写 base_info * (名字/描述/i18n 原样保留 + 新 avatar),最后镜像线上可见范围建版发布。 */ export declare function changeBotAvatarOnOpenPlatform(appId: string, image: Buffer, brand: Brand | undefined, deps?: OpenPlatformRenameDeps): Promise; //# sourceMappingURL=open-platform-rename.d.ts.map