@acosmi/sdk-ts 2.14.0 → 2.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,38 @@ All notable changes to `@acosmi/sdk-ts` will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.16.0] - 2026-08-06 — chat 超时预算真正下传 + 流式活性回调
9
+
10
+ **一个预算只有在被传下去时才存在。** `chat` / `chatMessagesAnthropic` / `chatMessagesOpenAI` 三条推理链路都用 `withRequestTimeout(CHAT_REQUEST_TIMEOUT_MS)` 建了 11 分钟的外层预算,却只把 `ctl.signal` 传给 `doJSONFullRaw` —— 后者的 `timeoutMs` 形参有 **30 秒**默认值,会**另建**一个计时器并恒先于外层触发。于是 v1.6.0 那次"调整为 11min 以容纳 DeepSeek 保活窗口"的改动,**一天都没生效过**,而它上方的注释还在声称它已生效。
11
+
12
+ 这不是理论缺陷。生产网关单日 **29 条** latency 落在 27 831–30 046 ms 的 499(客户端主动断开),横跨 **4 个厂商 5 个模型**;受害最重的恰是各客户端的默认主循环模型 —— 也正是唯一拿到网关 11 分钟长首字节预算的那个 provider。它拿着最宽的服务端预算,死得最惨,因为杀它的计时器在客户端。真实用户主动取消的 latency 是随机的(1 294 / 1 575 ms),与这一串高度聚集的 30 秒在同一张表里一眼可分。
13
+
14
+ ### Fixed
15
+
16
+ - **`chat` / `chatMessagesAnthropic` / `chatMessagesOpenAI` / `generateVideo` 显式下传 `CHAT_REQUEST_TIMEOUT_MS`** —— 与同文件 `embeddings` / `rerank` / `generateImage` 三个一直正确的兄弟调用对齐。`generateVideo` 此前连外层预算都没有,同样被钉在 30 秒;现按其直接兄弟 `generateImage` 的形状修复(单次网络操作,不另加外层 controller)。
17
+ - **`Client.chat` 上方那条 v1.6.0 注释重写** —— 它描述的是一个从未交付的行为。注释与实测冲突时以实测为准,且必须同 PR 修掉;留着它就是给下一个读代码的人埋雷。
18
+
19
+ ### Added
20
+
21
+ - **`CHAT_REQUEST_TIMEOUT_MS` 导出** —— 供回归闸门按**符号**断言,避免测试抄字面量后与真源各自漂移(抄件断言恒绿 = 零覆盖)。消费方要更短的预算传 `signal` 即可,`withRequestTimeout` 取二者先到者。
22
+ - **`UpstreamActivityCallback` + `chatStream` / `chatMessagesStream` 的第 4 个可选实参 `onUpstreamActivity`** —— 消费方的流空闲看门狗判据是"多久没收到事件",但 SSE 上有两类**有字节、无事件**的情形对它完全失明:① 上游/网关推理前发的保活注释行被 `isSSECommentLine` 吞掉;② OpenAI 格式下 converter 对某些 data 行返回零事件。**心跳只有在抵达做判决的那一层时才叫心跳** —— 网关补心跳而 SDK 吞掉,等于没补。本回调对每一条 SSE 行触发一次(含注释行),早于任何过滤与解析;回调抛错被吞掉且不中断流(旁路信号不该有能力杀死主链路)。不传时行为逐字节不变。
23
+
24
+ ### 回归闸门
25
+
26
+ - `test/chat-timeout-budget.test.ts` —— 四条链路的**行为**断言(活过 30 秒、死在 `CHAT_REQUEST_TIMEOUT_MS`),外加一条 **default-deny 结构闸门**:`doJSONFullRaw` 的每个调用点必须显式传预算,控制面端点要豁免须进具名 allowlist 并写明理由。附负向对照,防扫描器坏掉后闸门恒绿。
27
+ - `test/stream-upstream-activity.test.ts` —— 判据是"第一个事件到达前已有 ≥3 次活性",只可能由 3 条保活注释行产生;刻意不用"活性次数 > 事件数",那条在注释行根本没进循环时会假绿。
28
+
29
+ ## [2.15.0] - 2026-08-02 — sources 四态分类与零结果契约
30
+
31
+ ### Added
32
+
33
+ - **`classifySourcesEvent`** — 同时识别 SSE event name 与 JSON payload discriminator,明确返回 `not_sources`、`empty_sources`、`sources` 或 `malformed_sources`,不再把合法零来源与结构损坏混为同一个状态。
34
+ - **`SourcesEventParseResult` / `SourcesEventIssueCode`** — 为 JSON、数组、item、title、URL、snippet 和 session id 提供稳定机器码;未知额外字段保持兼容。
35
+
36
+ ### Changed
37
+
38
+ - **`parseSourcesEvent` 保持逐行为向后兼容** — 保留既有宽松解析、`null` 条件和返回对象形状;新调用通过四态 API 获得严格语义,既有 `chatStreamWithUsage` consumer 零变化。
39
+
8
40
  ## [2.14.0] - 2026-08-02 — inputModalities 开放值域归一 (open modality domain)
9
41
 
10
42
  模态标签的值域由**网关托管模型目录**持有,靠运营动作扩张(`video` 自 2026-06-20 起已是合法值),不靠发 SDK 新版。此前 SDK 在两处把它当成封闭集处理:`InputModality` 类型只列 `text|image`,且 `input_modalities`(snake_case)归一化分支按这份硬编码集裁剪数组——而 camelCase 分支从不裁剪。线上 wire 恒为 camelCase,所以那个过滤器从未真正执行过(死代码),但它把错误语义写进了契约。本版收敛为对称透传,并把数据字段的类型开放。
