/** * Layer 2 根修:LLM 流消费可中断(race abortSignal)。 * 见 specs/fix-sdk-runner-interruptible.md §3 方案 C。 * * 这是 codex `tokio::select!`(`client.rs:1969`)的 TS 等价物: * TS 的 `for await` 无法在中途被打断,但底层 `reader.read()` / `iter.next()` * 返回 Promise,可与 abortSignal `Promise.race`——abort 一触发,挂起的 await * 立即 reject,使永不 emit 的 LLM 流(llm.hang)上的 SDK agent.run() promise * 及时 settle → Effect 纤程干净 unwind(Layer 1 的 1s timeout 兜底不再触达)。 * * 上游对照:codex select! race、claude-code 90s idle watchdog、wave-agent * chunk 间轮询——四项目共识「cancel 不 await graceful + 信号到 I/O + timeout 兜底」, * sirius 唯一缺口即流消费不显式 race abort,本模块补上。 */ /** * 标准化 abort 错误。name="AbortError" 与 sdk-runner `errorAgentQueryResult` * 的 `err.name === "AbortError"` 判定对齐,使 abort 路径最终收敛为 aborted 结果 * 而非 error(见 agent.ts catch → errorAgentRunResult)。 */ export declare class AbortError extends Error { readonly name = "AbortError"; constructor(reason?: unknown); } export declare function isAbortError(error: unknown): boolean; /** * 让 promise `p` 与 abortSignal race:abort 一触发立即 reject(AbortError)。 * - signal 为 undefined:直接透传 p(无 abort 能力,保持原行为)。 * - signal 已 aborted:立即 reject,不等待 p。 * - signal pending:Promise.race;p 先 settle 则透传其结果(成功或失败), * 且移除 abort listener;abort 先触发则 reject AbortError。 * * 已 settle 的 p 不受后续 abort 影响(竞态赢家固定)。 * * 用于 chat-completions.ts 的 reader.read() race(点1,主修):llm.hang(body 永不 emit) * 场景下 fetch signal 对已建立连接的 reader 传播不可靠,race 保证 abort 一触发 * read() 立即 reject → 流以 error 结束 → agent.run() settle → 纤程 unwind。 */ export declare function raceAbort(signal: AbortSignal | undefined, p: Promise): Promise;