import { type AdoptionLogStore } from "../plugins/adoption-log-sql.js"; import type { SqlDialect } from "../plugins/sql-driver.js"; import { type AdoptionReceipt, type AdoptionRejectCode } from "./wire.js"; /** 冲突表族的逐项读数(进 409 响应体;运维据此知道**该去清理哪张表**,不是一句「冲突了」)。 */ export interface AdoptionConflict { /** 腿标识(`<表名>#<身份轴>`)。 */ leg: string; table: string; /** 目的地侧与源侧共享同一逻辑键的行对数(>0 即冲突)。 */ overlapping: number; } /** 收编弧的三种结局。**回执与拒绝分家**:拒从不产出 200 回执(183 §7.3 拒绝可判别)。 */ export type AdoptionOutcome = { kind: "receipt"; adoptionId: string; receipt: AdoptionReceipt; } | { kind: "rejected"; code: AdoptionRejectCode; adoptionId: string; detail: string; conflicts: AdoptionConflict[]; } | { kind: "source_already_bound"; adoptionId: string; fromPrincipal: string; boundTo: string; }; export interface AdoptionRunnerDeps { store: AdoptionLogStore; dialect: SqlDialect; /** 注入时钟(测试要确定性;生产传 `Date.now`)。 */ now: () => number; /** 锁轮询次数/间隔——测试把它调到 1 次好确定性地打到「取不到锁」那条臂。 */ lockAttempts?: number; lockSleepMs?: number; logger?: { info?(msg: string, meta?: unknown): void; warn?(msg: string, meta?: unknown): void; }; } export interface AdoptionRunner { start(fromPrincipal: string, toPrincipal: string): Promise; get(adoptionId: string): Promise; /** I6 server 同族:副本 boot 的在飞扫描(续跑或响亮拒,禁静默跳过)。 */ resumeInFlight(): Promise<{ resumed: string[]; stalled: string[]; rejected: string[]; failed: string[]; }>; } export declare function createAdoptionRunner(deps: AdoptionRunnerDeps): AdoptionRunner; //# sourceMappingURL=runner.d.ts.map