/** * 晚绑席(S-151 十段切分的**唯一**跨段可变面)—— 四只 cell,读点在前段、写点在后段。 * * 为什么是模块级 live binding 而不是 ctx 字段:读点的原文是**裸标识符**(`() => runStore`、 * `() => parkedAskRedeem`),而 ctx 字段是**快照** —— 把读点改成 `ctx.runStore` 就是正文改写, * 而本刀的律是字节不变(`scripts/move-only-check.mjs`)。ESM 的 `import` 对 `let` 是 **live 读**, * 于是读点一个字都不改就能拿到后段写进来的值。写点分两形: * · `runStore` / `rateLimiter` —— 声明行留在第 7 段原位,紧随一行 `bindX(...)` 把值交过来; * · `parkedAskRedeem` / `runDenySweep` —— 它们的**声明行本身**就是 `let`(逐字搬进本文件,含缩进), * 赋值点(server 造出来之后那两处)也随之搬进 `bindServerLateSeats` —— 跨模块给 import 赋值是非法的, * 所以 cell 与它的写点必须同居一个模块。 * * 时序与修前逐字相同:四只 cell 的读点全是 `() => x` 取值闭包(boot 期不求值,最早的求值发生在 * listen 之后的请求/tick 上),写点仍在各自原来的那一拍。未绑窗内取值得到 `undefined` —— 这正是 * 各消费座既有的 fail-closed 臂(device 限速座:`gate()` 取不到就抛,见 boot/device-lane.ts:68)。 */ import type { Logger } from "../observability/logger.js"; import type { ParkedAskRedeem } from "../tool-approval.js"; import type { RateGate } from "../observability/rate-limit.js"; import type { ServiceConfig } from "../config.js"; import type { StoreBackend } from "../plugins/store-backend.js"; import type { createHttpServer } from "../http/server.js"; declare let runStore: ReturnType | undefined; declare let rateLimiter: RateGate | undefined; declare let parkedAskRedeem: ParkedAskRedeem | undefined; declare let runDenySweep: ((now: number) => Promise) | undefined; export { runStore, rateLimiter, parkedAskRedeem, runDenySweep }; export declare function bindRunStore(v: ReturnType | undefined): void; export declare function bindRateLimiter(v: RateGate): void; export declare function bindServerLateSeats(ctx: { config: ServiceConfig; logger: Logger; server: ReturnType; }): void; //# sourceMappingURL=late-binds.d.ts.map