import type { ChatError, Message, SendMessageOptions } from '../types.js'; export declare function useCurrentChat(): { messages: Message[]; isStreaming: boolean; isThinking: boolean; error: ChatError | null; /** * 发一条用户消息。**返回这条消息的 `clientMsgId`**。 * * 它就是**帧上的 `client_msg_id`**,即 gw#1587 `message_receipt` 回执所对应的那个 id。 * 这正是它被返回出来的原因:Brief 决策档的契约(agentic-chat * `docs/coo-redesign/TIMELINE-CONTRACT-DELTA.md` 总纲 ②)逐字要求「决策指令 MUST 带 * `client_msg_id`,发送成功 := 收到**对应**的 `message_receipt` 后才 PATCH」——调用方 * 得先知道「对应」的是哪一个。 * (⚠️ 宿主若实现了 `ChatProvider.onBeforeSend` 并改写出站帧上的 `client_msg_id`, * 这条对应关系就断了——那是宿主自找的,SDK 不防。) * * **帧进 outbox 时**,同一个 id 还同时是:`Message.deliveryState` 的索引键 * (`pending` / `delivered` / `failed`)与 `retryMessage(messageId)` 的入参。 * ⚠️ 帧**没**进 outbox 时(下面 ① ②)两者都不成立:`deliveryState` 恒 `undefined` * (既不是 pending 也不是 failed),`retryMessage()` 恒返 `false`。 * * 🔴 **拿到 id ≠ 一定会等到 `delivered`。** 唯一可靠的不变量是: * * > **凡 outbox 把条目判 `failed`,receipt 就不会再来**——`FailedCause` 今天有 * > **6 个**取值(`arm_timeout` / `disarm` / `conn_terminal` / `terminal` / * > `timeout_exhaust` / `transient_exhaust`,见 `delivery-outbox.ts`),且这个集合会长。 * * ⇒ 调用方**必须**:① 用 `session_ready.session.supportsMessageReceipt` 能力位 gate * (契约:未武装时直接禁用决策按钮,不设启发式降级判据)。**SDK 没有暴露这个位的专用 * hook**——`useSession()` 不含它、`GatewayClient.isDeliveryArmed()` 拿不到实例;经 * `ChatProvider.onRawEvent` 观测 `session_ready` 自存一份即可(类型在 gateway-protocol * 的 `SessionInfo` 上)。② **同时监听 * `Message.deliveryState === 'failed'`**,别只等 `delivered`,否则 UI 永久 pending。 * * 收不到 receipt 的**典型例子**(不是穷举,别拿它做判断依据): * ① `content` 为空(纯附件发送)——帧上根本不附 `client_msg_id`,也不进 outbox; * ② 连接 `disarmed`(旧 gateway / repos-null 拓扑)——`GatewayClient` 把 id 剥掉直发; * ③ arm 判定期入队、随后判定落 disarmed——帧一次都没离开客户端(`arm_timeout`/`disarm`); * ④ 连接终局(重连耗尽 / 显式断开)——帧可能已出网(`conn_terminal`); * ⑤ **额度耗尽 / guardrail 拦截**(`terminal`)——注意这条下**能力位是 true、内容非空、 * 连接健康**,上面 ①–④ 一条都不成立,只有 `failed` 观测得到; * ⑥ ack 超时三次 / transient 预算耗尽(`timeout_exhaust` / `transient_exhaust`)。 * * 发送失败时抛错、无返回值(`client.send()` 返 `false` ⇒ 本函数抛 * `Error('Failed to send message')`),调用方本就要 catch。 */ sendMessage: (content: string, options?: SendMessageOptions) => Promise; abort: () => void; resetConversation: () => Promise; loadHistory: () => Promise; hasMoreHistory: boolean; isLoadingHistory: boolean; /** gw#1587:重试 failed 消息(messageId = 消息 id = client_msg_id)。 */ retryMessage: (messageId: string) => boolean; }; //# sourceMappingURL=use-current-chat.d.ts.map