/** * S-455 —— `GET /v1/capabilities` 的 `approvalsStreamLive` 位:**本部署的审批推送面带不带 live 事件族**。 * * ## 病 * S-454(7.87.0)给 `GET /v1/approvals/stream` 接上了**第二条 diff 源** —— `listLivePending`(与 * `GET /v1/approvals` 的 `livePending` 同一只读函数),事件另立两词 `live_pending` / `live_resolved`。 * 那条源的在场性挂在协调器上:`TOOL_APPROVAL_ENABLED=false` 的部署里 `ToolApprovalCoordinator` 根本不装配 * ⇒ 源整个缺席、流的字节与 S-454 之前逐字相同(能力缺席 = 零变化,不是空数组;见 `streamApprovals` 的 * `live` 参数注)。 * * 于是消费端(client-core 的 approvalsFeed / 运营面板)**判不出自己连的是哪一种**:两形都是一条正常开着、 * 正常心跳的 SSE,差别只在「某一类卡永远不会从推面来」。用「等不到帧」去推断能力缺席不是判据 —— 那正是 * S-454 立案时那个病的形状(代理静默卡一小时、屏上零提示),只是换到了消费端这一侧。探位就是为了把 * 「这台机器会不会推 live 卡」从一次运气变成一次读。 * * ## 形(与 `mcpReconnect` / `executionLane` 同族) * 布尔,谓词 = **两项合取**,逐项对着那条腿自己的在场判据写: * ① **审批底座**(`checkpointStore`)—— `/v1/approvals/*` 与 `/v1/assistant/*` 整域的挂载条件 * (`route-table.ts` 那一行的 `enabled`)。缺席 ⇒ 端点 404,**连流都不存在**; * ② **live 协调器**(`toolApproval`)—— 第二条 diff 源本人。缺席 ⇒ 端点在、但推面只有 durable park 行。 * 两项与路由/腿从**同一批 deps** 推导 ⇒「说 yes 但没有 live 帧」结构上不可能。 * * 🔴 **刻意不合并进 `approvals` 或 `toolApproval`**: * · `approvals` 答的是「这条车道在不在」(它为真而本位为假的部署是**常态**:没开工具审批的那些); * · `toolApproval` 答的是「活体工具审批 HITL 在不在」,与「那条 SSE 推不推 live 行」不是一回事 —— * 没有 checkpoint 底座的部署上它可以为真而**根本没有这条流**。 * 任一位单读都会对一半部署说谎,所以本位是它们的合取、而不是其中之一的别名。 * * ⚠️ **位为真只保证这条源在场**,不保证这一次有任何悬挂 ask、也不保证跨副本可见:live 半场是**进程内 * 投影**(与 `GET /v1/approvals` 的 `livePending` 逐字同限,非本件引入),durable park 行那一半才是 * 跨副本的。消费端据此渲「本机会推 live 卡」,不据此推断「别的副本上的卡也会到我这儿」。 */ import type { ToolApprovalCoordinator } from "../tool-approval.js"; /** * 部署席 → 消费端窄投影。形照 `projectExecutionLaneCapability`:**只 import 型**,不碰 config.ts / server.ts, * 于是本模块是叶。 * * 🔴 `toolApproval` 的形是 `Pick<…, "listLivePending">` 而不是 `unknown`:本位声明的是**那一只读函数** * 在场,而路由层递给 `streamApprovals` 的 `live` 参数是同一个 `Pick` —— 协调器哪天把这只函数改名, * 本文件与那条腿**一起**编译红,不会出现「位还说 true、腿已经没源了」。 */ export declare function projectApprovalsStreamLiveCapability(deps: { /** 审批底座(`/v1/approvals/*` 整域的挂载条件);形取 `unknown` —— 本位只问在场性,不碰店面。 */ readonly checkpointStore?: unknown; readonly toolApproval?: Pick | undefined; }): boolean; //# sourceMappingURL=approvals-push.d.ts.map