@@ -975,6 +1007,7 @@ Additive minor。公开类型 / 方法签名零移除、零改名。契约见 `d
975
1007
  - 36/36 vitest 全绿,源码 typecheck/lint/build 0 错误
976
1008
  - 翻车机制:`prepublishOnly` 仅跑源码 typecheck/vitest/build,不验证 packed product 在 consumer 视角能否解析
977
1009
 
1010
+ [2.15.0]: https://github.com/acosmi/sdk-ts/releases/tag/v2.15.0
978
1011
  [2.14.0]: https://github.com/acosmi/sdk-ts/releases/tag/v2.14.0
979
1012
  [2.13.0]: https://github.com/acosmi/sdk-ts/releases/tag/v2.13.0
980
1013
  [2.12.0]: https://github.com/acosmi/sdk-ts/releases/tag/v2.12.0
package/README.md CHANGED
@@ -7,7 +7,8 @@
7
7
  ## 状态
8
8
 
9
9
  - **主实现 / 事实标准**:本 TS SDK 现为 Acosmi SDK 的主力实现。Go SDK [acosmi-sdk-go](https://github.com/acosmi/acosmi-sdk-go) 已暂停维护,待 TS 稳定后再从 TS 反向翻译补齐。
10
- - **当前版本:`2.6.0`**(订阅会员查询 + 一批后端契约类型修正 + WS 一次性 ticket 鉴权,2026-06-04)。
10
+ - **当前版本:`2.15.0`**(sources 四态分类与零结果兼容契约,2026-08-02)。
11
+ - **`v2.15.0`(加性兼容发布)**:新增 `classifySourcesEvent()`、`SourcesEventParseResult` 与稳定 issue code,把 `not_sources`、合法 `empty_sources`、非空 `sources`、`malformed_sources` 明确分开。既有 `parseSourcesEvent()` 的代码路径、宽松判定、`null` 条件和返回对象形状保持原样;现有 consumer 无需改动,新 consumer 才选择严格 API。
11
12
  - **`v2.6.0`(会员订阅查询 + 类型修正,2026-06-04)**:新增 `subscription.getMembership()` / `getSubscriptionTier()` / `subscriptionPrecheck()`;`ManagedModel` 补档位门控字段(`locked`/`freeTier`/`minPlanTier`/`chatRuntimeSupported`/`defaultToolIds`);auth 新增 `ScopeChatBridge`(+read/write/rotate) 与 `chatBridgeScopes()`。**破坏性类型修正**:`BalanceDetail` 形状对齐网关 `InternalBalanceResponse`、`Order` 拆为 `BuyResponse`/`OrderListItem`、`getOrderStatus`/`waitForPayment` 改用 `BuyResponse.paymentStatus`(修死循环)、`PayPayload.payMethod`→`paymentMethod`、`TokenPackage` 对齐 `toProductView`、`WalletStats`/`Transaction` `amount` 由 string 改 number、consume-records 分页修正、notifications WebSocket 用一次性 `stream-ticket` 取代 URL `?token=` JWT。废弃 `listUserSubscriptions`(改用 `getMembership`)、`ModelCoefficient`/`listCoefficients`(系数退役恒空)、`ManagedModel.pricePerMTok`/`isDefault`(公开端点不返回);notifications 设备/偏好方法标 `@experimental`。详见 CHANGELOG。
12
13
  - **`v2.5.1`(格式一致性护栏,2026-05-31)**:`getAdapterForModel` 路由加固 —— `preferred_format` 现仅在**确被 `supported_formats` 收录**时才采信(或 `supported_formats` 未声明时维持原样)。防止上游元数据漂移(如 `preferred_format=anthropic` 但 `supported_formats=[openai]`)把 SDK 路由到模型并不支持的格式端点,撞 `/anthropic`「未绑定 Anthropic」4xx。`supported_formats` 为空/未知(旧上游)时**行为逐字节不变**。新增 3 条 routing 用例钉死矛盾场景。
13
14
  - **`v2.5.0`(健康度审计根因修复,2026-05-31)**:源码深度审计后修复一批真实运行时缺陷 —— `agentRuns.downloadArtifact()` 超限不再静默截断而是抛错;本地工具回调 `Promise.race` 硬超时(忽略 `signal` 的 handler 也不再永挂);OpenAI 流式 `reasoning_content` 后直接 `tool_calls`(无 text)时 block index 不再错乱;非法 `expires_at` 视为过期 + TokenStore 形状校验;OAuth 发现/注册/换/吊销链路统一走注入 `fetchImpl`;空成功响应(204)不再抛 JSON parse error;`apiBaseURL`/`complianceBaseURL` 与 gateway base 同级校验(拒 ws/wss/query/hash);非流式请求默认超时;WebSocket 重复 connect 先关旧连接;`FileTokenStore.save()` 真 fsync;chat 请求对象不再被原地 mutate;Anthropic `extraBody` 不能覆盖 SDK 管理字段。**公开类型/方法签名零移除、零改名**(新增导出 `normalizeOverrideBaseURL` / `DEFAULT_API_TIMEOUT_MS`)。casehall/finance/enterprise 业务域路径经生产实证确认正确(同源代理直连 tk-dist),**未改**,并新增 URL 组装回归测试钉死契约。
@@ -289,6 +290,57 @@ for await (const ev of stream) {
289
290
 
290
291
  `chatStreamWithUsage()` 返回带 usage/error/sources 标签的 AsyncIterable,便于聚合统计(详见 `src/core/client.ts`)。
291
292
 
293
+ ### 上游活性回调 `onUpstreamActivity`(v2.16+)
294
+
295
+ 如果你的集成层自带**流空闲看门狗**("多久没收到事件就判定连接死了"),必须接这个回调,否则看门狗会误杀健康连接。
296
+
297
+ SSE 上有两类**有字节、无事件**的情形,看门狗对它们完全失明:
298
+
299
+ 1. 上游(如 DeepSeek)与网关在开始推理前发的保活注释行 `: keep-alive` —— 按 SSE 规范它们不构成事件,被 `isSSECommentLine` 跳过;
300
+ 2. OpenAI 格式下 converter 对某些 data 行返回零事件。
301
+
302
+ 两种情形连接都健康、字节都在流动。**心跳只有在抵达做判决的那一层时才叫心跳** —— 网关补了心跳而 SDK 吞掉,等于没补。
303
+
304
+ ```ts
305
+ let lastActivity = Date.now();
306
+
307
+ const stream = client.chatMessagesStream(
308
+ modelId,
309
+ { messages, max_tokens: 4096 },
310
+ abortSignal,
311
+ () => { lastActivity = Date.now(); }, // ← 每条 SSE 行触发一次,含注释行
312
+ );
313
+ ```
314
+
315
+ 语义是「链路刚刚有动静」,不是「来了一个事件」;对每条 SSE 行触发一次,早于任何过滤与解析。回调抛出的错误会被吞掉且不中断流(旁路信号不该有能力杀死主链路)。不传时行为逐字节不变。
316
+
317
+ ### Sources SSE 四态分类(v2.15+)
318
+
319
+ `sources: []` 是检索成功但没有可展示引用的合法零结果,不是传输损坏。需要精确区分状态的新 consumer 使用加性接口 `classifySourcesEvent()`:
320
+
321
+ ```ts
322
+ import { classifySourcesEvent, type StreamEvent } from '@acosmi/sdk-ts';
323
+
324
+ function consume(event: StreamEvent) {
325
+ const result = classifySourcesEvent(event);
326
+ switch (result.kind) {
327
+ case 'not_sources':
328
+ return; // 交给其他 SSE 事件处理器
329
+ case 'empty_sources':
330
+ return; // 合法 no-op;不得升级为 turn/runtime fatal
331
+ case 'sources':
332
+ renderSources(result.value.sources);
333
+ return;
334
+ case 'malformed_sources':
335
+ recordCompatibilityCode(result.code); // 只记录稳定机器码,不记录来源内容
336
+ }
337
+ }
338
+ ```
339
+
340
+ 分类器同时识别 SSE `event: sources` 和 JSON payload `type: "sources"`,校验数组、item、`title`、`url`、可选 `snippet` 与 `session_id` 的类型,并允许未知额外字段。JSON 无法解析但 SSE 已声明为 sources 时返回 `malformed_sources/invalid_json`。
341
+
342
+ `parseSourcesEvent()` 保留给既有集成:它仍按历史宽松规则解析,空数组、缺失数组、非 sources 或 JSON 损坏仍返回 `null`,非空时仍只返回 `{ sources, session_id }`。它没有改为调用严格分类器,避免严格字段校验改变旧 consumer 对历史/第三方 frame 的接受范围。升级到 2.15.0 不要求关联方迁移;只有需要四态语义的调用方才采用新 API。
343
+
292
344
  ## Agent Runs
293
345
 
294
346
  `client.agentRuns` 是下游产品接入 Acosmi 云端智能体循环的正式 SDK 边界。CrabDesign、CrabCode、CrabClaw 等产品应通过这里创建、流式消费、取消、查询和下载智能体任务,不要直连 Nexus 内部 `/api/v4/chat/completions`。
@@ -1072,7 +1124,17 @@ npm run docs # 经 TypeDoc 生成 API 参考到 docs/api/
1072
1124
 
1073
1125
  | 版本 | 状态 | 概要 |
1074
1126
  | --- | --- | --- |
1075
- | 2.6.0 | **当前版本** | **会员订阅查询 + 一批后端契约类型修正 + WS 一次性 ticket 鉴权(2026-06-04)**。**新增**:`subscription.getMembership()` / `getSubscriptionTier()` / `subscriptionPrecheck()`;`ManagedModel` 档位门控字段 `locked`/`freeTier`/`minPlanTier`/`chatRuntimeSupported`/`defaultToolIds`;auth `ScopeChatBridge`(+read/write/rotate) `chatBridgeScopes()`。**破坏性类型修正**(此前形状与后端不符、运行时即为 undefined):`BalanceDetail` 对齐网关 `InternalBalanceResponse`(`userId`/`tokenRemaining`/`tokenTotal`/`callRemaining`/`callTotal`/`entitlements[]`);`Order` 拆为 `BuyResponse`/`OrderListItem`;`getOrderStatus`/`waitForPayment` 改用 `BuyResponse.paymentStatus`(修死循环);`PayPayload.payMethod`→`paymentMethod` + 枚举 `WECHAT_NATIVE`/`ALIPAY_PRECREATE`/`BANK_TRANSFER` + `deviceId`/`clientRequestId`;`TokenPackage` 对齐 `toProductView`;`WalletStats`/`Transaction` `amount` string→number;consume-records 分页(`records`/`total`/`page`/`pageSize`);`EntitlementItem.createdAt` 改可选 + `activatedAt`;`ConsumeRecord` 补缓存字段;notifications WebSocket 用一次性 `stream-ticket` 取代 URL `?token=` JWT(修复 WS 鉴权 + 杜绝 JWT 泄露)。**废弃**:`listUserSubscriptions`(改用 `getMembership`)/ `ModelCoefficient`·`listCoefficients`(系数退役恒空)/ `ManagedModel.pricePerMTok`·`isDefault`(公开端点不返回);notifications `registerDevice`/`unregisterDevice`/`list`+`updateNotificationPreference` `@experimental`(网关无端点)。详见 CHANGELOG。 |
1127
+ | 2.16.0 | **当前版本** | **chat 超时预算真正下传 + 流式活性回调(2026-08-06)**。`chat` / `chatMessagesAnthropic` / `chatMessagesOpenAI` / `generateVideo` 此前漏传 `doJSONFullRaw` 的第 5 实参,内层 **30 秒**默认值恒先于外层 11 分钟预算触发 —— v1.6.0 那次"调整为 11min"一天都没生效过(生产实证:单日 29 latency≈30 000 ms 499,横跨 4 厂商 5 模型,受害最重的是默认主循环模型)。加性导出 `CHAT_REQUEST_TIMEOUT_MS`;`chatStream` / `chatMessagesStream` 新增第 4 个可选实参 `onUpstreamActivity`,让被 `isSSECommentLine` 吞掉的保活注释行(以及 OpenAI 格式下零事件的 data 行)能抵达消费方的空闲看门狗。不传回调时行为逐字节不变。 |
1128
+ | 2.15.0 | 稳定版 | **sources 四态分类与零结果契约(2026-08-02)**。加性新增 `classifySourcesEvent`、`SourcesEventParseResult` 与稳定 issue code,区分非 sources、合法空结果、有效结果和结构损坏;未知额外字段继续兼容。既有 `parseSourcesEvent` 的返回形状、宽松解析和 `null` 条件保持不变。 |
1129
+ | 2.14.0 | 稳定版 | **托管模型 input modalities 开放值域(2026-08-02)**。snake_case/camelCase 归一规则对称,数据字段允许未来新增标签;查询 API 仍保留已知标签自动补全。现网 camelCase 路径行为不变。 |
1130
+ | 2.13.0 | 稳定版 | **邀请奖励窗口重置券(2026-08-01)**。加性新增窗口重置券总览与幂等核销 API,不改变既有 token、额度和会员调用。 |
1131
+ | 2.12.0 | 稳定版 | **5 小时窗口软限额(2026-07-11)**。加性透传 `windowOverridable`、继续开关与结构化状态;老网关缺字段时按硬等待处理。 |
1132
+ | 2.11.0 | 稳定版 | **窗口限额结构化承接(2026-07-09)**。加性新增 `WINDOW_LIMIT_EXCEEDED` 机器码、窗口种类/恢复时间及识别辅助函数,并修复扁平 `/chat` 错误消息解析。 |
1133
+ | 2.10.0 | 稳定版 | **多模态向量与重排序(2026-06-20)**。加性扩展 text/image/video 输入;文本调用保持兼容。 |
1134
+ | 2.9.0 | 稳定版 | **Embedding、Rerank 与模型全集模式(2026-06-20)**。新增托管向量/重排序端点和 `includeLocked` 选择器能力。 |
1135
+ | 2.8.0 | 稳定版 | **登录 302 重定向承接(2026-06-16)**。加性新增可选 `LoginOptions.successRedirectURL`;缺省行为不变。 |
1136
+ | 2.7.0 | 稳定版 | **远控管理面、BYOK 与 Chat Bridge CRUD(2026-06-11)**。加性补齐远控会话管理、密钥管理和第三方聊天平台接入面。 |
1137
+ | 2.6.0 | 稳定版 | **会员订阅查询 + 一批后端契约类型修正 + WS 一次性 ticket 鉴权(2026-06-04)**。**新增**:`subscription.getMembership()` / `getSubscriptionTier()` / `subscriptionPrecheck()`;`ManagedModel` 档位门控字段 `locked`/`freeTier`/`minPlanTier`/`chatRuntimeSupported`/`defaultToolIds`;auth `ScopeChatBridge`(+read/write/rotate) 与 `chatBridgeScopes()`。**破坏性类型修正**(此前形状与后端不符、运行时即为 undefined):`BalanceDetail` 对齐网关 `InternalBalanceResponse`(`userId`/`tokenRemaining`/`tokenTotal`/`callRemaining`/`callTotal`/`entitlements[]`);`Order` 拆为 `BuyResponse`/`OrderListItem`;`getOrderStatus`/`waitForPayment` 改用 `BuyResponse.paymentStatus`(修死循环);`PayPayload.payMethod`→`paymentMethod` + 枚举 `WECHAT_NATIVE`/`ALIPAY_PRECREATE`/`BANK_TRANSFER` + `deviceId`/`clientRequestId`;`TokenPackage` 对齐 `toProductView`;`WalletStats`/`Transaction` `amount` string→number;consume-records 分页(`records`/`total`/`page`/`pageSize`);`EntitlementItem.createdAt` 改可选 + `activatedAt`;`ConsumeRecord` 补缓存字段;notifications WebSocket 用一次性 `stream-ticket` 取代 URL `?token=` JWT(修复 WS 鉴权 + 杜绝 JWT 泄露)。**废弃**:`listUserSubscriptions`(改用 `getMembership`)/ `ModelCoefficient`·`listCoefficients`(系数退役恒空)/ `ManagedModel.pricePerMTok`·`isDefault`(公开端点不返回);notifications `registerDevice`/`unregisterDevice`/`list`+`updateNotificationPreference` 标 `@experimental`(网关无端点)。详见 CHANGELOG。 |
1076
1138
  | 2.5.1 | 稳定版 | **模型 adapter 格式一致性护栏(2026-05-31)**。`getAdapterForModel` 路由加固:`preferred_format` 仅当被 `supported_formats` 收录(或 `supported_formats` 未声明)才采信,防止上游元数据漂移把 SDK 路由到模型不支持的格式端点(撞 `/anthropic` 4xx)。`supported_formats` 未声明(旧上游)时行为逐字节不变;新增 3 条 routing 用例。详见 CHANGELOG。 |
1077
1139
  | 2.5.0 | 稳定版 | **源码健康度审计根因修复(2026-05-31)**。修复一批真实运行时缺陷:`downloadArtifact()` 超限抛错(不再静默截断)/ 本地工具 `Promise.race` 硬超时 / OpenAI 流式 reasoning→tool_calls block index 修正 / 非法 `expires_at` 视为过期 + TokenStore 校验 / OAuth 链路走注入 `fetchImpl` / 空成功响应(204)不抛 parse error / `apiBaseURL`·`complianceBaseURL` 同级校验 / 非流式默认超时 / WS 重复 connect 关旧连接 / `FileTokenStore.save()` 真 fsync / chat 请求对象不被原地 mutate / Anthropic `extraBody` 不覆盖 SDK 管理字段 / `CompliancePollError` 携带最后状态。**公开类型/方法签名零移除、零改名**(新增导出 `normalizeOverrideBaseURL`·`DEFAULT_API_TIMEOUT_MS`)。casehall/finance/enterprise 路径经生产实证确认正确(同源代理直连 tk-dist)未改 + 新增 URL 组装回归测试。详见 CHANGELOG 与 `docs/audit/TS版SDK源码健康度与文档审计报告.md`。 |
1078
1140
  | 2.4.0 | 稳定版 | **`SkillStoreItem.skillMd?` 透出(additive minor,2026-05-30)**。修复下游经 SDK 拿不到技能 SKILL.md 正文:网关 `SkillStoreResponse` 早已返回 `skillMd`(`ToStoreResponse()` 已 map),但 SDK `SkillStoreItem` 漏声明。新增可选 `skillMd?: string`(Anthropic SKILL.md 正文,仅 Detail/resolve/非 minimal browse 携带;`SkillStoreListItem` minimal 刻意不含正文);`readme` 一并改为可选 `readme?`(匹配网关 `omitempty`)。零方法签名/运行时改动。下游 CrabCode 重锁 `@acosmi/sdk-ts@2.4.0` + `bun install --force` 生效;SKILL.md 为不可信用户内容,GUI 渲染须 sanitize + 展示 securityLevel/securityScore/certificationStatus。 |
@@ -1086,7 +1148,7 @@ npm run docs # 经 TypeDoc 生成 API 参考到 docs/api/
1086
1148
  | 1.8.1 | 稳定版 | **enterprise 企业席位域落地(商品化总规划 P6a)**。新增 `client.enterprise.*`:`listMyEnterprises` / `getEnterprise` / `inviteMember` / `listEnterpriseMembers` / `listOrgSubscriptions` / `listSeats` / `assignSeat` / `revokeSeat` / `getOrgConsumeReport`。OWNER/ADMIN 权限下席位月度变更 ≤ 3 次(超出返 41xxx 业务码);订阅 + 席位 + 用量报表三视图齐备。 |
1087
1149
  | 1.8.0 | 稳定版 | **casehall 法律案件咨询域落地(商品化总规划 P5 方案 B)**。新增 `client.casehall.*`:`listLawyers` / `getLawyer` / `submitCaseLead` / `listMyCaseLeads` / `getMyCases` / `bookConsultation` / `listMyConsultations` / `listMyLegalOrders` / `listLegalSKUs`。律师库公开端点(VERIFIED + ACTIVE,PII L3 已脱敏)+ 案件线索 + 咨询 + 5 LEGAL_SERVICE SKU;admin 板块 9 模块不在 SDK 边界。 |
1088
1150
  | 1.7.0 | 稳定版 | **subscription + pricing + products 三域落地(商品化总规划 P1-P4)**。`subscription`:`listPlans` / `listUserSubscriptions`(订阅档位 + 用户订阅)。`pricing`:`getPricingConfig` / `quoteCompliance`(公开业务参数 + csign 合规 SKU 报价)。`products`:`getProductBySlug` / `listProductsByFamily` / `listComplianceSkus` / `listPublicModels`(商品中心 productFamily / audience / billingMode 索引)。 |
1089
- | 1.6.0 | 稳定版 | `ChatRequest.endUserId` 业务侧终端用户稳定标识,跨 provider 通用语义;SDK 自动按 wire-format 注入(OpenAI 顶层 `user_id` / Anthropic `metadata.user_id`);不传时网关从认证身份 HMAC-SHA256 自动派生 32 字符 id。`validateEndUserId(s)` helper 校验 PII / 长度 / 字符集。SSE keep-alive + 11 分钟超时调优;网关侧命中三项隔离能力(内容安全 / KV-cache / 调度)。 |
1151
+ | 1.6.0 | 稳定版 | `ChatRequest.endUserId` 业务侧终端用户稳定标识,跨 provider 通用语义;SDK 自动按 wire-format 注入(OpenAI 顶层 `user_id` / Anthropic `metadata.user_id`);不传时网关从认证身份 HMAC-SHA256 自动派生 32 字符 id。`validateEndUserId(s)` helper 校验 PII / 长度 / 字符集。SSE keep-alive 注释行显式跳过;网关侧命中三项隔离能力(内容安全 / KV-cache / 调度)。**订正(2026-08-06)**:本行原写"11 分钟超时调优",实际该次改动只建了外层 `AbortController`、未下传给 `doJSONFullRaw`,内层 30 秒默认值始终生效 —— **该调优直到 2.16.0 才真正落地**。 |
1090
1152
  | 1.5.1 | 历史稳定版 | **Docs / examples / 源码注释全量复核与修订 — 无 API 变化**。修补 8 项漂移与遗漏:README API 总览补 25+ 漏列方法(Chat 内部方法、Auth 浏览器 Web OAuth 4 原语、Skills/Notifications/Entitlements/Packages 全量、WS `connect/disconnect/isConnected`);重写 §"手动 OAuth" 段对齐 `auth.ts` 真实签名;§"双格式红线" + 三个 chat 示例 `maxTokens` → snake_case `max_tokens`;错误表补 `ModelNotFoundError`;§Agent Runs 补 13 类 stream event 完整表;新增 §`sanitize` 命名空间小节;`docs/compliance.md` 6 处 `Since v1.6/.../1.10` 统一为 `v1.5.0 (originally planned as ...)`;手册 §7 scope 数 12 → 15 + 新增 S1-S6 rollup 段;`examples/compliance-evidence-timestamp.ts` 补 `ScopeComplianceReportsWrite`(v1.3.2 漂移生产 401 隐患);`examples/auth-oauth-flow.ts` + `examples/core-chat.ts` 注释对齐当前契约;`src/index.ts` + `src/browser.ts` + `src/auth/auth.ts` 注释从 Go-port 语义改为"TS 主实现 + Web OAuth 替代品"。`typecheck` / `lint` / `vitest`(214) / `build` / `test:pack` 全绿。 |
1091
1153
  | 1.5.0 | 稳定版 | 沉淀 `src/shared/` 跨域共享 DTO(`PageRequest`/`PageResult` 别名、`OperationId`/`OperationStatus`/`IdempotencyKeyHeader`、`RetryAdvice` 叠加层、`PrincipalRef`/`TenantRef`、`FeatureGateStatus`/`StepUpStatus`/`BillingPreflightResult`)。**同时全量 rollup compliance gateway S1-S6** 能力(原 1.6.0-1.11.0 roadmap,见 [CHANGELOG.md](./CHANGELOG.md)):S1 6 个分页列表、S2 capabilities + operations 投影、S3 TSA 只读视图、S4 envelope 收尾 + void、S5 合同模板全生命周期 + 2 新 scope(`compliance:contract_template:{read,write}`)、S6 用印执行分页(`listSealUses`)。当前 compliance scope 总数 **15** 个(`complianceScopes()` 返回)。纯增量;8 个平台控制面占位命名空间仍待后端契约就绪后落地。 |
1092
1154
  | 1.4.2 | 稳定版 | `src/` 从扁平 36 文件按业务域重组为 per-domain 目录;公共导出符号集合、`exports`、`dist/` 路径一字未变(纯内部重组)。新增 TypeDoc API 文档。 |
@@ -41,6 +41,57 @@ function newWebSearchTool(cfg) {
41
41
  }
42
42
  return st;
43
43
  }
44
+ function classifySourcesEvent(ev) {
45
+ let parsed;
46
+ try {
47
+ parsed = JSON.parse(ev.data);
48
+ } catch {
49
+ return ev.event === "sources" ? { kind: "malformed_sources", code: "invalid_json" } : { kind: "not_sources" };
50
+ }
51
+ const wrapper = typeof parsed === "object" && parsed !== null && !Array.isArray(parsed) ? parsed : null;
52
+ if (wrapper?.type !== "sources" && ev.event !== "sources") {
53
+ return { kind: "not_sources" };
54
+ }
55
+ if (!wrapper || !Object.prototype.hasOwnProperty.call(wrapper, "sources")) {
56
+ return { kind: "malformed_sources", code: "missing_sources" };
57
+ }
58
+ if (Object.prototype.hasOwnProperty.call(wrapper, "session_id") && wrapper.session_id !== void 0 && typeof wrapper.session_id !== "string") {
59
+ return { kind: "malformed_sources", code: "session_id_invalid" };
60
+ }
61
+ if (!Array.isArray(wrapper.sources)) {
62
+ return { kind: "malformed_sources", code: "sources_not_array" };
63
+ }
64
+ const sessionID = typeof wrapper.session_id === "string" ? wrapper.session_id : void 0;
65
+ if (wrapper.sources.length === 0) {
66
+ return {
67
+ kind: "empty_sources",
68
+ ...sessionID === void 0 ? {} : { session_id: sessionID }
69
+ };
70
+ }
71
+ for (const source of wrapper.sources) {
72
+ if (typeof source !== "object" || source === null || Array.isArray(source)) {
73
+ return { kind: "malformed_sources", code: "source_not_object" };
74
+ }
75
+ const item = source;
76
+ if (typeof item.title !== "string") {
77
+ return { kind: "malformed_sources", code: "source_title_invalid" };
78
+ }
79
+ if (typeof item.url !== "string") {
80
+ return { kind: "malformed_sources", code: "source_url_invalid" };
81
+ }
82
+ if (Object.prototype.hasOwnProperty.call(item, "snippet") && item.snippet !== void 0 && typeof item.snippet !== "string") {
83
+ return { kind: "malformed_sources", code: "source_snippet_invalid" };
84
+ }
85
+ }
86
+ return {
87
+ kind: "sources",
88
+ value: {
89
+ ...wrapper,
90
+ sources: wrapper.sources,
91
+ ...sessionID === void 0 ? {} : { session_id: sessionID }
92
+ }
93
+ };
94
+ }
44
95
  function parseSourcesEvent(ev) {
45
96
  let wrapper;
46
97
  try {
@@ -2237,6 +2288,13 @@ var ErrOAuthCORSBlocked = "oauth_cors_blocked";
2237
2288
  var ErrRefreshProxyFailed = "refresh_proxy_failed";
2238
2289
  var ErrTokenExpired = "token_expired";
2239
2290
  var CHAT_REQUEST_TIMEOUT_MS = 11 * 60 * 1e3;
2291
+ function notifyUpstreamActivity(cb) {
2292
+ if (!cb) return;
2293
+ try {
2294
+ cb();
2295
+ } catch {
2296
+ }
2297
+ }
2240
2298
  var DEFAULT_API_TIMEOUT_MS = 6e4;
2241
2299
  function newDeferred() {
2242
2300
  let resolve;
@@ -2950,7 +3008,13 @@ var Client = class _Client {
2950
3008
  try {
2951
3009
  const { body, adapter } = await this.buildChatRequest(modelID, r, ctl.signal);
2952
3010
  const endpoint = `/managed-models/${encodeURIComponent(modelID)}${adapter.endpointSuffix()}`;
2953
- const { result, headers } = await this.doJSONFullRaw("POST", endpoint, body, ctl.signal);
3011
+ const { result, headers } = await this.doJSONFullRaw(
3012
+ "POST",
3013
+ endpoint,
3014
+ body,
3015
+ ctl.signal,
3016
+ CHAT_REQUEST_TIMEOUT_MS
3017
+ );
2954
3018
  const resp = adapter.parseResponse(result);
2955
3019
  const v1 = headers.get("X-Token-Remaining");
2956
3020
  if (v1) {
@@ -3015,7 +3079,13 @@ var Client = class _Client {
3015
3079
  */
3016
3080
  async generateVideo(modelID, req, signal) {
3017
3081
  const endpoint = `/managed-models/${encodeURIComponent(modelID)}/videos/generations`;
3018
- const { result } = await this.doJSONFullRaw("POST", endpoint, req, signal);
3082
+ const { result } = await this.doJSONFullRaw(
3083
+ "POST",
3084
+ endpoint,
3085
+ req,
3086
+ signal,
3087
+ CHAT_REQUEST_TIMEOUT_MS
3088
+ );
3019
3089
  return this.unwrapAPIResponse(result);
3020
3090
  }
3021
3091
  /**
@@ -3084,7 +3154,8 @@ var Client = class _Client {
3084
3154
  "POST",
3085
3155
  `/managed-models/${encodeURIComponent(modelID)}/anthropic`,
3086
3156
  data,
3087
- ctl.signal
3157
+ ctl.signal,
3158
+ CHAT_REQUEST_TIMEOUT_MS
3088
3159
  );
3089
3160
  const rawStr = new TextDecoder().decode(result);
3090
3161
  try {
@@ -3118,7 +3189,13 @@ var Client = class _Client {
3118
3189
  const body = adapter.buildRequestBody(caps, r);
3119
3190
  const data = JSON.stringify(body);
3120
3191
  const endpoint = `/managed-models/${encodeURIComponent(modelID)}${adapter.endpointSuffix()}`;
3121
- const { result } = await this.doJSONFullRaw("POST", endpoint, data, ctl.signal);
3192
+ const { result } = await this.doJSONFullRaw(
3193
+ "POST",
3194
+ endpoint,
3195
+ data,
3196
+ ctl.signal,
3197
+ CHAT_REQUEST_TIMEOUT_MS
3198
+ );
3122
3199
  const { parseOpenAIResponseToAnthropic: parseOpenAIResponseToAnthropic2 } = await Promise.resolve().then(() => (init_openai(), openai_exports));
3123
3200
  return parseOpenAIResponseToAnthropic2(result);
3124
3201
  } finally {
@@ -3128,23 +3205,27 @@ var Client = class _Client {
3128
3205
  /**
3129
3206
  * 流式聊天 (SSE), 通过 async generator 返回事件
3130
3207
  * v0.5.0: 根据 adapter 路由端点
3208
+ *
3209
+ * @param onUpstreamActivity 见 {@link UpstreamActivityCallback}
3131
3210
  */
3132
- chatStream(modelID, req, signal) {
3211
+ chatStream(modelID, req, signal, onUpstreamActivity) {
3133
3212
  return {
3134
- [Symbol.asyncIterator]: () => this.chatStreamGen(modelID, req, signal, false)
3213
+ [Symbol.asyncIterator]: () => this.chatStreamGen(modelID, req, signal, false, onUpstreamActivity)
3135
3214
  };
3136
3215
  }
3137
3216
  /**
3138
3217
  * Anthropic 原生格式流式聊天 (SSE)
3139
3218
  * 调用 POST /managed-models/:id/anthropic, SSE 事件为 Anthropic 协议格式
3140
3219
  * 无 started/settled/failed 自定义事件, 无 data: [DONE], message_stop 为自然结束
3220
+ *
3221
+ * @param onUpstreamActivity 见 {@link UpstreamActivityCallback}
3141
3222
  */
3142
- chatMessagesStream(modelID, req, signal) {
3223
+ chatMessagesStream(modelID, req, signal, onUpstreamActivity) {
3143
3224
  return {
3144
- [Symbol.asyncIterator]: () => this.chatMessagesStreamGen(modelID, req, signal, false)
3225
+ [Symbol.asyncIterator]: () => this.chatMessagesStreamGen(modelID, req, signal, false, onUpstreamActivity)
3145
3226
  };
3146
3227
  }
3147
- async *chatStreamGen(modelID, req, signal, retried) {
3228
+ async *chatStreamGen(modelID, req, signal, retried, onUpstreamActivity) {
3148
3229
  const r = { ...req, stream: true };
3149
3230
  const { body, adapter } = await this.buildChatRequest(modelID, r, signal);
3150
3231
  const token = await this.ensureToken(signal);
@@ -3177,7 +3258,7 @@ var Client = class _Client {
3177
3258
  `stream: unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`
3178
3259
  );
3179
3260
  }
3180
- yield* this.chatStreamGen(modelID, req, signal, true);
3261
+ yield* this.chatStreamGen(modelID, req, signal, true, onUpstreamActivity);
3181
3262
  return;
3182
3263
  }
3183
3264
  if (!resp.ok) {
@@ -3193,6 +3274,7 @@ var Client = class _Client {
3193
3274
  }
3194
3275
  let currentEvent = "";
3195
3276
  for await (const line of iterSSELines(resp.body)) {
3277
+ notifyUpstreamActivity(onUpstreamActivity);
3196
3278
  if (isSSECommentLine(line)) continue;
3197
3279
  if (line.startsWith("event:")) {
3198
3280
  currentEvent = line.slice("event:".length).trim();
@@ -3213,7 +3295,7 @@ var Client = class _Client {
3213
3295
  }
3214
3296
  }
3215
3297
  }
3216
- async *chatMessagesStreamGen(modelID, req, signal, retried) {
3298
+ async *chatMessagesStreamGen(modelID, req, signal, retried, onUpstreamActivity) {
3217
3299
  const r = { ...req, stream: true };
3218
3300
  const { body, adapter } = await this.buildChatRequest(modelID, r, signal);
3219
3301
  const token = await this.ensureToken(signal);
@@ -3246,7 +3328,7 @@ var Client = class _Client {
3246
3328
  `messages stream: unauthorized and refresh failed: ${refreshErr instanceof Error ? refreshErr.message : String(refreshErr)}`
3247
3329
  );
3248
3330
  }
3249
- yield* this.chatMessagesStreamGen(modelID, req, signal, true);
3331
+ yield* this.chatMessagesStreamGen(modelID, req, signal, true, onUpstreamActivity);
3250
3332
  return;
3251
3333
  }
3252
3334
  if (!resp.ok) {
@@ -3259,6 +3341,7 @@ var Client = class _Client {
3259
3341
  if (adapter.format() === 1 /* OpenAI */) {
3260
3342
  const converter = newOpenAIStreamConverter();
3261
3343
  for await (const line of iterSSELines(resp.body)) {
3344
+ notifyUpstreamActivity(onUpstreamActivity);
3262
3345
  if (isSSECommentLine(line)) continue;
3263
3346
  if (line.startsWith("event:")) {
3264
3347
  line.slice("event:".length).trim();
@@ -3273,6 +3356,7 @@ var Client = class _Client {
3273
3356
  const blockTypeMap = /* @__PURE__ */ new Map();
3274
3357
  let currentEvent = "";
3275
3358
  for await (const line of iterSSELines(resp.body)) {
3359
+ notifyUpstreamActivity(onUpstreamActivity);
3276
3360
  if (isSSECommentLine(line)) continue;
3277
3361
  if (line.startsWith("event:")) {
3278
3362
  currentEvent = line.slice("event:".length).trim();
@@ -3405,7 +3489,19 @@ var Client = class _Client {
3405
3489
  ctl.dispose();
3406
3490
  }
3407
3491
  }
3408
- /** doJSONFull 的 raw bytes 变体 (chat 用, 不立即 JSON.parse) */
3492
+ /**
3493
+ * doJSONFull 的 raw bytes 变体 (chat 用, 不立即 JSON.parse)
3494
+ *
3495
+ * ⚠️ 契约 (2026-08-06): `timeoutMs` 的 30s 默认值只适用于**控制面**端点 (列目录 /
3496
+ * 查配额 / 取任务状态)。凡走**模型推理或生成**的端点 —— chat / anthropic /
3497
+ * embeddings / rerank / images / videos —— 一律必须显式传入 `CHAT_REQUEST_TIMEOUT_MS`,
3498
+ * 哪怕调用方已经用 `withRequestTimeout` 建了外层预算: 外层只约束 `signal`, 内层
3499
+ * 会**另建**一个 `timeoutMs` 计时器, 30s 恒先于任何更长的外层预算触发。
3500
+ *
3501
+ * 这不是假设 —— 2026-08-06 事故里 chat 路径正因漏传本参数而被恒定钉死在 30s,
3502
+ * 且上方 v1.6.0 的注释还声称它已是 11min。回归闸门见
3503
+ * `tests/chat-timeout-budget.test.ts`。
3504
+ */
3409
3505
  async doJSONFullRaw(method, path, body, signal, timeoutMs = 3e4) {
3410
3506
  return this.doJSONFullRawInternal(method, path, body, signal, false, timeoutMs);
3411
3507
  }
@@ -7066,6 +7162,15 @@ function sleep2(ms, signal) {
7066
7162
  }
7067
7163
 
7068
7164
  // src/support/bug-report.ts
7165
+ function unwrapBugReport(raw, op, isComplete) {
7166
+ if (raw && isComplete(raw)) return raw;
7167
+ const inner = raw?.data;
7168
+ if (inner && isComplete(inner)) return inner;
7169
+ const keys = raw && typeof raw === "object" ? Object.keys(raw) : [];
7170
+ throw new Error(
7171
+ `acosmi: ${op}: gateway accepted the request but the response is missing required fields (observed keys: ${keys.length > 0 ? keys.join(",") : "<none>"})`
7172
+ );
7173
+ }
7069
7174
  Client.prototype.submitBugReport = async function(reportData, signal) {
7070
7175
  if (reportData == null) {
7071
7176
  throw new Error("acosmi: reportData required");
@@ -7082,7 +7187,11 @@ Client.prototype.submitBugReport = async function(reportData, signal) {
7082
7187
  { content: contentStr },
7083
7188
  signal
7084
7189
  );
7085
- return result.data;
7190
+ return unwrapBugReport(
7191
+ result,
7192
+ "submitBugReport",
7193
+ (r) => typeof r.feedback_id === "string" && r.feedback_id.length > 0
7194
+ );
7086
7195
  };
7087
7196
  Client.prototype.getBugReport = async function(bugID, signal) {
7088
7197
  const trimmed = bugID.trim();
@@ -7095,7 +7204,7 @@ Client.prototype.getBugReport = async function(bugID, signal) {
7095
7204
  null,
7096
7205
  signal
7097
7206
  );
7098
- return resp.data;
7207
+ return unwrapBugReport(resp, "getBugReport", (r) => typeof r.id === "string");
7099
7208
  };
7100
7209
 
7101
7210
  // src/subscription/client.ts
@@ -7677,6 +7786,6 @@ function brandCredential(c) {
7677
7786
  return c;
7678
7787
  }
7679
7788
 
7680
- export { AGENT_RUN_META_TITLE, AGENT_RUN_META_WORKSPACE, ALL_INTEGRATION_STATUS, ALL_PLATFORMS, ALL_REGIONS, AgentRunStreamError, AgentRunsClient, AnthropicAdapter, AudienceEnum, BillingModeEnum, BucketClassCommercial, BucketClassGeneric, BusinessError, ChatBridgeClient, Client, ComplianceClient, CompliancePollError, CrabCodeByokClient, DEFAULT_API_TIMEOUT_MS, DEFAULT_GATEWAY_BASE_URL, LocalStorageTokenStore as DefaultBrowserTokenStore, DefaultRetryPolicy, ErrAuthDenied, ErrBillingCallbackCannotCommit, ErrBillingCommitRequiresLocalVerify, ErrBillingS2sForbidden, ErrBrowserOpen, ErrComplianceStepUpRequired, ErrDiscovery, ErrEnvelopeGateClosed, ErrOAuthCORSBlocked, ErrProviderNotConfigured, ErrProviderUnknownNoRetry, ErrRefreshProxyFailed, ErrRegistration, ErrSSLProxy, ErrSealApprovalContractHashMismatch, ErrSealApprovalExpired, ErrSealApprovalLocationMismatch, ErrSealApprovalNonceUsed, ErrSealApprovalNotApproved, ErrSealApprovalSealMismatch, ErrSealApprovalTransactorMismatch, ErrSealUseAlreadyConsumed, ErrStateMismatch, ErrTimeout, ErrTokenExchange, ErrTokenExpired, EventAuthURL, EventComplete, EventError, FileTokenStore, FilterStatusAdminBypass, FilterStatusDisabledByFlag, FilterStatusFallbackMissingUser, FilterStatusFallbackNoBuckets, FilterStatusFallbackTkdistError, FilterStatusFallbackTkdistSkew, FilterStatusInternalBypass, FilterStatusOK, FilterStatusUnknown, HTTPError, IdempotencyKeyHeader, InMemoryTokenStore, LocalStorageTokenStore, ModelNotFoundError, NetworkError, OAuthTokenEndpointError, OpenAIAdapter, OrderTerminalError, ProductFamilyEnum, ProviderFormat, RETRY_ADVICE_REASONS, RateLimitError, RegionScopeEnum, ScopeAI, ScopeAccount, ScopeChatBridge, ScopeChatBridgeRead, ScopeChatBridgeRotate, ScopeChatBridgeWrite, ScopeComplianceContractSigningRead, ScopeComplianceContractSigningWrite, ScopeComplianceContractTemplateRead, ScopeComplianceContractTemplateWrite, ScopeComplianceEvidenceRead, ScopeComplianceEvidenceWrite, ScopeComplianceReportsPublish, ScopeComplianceReportsRead, ScopeComplianceReportsWrite, ScopeComplianceSealApprovalApprove, ScopeComplianceSealApprovalRequest, ScopeComplianceSealManage, ScopeComplianceSealUseExecute, ScopeComplianceTimestampIssue, ScopeComplianceTimestampVerify, ScopeEntitlements, ScopeModels, ScopeModelsChat, ScopeProfile, ScopeRemoteControl, ScopeRemoteControlAgentRun, ScopeRemoteControlPermissionResponse, ScopeRemoteControlSessionControl, ScopeSkillStore, ScopeSkills, ScopeTokenPackages, ScopeTools, ScopeToolsExecute, ScopeWallet, ScopeWalletReadonly, ServerToolTypeWebSearch, StreamError, ThinkingHigh, ThinkingHighMinMaxTokens, ThinkingMax, ThinkingMaxFallbackMaxTokens, ThinkingOff, allScopes, anthropicResponseTextContent, anthropicResponseThinkingContent, anthropicResponseToolUseBlocks, apiResponseBusinessError, apiResponseGetMessage, asCredentialRef, authorize, bucketInfoIsCommercial, bucketRowIsCommercial, buildBetas, chatBridgeScopes, classifyComplianceError, commerceScopes, completeWebAuthorizationRequest, complianceErrorToRetryAdvice, complianceScopes, computeBackoff, createWebAuthorizationRequest, defaultRetryable, defaultSafeToRetry, discover, discoverWebOAuthMetadata, discoverWithProfile, effectivePolicy, exchangeCode, extractAnthropicBlockMeta, fileLockDefaults, findDesktopVisualUnderstandingModel, findFirstModelByInputModality, generateState, getAdapter, getAdapterForModel, getWindowLimitStreamDetails, isBillingConfirmable, isChannelInboundEvent, isComplianceBusinessError, isComplianceTerminalError, isContinuableWindowLimitError, isIntegrationStatus, isInvalidGrantError, isPlatform, isRegion, isSSECommentLine, isSSLError, isTerminalRemoteEvent, isValidTokenSet, isWindowLimitError, isWindowLimitStreamError, maxEndUserIdLength, modelScopes, modelSupportsImageInput, modelSupportsInputModality, newFileTokenStore, newThinkingConfig, newTokenSet, newWebSearchTool, normalizeGatewayBaseURL, normalizeOverrideBaseURL, parseNotificationEvent, parseRemoteControlEvent, parseSettlement, parseSourcesEvent, refreshToken, register, registerWebOAuthClient, remoteControlScopes, retryReasonForComplianceKey, retryReasonForOAuthError, revokeToken, sanitize_exports as sanitize, skillScopes, tokenSetIsExpired, uniqueMerge, validateEndUserId };
7789
+ export { AGENT_RUN_META_TITLE, AGENT_RUN_META_WORKSPACE, ALL_INTEGRATION_STATUS, ALL_PLATFORMS, ALL_REGIONS, AgentRunStreamError, AgentRunsClient, AnthropicAdapter, AudienceEnum, BillingModeEnum, BucketClassCommercial, BucketClassGeneric, BusinessError, CHAT_REQUEST_TIMEOUT_MS, ChatBridgeClient, Client, ComplianceClient, CompliancePollError, CrabCodeByokClient, DEFAULT_API_TIMEOUT_MS, DEFAULT_GATEWAY_BASE_URL, LocalStorageTokenStore as DefaultBrowserTokenStore, DefaultRetryPolicy, ErrAuthDenied, ErrBillingCallbackCannotCommit, ErrBillingCommitRequiresLocalVerify, ErrBillingS2sForbidden, ErrBrowserOpen, ErrComplianceStepUpRequired, ErrDiscovery, ErrEnvelopeGateClosed, ErrOAuthCORSBlocked, ErrProviderNotConfigured, ErrProviderUnknownNoRetry, ErrRefreshProxyFailed, ErrRegistration, ErrSSLProxy, ErrSealApprovalContractHashMismatch, ErrSealApprovalExpired, ErrSealApprovalLocationMismatch, ErrSealApprovalNonceUsed, ErrSealApprovalNotApproved, ErrSealApprovalSealMismatch, ErrSealApprovalTransactorMismatch, ErrSealUseAlreadyConsumed, ErrStateMismatch, ErrTimeout, ErrTokenExchange, ErrTokenExpired, EventAuthURL, EventComplete, EventError, FileTokenStore, FilterStatusAdminBypass, FilterStatusDisabledByFlag, FilterStatusFallbackMissingUser, FilterStatusFallbackNoBuckets, FilterStatusFallbackTkdistError, FilterStatusFallbackTkdistSkew, FilterStatusInternalBypass, FilterStatusOK, FilterStatusUnknown, HTTPError, IdempotencyKeyHeader, InMemoryTokenStore, LocalStorageTokenStore, ModelNotFoundError, NetworkError, OAuthTokenEndpointError, OpenAIAdapter, OrderTerminalError, ProductFamilyEnum, ProviderFormat, RETRY_ADVICE_REASONS, RateLimitError, RegionScopeEnum, ScopeAI, ScopeAccount, ScopeChatBridge, ScopeChatBridgeRead, ScopeChatBridgeRotate, ScopeChatBridgeWrite, ScopeComplianceContractSigningRead, ScopeComplianceContractSigningWrite, ScopeComplianceContractTemplateRead, ScopeComplianceContractTemplateWrite, ScopeComplianceEvidenceRead, ScopeComplianceEvidenceWrite, ScopeComplianceReportsPublish, ScopeComplianceReportsRead, ScopeComplianceReportsWrite, ScopeComplianceSealApprovalApprove, ScopeComplianceSealApprovalRequest, ScopeComplianceSealManage, ScopeComplianceSealUseExecute, ScopeComplianceTimestampIssue, ScopeComplianceTimestampVerify, ScopeEntitlements, ScopeModels, ScopeModelsChat, ScopeProfile, ScopeRemoteControl, ScopeRemoteControlAgentRun, ScopeRemoteControlPermissionResponse, ScopeRemoteControlSessionControl, ScopeSkillStore, ScopeSkills, ScopeTokenPackages, ScopeTools, ScopeToolsExecute, ScopeWallet, ScopeWalletReadonly, ServerToolTypeWebSearch, StreamError, ThinkingHigh, ThinkingHighMinMaxTokens, ThinkingMax, ThinkingMaxFallbackMaxTokens, ThinkingOff, allScopes, anthropicResponseTextContent, anthropicResponseThinkingContent, anthropicResponseToolUseBlocks, apiResponseBusinessError, apiResponseGetMessage, asCredentialRef, authorize, bucketInfoIsCommercial, bucketRowIsCommercial, buildBetas, chatBridgeScopes, classifyComplianceError, classifySourcesEvent, commerceScopes, completeWebAuthorizationRequest, complianceErrorToRetryAdvice, complianceScopes, computeBackoff, createWebAuthorizationRequest, defaultRetryable, defaultSafeToRetry, discover, discoverWebOAuthMetadata, discoverWithProfile, effectivePolicy, exchangeCode, extractAnthropicBlockMeta, fileLockDefaults, findDesktopVisualUnderstandingModel, findFirstModelByInputModality, generateState, getAdapter, getAdapterForModel, getWindowLimitStreamDetails, isBillingConfirmable, isChannelInboundEvent, isComplianceBusinessError, isComplianceTerminalError, isContinuableWindowLimitError, isIntegrationStatus, isInvalidGrantError, isPlatform, isRegion, isSSECommentLine, isSSLError, isTerminalRemoteEvent, isValidTokenSet, isWindowLimitError, isWindowLimitStreamError, maxEndUserIdLength, modelScopes, modelSupportsImageInput, modelSupportsInputModality, newFileTokenStore, newThinkingConfig, newTokenSet, newWebSearchTool, normalizeGatewayBaseURL, normalizeOverrideBaseURL, parseNotificationEvent, parseRemoteControlEvent, parseSettlement, parseSourcesEvent, refreshToken, register, registerWebOAuthClient, remoteControlScopes, retryReasonForComplianceKey, retryReasonForOAuthError, revokeToken, sanitize_exports as sanitize, skillScopes, tokenSetIsExpired, uniqueMerge, validateEndUserId };
7681
7790
  //# sourceMappingURL=index.mjs.map
7682
7791
  //# sourceMappingURL=index.mjs.map