import { type VcMeetingSharedConsumerCatalog, type VcMeetingSharedConsumerProfile } from '../global-config.js'; import type { VcMeetingConsumerProfileConfig } from '../types.js'; export type VcMeetingSharedConsumerCatalogFieldError = { path: string; message: string; }; export interface VcMeetingSharedConsumerCatalogSnapshot { revision: string; /** 区分「从没配置过」「显式清空」「有预设」三态,供 UI 决定空态文案。 */ catalogState: 'uninitialized' | 'explicit_empty' | 'profiles'; defaultMode: 'listenOnly' | 'agents'; defaultConsumerIds: string[]; profiles: VcMeetingSharedConsumerProfile[]; } export interface UpdateVcMeetingSharedConsumerCatalogInput { expectedRevision: string; defaultMode: 'listenOnly' | 'agents'; defaultConsumerIds: string[]; profiles: VcMeetingSharedConsumerProfile[]; } export type UpdateVcMeetingSharedConsumerCatalogResult = { ok: true; snapshot: VcMeetingSharedConsumerCatalogSnapshot; } | { ok: false; reason: 'config_conflict' | 'validation_failed' | 'config_unavailable'; fieldErrors?: VcMeetingSharedConsumerCatalogFieldError[]; error?: string; }; /** * 从没配置过共享目录时用的内置默认角色。 * * 之所以做在**读路径**而不是在 daemon 启动时写一份进配置:`mergeGlobalConfig` * 没有跨进程锁,fleet 里几十个 daemon 同时启动各写一次,丢的可能是别的顶层 * 配置项。读路径内置则零写盘、幂等,且 Dashboard 与 daemon 读的是同一个常量, * 页面上看到的就是每个 bot 进会后真正会跑的角色。 * * 注意与「显式清空」的区别:保存过 `profiles: []` 是持久的「所有 bot 都不要 * 角色」,不会被这份内置默认顶掉(见 catalogStateFromRaw 的三态)。 */ export declare const BUILTIN_VC_MEETING_SHARED_CONSUMER_CATALOG: VcMeetingSharedConsumerCatalog; /** * 逐条归一化:坏条目只丢自己,不连累整份目录。 * * `normalizeVcMeetingConsumerProfiles` 见到第一条坏数据就抛,整个数组一起没。 * 对**全局共享**目录来说这个失败面太大:手改配置时一个字段写错,全 fleet 的 * bot 会一起变成干听。逐条走一遍,坏的那条消失、好的照常生效——保存路径仍走 * 严格校验({@link validateVcMeetingSharedConsumerCatalog}),所以坏数据只会 * 从磁盘里来,且一保存就会被拦下并给出字段级错误。 * * 跨条目的检查(重复 id 等)在 resolver 而不在 normalizer 里,所以逐条归一化 * 不会漏掉任何单条校验。 */ export declare function normalizeVcMeetingConsumerProfilesForgiving(rawProfiles: readonly unknown[]): { profiles: VcMeetingConsumerProfileConfig[]; errors: string[]; }; /** * 用 bot-registry 的权威校验跑一遍目录。返回归一化后的条目,或字段级错误。 */ export declare function validateVcMeetingSharedConsumerCatalog(input: Pick): { ok: true; profiles: VcMeetingSharedConsumerProfile[]; } | { ok: false; fieldErrors: VcMeetingSharedConsumerCatalogFieldError[]; }; export declare function readVcMeetingSharedConsumerCatalogSnapshot(): VcMeetingSharedConsumerCatalogSnapshot; /** * 乐观并发替换共享目录。 * * revision 校验与写入之间没有 `await`,所以同进程内不存在竞态;跨进程用的是 * `mergeGlobalConfig` 的 tmp+rename 原子写(与其它全局设置一致)。 */ export declare function updateVcMeetingSharedConsumerCatalog(input: UpdateVcMeetingSharedConsumerCatalogInput): UpdateVcMeetingSharedConsumerCatalogResult; /** 便于测试/诊断:当前生效的配置文件路径。 */ export declare function vcMeetingSharedConsumerCatalogConfigPath(): string; //# sourceMappingURL=vc-meeting-shared-consumer-catalog-store.d.ts.map