import type { ServiceConfig } from "../config-types.js"; import type { ReadFaceSource } from "../read-face-posture.js"; import type { Logger } from "../observability/logger.js"; import type { CenterReadFace, EffectiveConfig } from "./types.js"; /** * S-174 —— 哪些 center 键是**热换席**。判据**不是本仓的意见**:`KEY_MAP` 的 `cfgKey` 落在 core 的闭集 * `SWAPPABLE_DEP_SEATS` 里(经 `isSwappableDepSeat` 亲问)⇒ 这个键 refresh 期可换;否则它是 boot-baked * 座,只有重启能换。core 加/删可换席 ⇒ 本集合与 `read-face` restart 片的指纹**同时**跟着走,不留第二份 * 手抄表(restart-signal.ts 读的就是这一只)。 */ export declare const CENTER_READ_FACE_LIVE_KEYS: ReadonlySet; /** 本进程的**前 center** READ face 姿态(env / posture / 引擎默认)。`live` 相必带 —— 一次发布**撤回** * `face` 键时,活席要还原到它,而不是把上一份发布的档位无限期latch 住(那是这条轴上的 fail-OPEN 方向: * 组织把 `open` 撤回之后,worker 还在 open)。boot 相不需要:那一刻 `config` 上的值就是基线。 */ export interface ReadFaceBaseline { readonly readFace?: "open" | "roots"; readonly readFaceSource: ReadFaceSource; } /** 本次调用落在哪一相(见文件头注「一席热、三席重启」)。判别联合而不是可选字段:`baseline` 只在 * `live` 相有意义,写成可选就等于允许一次「没有基线的 live 调用」——那正是撤回臂会静默失效的形。 */ export type CenterReadFaceApply = { readonly phase: "boot"; } | { readonly phase: "live"; readonly baseline: ReadFaceBaseline; }; /** 调用回执。`envHeld` 同旧返回值(喂 `RestartSliceCtx.readFaceEnvHeld`);`faceChanged` 是 live 相的 * 换席信号 —— 真 ⇒ 调用方必须 `swapDeps({ readFace: config.readFace })` 一次,否则 config 与 Runner 分家。 */ export interface CenterReadFaceReport { readonly envHeld: readonly (keyof CenterReadFace)[]; readonly faceChanged: boolean; } /** * 应用 center 的 readFace 域(**boot-only**:调用点在 boot 拉取之后、`createRunnerDeps` 之前)。 * 缺席 ⇒ 零触碰。规则见文件头注 ①②③。 * * 返回值 = **本机 env 显式占住的 center 键名**(与本次发布内容无关的部署事实)。调用方把它喂给 * `RestartSliceCtx.readFaceEnvHeld`,`read-face` restart 片于是只指纹「真会 boot-bake 的那部分」—— * 否则 center 改一个本机永远用不上的键,整片 fleet 会为一次对自己毫无影响的发布滚动重启一遍 * (codex 交叉复审 finding 2,验真后采纳的那一半)。 */ export declare function applyCenterReadFace(config: ServiceConfig, eff: EffectiveConfig, logger?: Logger, apply?: CenterReadFaceApply): CenterReadFaceReport; //# sourceMappingURL=read-face.d.ts.map